Я пытаюсь сделать такой скрипт:
#!/bin/bash
sudo -s
something...
Когда я ее выполняю, я получаю новую оболочку, но something
она запускается только при выходе из созданной оболочки sudo -s
, а не внутри нее.
Любая помощь?
shell-script
sudo
Matteo
источник
источник
sudo -s
если уroot
пользователя есть (довольно плохая) идея сменить оболочку. Это должно быть то,sudo sh
что явно указывает, какая оболочка будет использоваться.Другим способом было бы передать полную команду (и) bash
sudo
:Тем не менее, лучше всего было бы запустить скрипт с
sudo
вместо этого. Это не очень хорошая идея, чтобы иметьsudo
внутри сценария. Гораздо лучше запустить весь скрипт с правами суперпользователя (sudo script.sh
). При необходимости вы можете использоватьsudo
для удаления привилегий для определенных команд. Например:Запуск вышеуказанного скрипта возвращает:
источник
Bourne оболочка имеет
-c
флаг , который вы можете использовать , чтобы передать произвольный сценарий в оболочку, так что вы можете написать что - то вродеЭто, однако, полезно только для самых простых команд, потому что это очень громоздко, чтобы правильно процитировать сценарий, и неудобство еще больше, если вы отправляете команду на удаленный сервер через ssh, потому что сценарий аргумента будет проанализирован дважды, один раз на стороне отправка сценария и один раз на стороне запуска сценария.
Если
something
это сложный сценарий или его необходимо передать через строку ssh , то обычной практикой является написание функцииprepare_something_script
, задача которой - написать сценарий «что-то» в stdout . В своей простейшей форме эта функция может использовать здесь-документ для генерации своего вывода:Сценарий, созданный командой,
prepare_something_script
может быть выполнен локально с привилегиями, предоставленными sudo следующим образом:В сценарии, где скрипт должен выполняться удаленно с привилегиями, предоставленными sudo, обычно кодируют скрипт в base 64, чтобы избежать перенаправления стандартного ввода ssh , например так:
Если вы используете этот код в функции, не забудьте пометить переменную something64 как локальную . Некоторые реализации base64 предлагают
-d
флаг для декодирования, который менее хорошо поддерживается, чем подробный--decode
вариант. В некоторых реализациях требуется добавить a-w 0
в команду кодирования, чтобы избежать ложных разрывов строк.источник
Вам нужно добавить команду перед sudo -s, а не в следующей строке.
источник