Как я могу выполнить серию команд в подоболочке bash как другой пользователь, использующий sudo? - PullRequest
37 голосов
/ 08 августа 2010

Я пишу bash-скрипт, который должен выполнять несколько команд sudo. Я могу сделать это:

( whoami ; whoami )

но я не могу этого сделать:

sudo ( whoami ; whoami )

Как мне решить эту проблему?

Ответы [ 5 ]

59 голосов
/ 08 августа 2010

Запустите оболочку внутри sudo: sudo bash -c 'whoami; whoami'

Вы можете использовать любой символ, кроме ', внутри одинарных кавычек. Если вы действительно хотите, чтобы в этой команде была одинарная кавычка, используйте '\'' (что технически: конец литерала одинарных кавычек, литерал ' символа, начало литерала одинарных кавычек; но по сути это способ вставить одиночную кавычку кавычка в литеральной строке в одинарных кавычках).

53 голосов
/ 08 августа 2010

Вы можете передавать команды как стандартный ввод в sudo'ed bash с помощью здесь документа :

sudo bash <<"EOF"
whoami
id
EOF

Таким образом, нет необходимости возиться с правильным цитированием, особенно если у вас несколько уровней, например ::10000

sudo bash <<"EOF"
whoami
echo $USER ~
sudo -u apache bash <<"DOF"
whoami
echo $USER ~
DOF
EOF

Производит:

root
root /root
apache
apache /usr/share/httpd

(Обратите внимание, что вы не можете сделать отступ для внутреннего терминатора - он должен быть один на своей строке. Если вы хотите использовать отступ в документе здесь, вы можете использовать <<- вместо <<, но тогда вы должен иметь отступ с табуляцией, а не с пробелами.)

3 голосов
/ 08 мая 2013

например попробуйте это, я проверял:

sudo bash -c "cd /;ls;ls|grep o"

В этом примере вы сначала изменяете dir на / root, следующий корневой каталог списка и, наконец, для фильтра корневого каталога только каталоги, имеющие имя с буквой 'o'.

Но я считаю, что лучше написать сценарий, который делает все, что вам нужно, и дает код выхода для всех сложных действий. Затем вы можете использовать сценарий sudo вместо группы отдельных команд, как в примере выше.

0 голосов
/ 09 августа 2010

sudo запрашивает ваш пароль только в первый раз. Ответ по passwd действителен в течение 5 минут по умолчанию. Вы можете изменить это значение как this сказано.вашего скрипта, тогда вы можете использовать sudo через.изменение значений по умолчанию: значение user_name timestamp_timeout на -1 может быть дырой в безопасности вашей системы.

0 голосов
/ 08 августа 2010

Скобки означают, что команда выполняется в новом bash. Она выполняется с интервалом в точку с запятой. Просто используйте приведенный ниже код.

(sudo whoami;sudo whoami)

BYW: пробел не требуется при использовании'()'.

...