Bash: Выполнение Su -C Blays $ @

Восстановить нечего; mkfs.ext4 выполняет TRIM по умолчанию, если это явно не запрещено с помощью параметра nodiscard .

               nodiscard
                      Do not attempt to discard blocks at mkfs time.

Попробуйте на нем photorec , если ничего не найдено (и не было задействовано шифрование), то ничего не поделаешь. Данные мертвы и ушли.

3
04.11.2018, 20:14
3 ответа

Ваша проблема заключается в кавычках, которые вы используете. Вам нужно использовать двойные кавычки, чтобы переменные внутри $@могли быть расширены, иначе они останутся литералами и никогда не будут расширены.

Вот пример

$ cat runme.bash
#!/bin/bash

echo "run with double quotes"
su -c "echo $@" user1

echo "run with single quotes"
su -c 'echo $@' user1

$./runme.bash "a b c"
run with double quotes
a b c
run with single quotes

$

Вы также должны передать список аргументов в виде списка в кавычках, иначе команда su -c...запутается и начнет анализировать 2-й аргумент как пользователя, которого вы хотите suот имени.

Другой пример

$./runme.bash a b c
run with double quotes
su: user b does not exist
run with single quotes

$

Совет по отладке

Если вы хотите увидеть, что на самом деле делает скрипт, вы можете запустить его, установив переключатель -xв положение bash.

голые аргументы
$ bash -x./runme.bash a b c
+ echo 'run with double quotes'
run with double quotes
+ su -c 'echo a' b c user1
su: user b does not exist
+ echo 'run with single quotes'
run with single quotes
+ su -c 'echo $@' user1

$
цитируемые аргументы
$ bash -x./runme.bash "a b c"
+ echo 'run with double quotes'
run with double quotes
+ su -c 'echo a b c' user1
a b c
+ echo 'run with single quotes'
run with single quotes
+ su -c 'echo $@' user1

$
3
27.01.2020, 21:15

Вы можете рассмотреть возможность передачи позиционных параметров оболочки команде suв качестве аргументов, а не полагаться на их правильное раскрытие в строке аргументов -c.

Например:

#!/bin/sh

su testuser -c 'for arg; do echo "$0 ($(whoami)): $arg"; done' -- su "$@"

, затем

$./suscript foo "bar baz"
Password: 
su (testuser): foo
su (testuser): bar baz
4
27.01.2020, 21:15

Инкапсуляция команды внутри блока документации здесь -может вам помочь.

#!/bin/sh

su testuser -s /bin/sh <<EOF
 add_container_host.py "$@"
EOF

Вы также можете попробовать, как показано ниже

su testuser -c 'add_container_host.py "$@"' -- argv0 "$@"

Помимо этого su -exec также является хорошей альтернативой.

-1
27.01.2020, 21:15

Теги

Похожие вопросы