Відповіді:
Проблема 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
всередині сценарію. Набагато краще запустити весь сценарій з привілеями root ( 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 , прийнято кодувати скрипт у базі 64, щоб уникнути перенаправлення стандартного вводу ssh , як це:
something64=$(prepare_something_script | base64)
ssh usesr@remote-host "echo ${something64} | base64 --decode | sudo sh"
Якщо ви використовуєте цей код у функції, не забудьте позначити змінну something64 як локальну . Деякі реалізації base64 пропонують -d
прапор для розшифровки, який менш добре підтримується, ніж вербологічний --decode
варіант. Деякі реалізації вимагають додати -w 0
до команди кодування, щоб уникнути помилкових розривів рядків.
sudo -s
лише на випадок, якщо уroot
користувача була (досить погана) ідея змінити свою оболонку. Це дійсно повинно бутиsudo sh
чітко зазначено, яку оболонку потрібно використовувати.