Ответы:
Проблема sudo -s
без каких-либо аргументов откроет интерактивную оболочку для root.
Если вы просто хотите запустить одну команду с помощью sudo -s
, вы можете просто сделать:
sudo -s command
Например :
$ sudo -s whoami
root
Или вы можете использовать здесь строки:
$ sudo -s <<<'whoami'
root
Если у вас есть несколько команд, вы можете использовать здесь doc:
$ sudo -s <<'EOF'
> whoami
> hostname
> EOF
root
something--
Другим способом было бы передать полную команду (и) bash sudo
:
#!/bin/bash
sudo bash -c 'command1; command2; command3;'
Тем не менее, лучше всего было бы запустить скрипт с sudo
вместо этого. Это не очень хорошая идея, чтобы иметь sudo
внутри сценария. Гораздо лучше запустить весь скрипт с правами суперпользователя ( sudo script.sh
). При необходимости вы можете использовать sudo
для удаления привилегий для определенных команд. Например:
#!/usr/bin/env bash
whoami
echo $HOME
sudo -u terdon whoami ## drop privileges for specific command.
Запуск вышеуказанного скрипта возвращает:
$ sudo ~/scripts/a.sh
root
/root
terdon
Bourne оболочка имеет -c
флаг , который вы можете использовать , чтобы передать произвольный сценарий в оболочку, так что вы можете написать что - то вроде
sudo sh -c 'something'
Это, однако, полезно только для самых простых команд, потому что это очень громоздко, чтобы правильно процитировать сценарий, и неудобство еще больше, если вы отправляете команду на удаленный сервер через ssh, потому что сценарий аргумента будет проанализирован дважды, один раз на стороне отправка сценария и один раз на стороне запуска сценария.
Если something
это сложный сценарий или его необходимо передать через строку ssh , то обычной практикой является написание функции prepare_something_script
, задача которой - написать сценарий «что-то» в stdout . В своей простейшей форме эта функция может использовать здесь-документ для генерации своего вывода:
prepare_something_script()
{
cat <<EOF
something
EOF
}
Сценарий, созданный командой, prepare_something_script
может быть выполнен локально с привилегиями, предоставленными sudo следующим образом:
prepare_something_script | sudo sh
В сценарии, где скрипт должен выполняться удаленно с привилегиями, предоставленными sudo, обычно кодируют скрипт в base 64, чтобы избежать перенаправления стандартного ввода ssh , например так:
something64=$(prepare_something_script | base64)
ssh usesr@remote-host "echo ${something64} | base64 --decode | sudo sh"
Если вы используете этот код в функции, не забудьте пометить переменную something64 как локальную . Некоторые реализации base64 предлагают -d
флаг для декодирования, который менее хорошо поддерживается, чем подробный --decode
вариант. В некоторых реализациях требуется добавить a -w 0
в команду кодирования, чтобы избежать ложных разрывов строк.
sudo -s
если уroot
пользователя есть (довольно плохая) идея сменить оболочку. Это должно быть то,sudo sh
что явно указывает, какая оболочка будет использоваться.