Я пишу сценарий bash, который должен выполнять несколько команд sudo. Я могу сделать это:
( whoami ; whoami )
, но я не могу сделать это:
sudo ( whoami ; whoami )
Как мне решить эту проблему?
Запустить оболочку внутри sudo
:
sudo bash -c 'whoami; whoami '
Вы можете использовать любой символ, кроме самого '
, внутри одинарных кавычек. Если вы действительно хотите, чтобы в этой команде была одинарная кавычка, используйте '\' '
(технически это: конечный литерал в одинарных кавычках, литерал '
, начальный литерал в одинарных кавычках ; но по сути это способ вставить одинарную кавычку в одинарную буквальную строку).
Вы можете передавать команды как стандартный ввод в sudo'ed bash с помощью here document:
sudo bash <<"EOF"
whoami
id
EOF
Таким образом, нет необходимости возиться с правильным цитированием, особенно если у вас несколько уровней, например:
sudo bash <<"EOF"
whoami
echo $USER ~
sudo -u apache bash <<"DOF"
whoami
echo $USER ~
DOF
EOF
Produces:
root
root /root
apache
apache /usr/share/httpd
(Обратите внимание, что вы не можете отступать внутренний терминатор - он должен быть один на своей строке. Если вы хотите использовать отступ в данном документе, вы можете использовать <<-
вместо <<
, но тогда вы должны делать отступ с помощью табуляции, а не пробелов)
Скобки означают, что команда выполняется в новом bash.Он выполняет команду с интервалом в точку с запятой.Просто используйте код ниже вместо этого.
(sudo whoami;sudo whoami)
BYW: пробел не нужен при использовании '()'.
sudo запрашивает ваш пароль только в первый раз. По умолчанию полученный пароль действителен в течение 5 минут. Вы можете изменить это значение, как указано в this . Так что просто беспокойтесь о приглашении passwd в начале вашего скрипта, то вы можете использовать sudo . изменение значения по умолчанию: user_name timestamp_timeout на -1 может быть дырой в безопасности вашей системы.