Как запустить команду sudo внутри скрипта?

Чтобы сделать патч вручную, я должен набрать эту команду

sudo ./playback_delete_data_patch.sh 09_delete_old_data_p.sql  

Перед 09: есть пробел:

sudo ./playback_delete_data_patch.sh [space] 09_delete_old_data_p.sql

Как я могу запустить это внутри скрипта?

Есть также несколько других команд, но эта доставляет проблемы.

126
задан 5 October 2017 в 19:54

7 ответов

Редко бывает хорошей идеей иметь внутри скриптов sudo. Вместо этого удалите sudo из скрипта и запустите сам скрипт с помощью sudo:

sudo myscript.sh

Таким образом, все команды внутри скрипта будут выполняться с привилегиями root, и вам нужно будет дать пароль только один раз при запуске скрипта. Если вам нужна конкретная команда внутри скрипта, чтобы быть запущенным без sudo привилегий, вы можете запустить его как обычный пользователь с (спасибо Lie Ryan):

sudo -u username command 

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

136
ответ дан 5 October 2017 в 19:54

Вы можете модифицировать файл sudoers.

Запустите sudo visudo.

Добавьте запись для вашего имени пользователя и скрипта, который вы хотели бы запустить без запроса пароля.

username ALL=(ALL) NOPASSWD: /path/to/script
49
ответ дан 5 October 2017 в 19:54

Вы можете попробовать что-то вроде:

echo "PASSWORD" | sudo -S ./playback_delete_data_patch.sh 09_delete_old_data_p.sql

Это не самый безопасный вариант, поскольку вы пишете пароль sudoer в виде обычного текста. Чтобы сделать его немного более безопасным, вы можете создать переменную и прочитать пароль sudo в переменной, а затем вы можете выполнить команду как:

echo $PASSWORD | sudo -S ./playback_delete_data_patch.sh 09_delete_old_data_p.sql

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

sudo ./myscript
27
ответ дан 5 October 2017 в 19:54
#!/bin/bash
# this declares that current user is a sudoer
sudo tee /etc/sudoers.d/$USER <<END
END

# write the content of your script here
sudo npm install hexo-cli -g
mkdir Untitled
sudo apt-get install python

# then to remove the sudo access from the current user
sudo /bin/rm /etc/sudoers.d/$USER
sudo -k
6
ответ дан 5 October 2017 в 19:54

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

Однаков случае, если вы хотите отказаться от привилегий root для некоторых команд и запускать их от имени фактического пользователя, который вызвал команду с sudo , вы можете проверить переменную $ SUDO_USER , чтобы выяснить исходный пользователь.

Это пример сценария того, как вы могли бы этого добиться:

#!/bin/bash

# ref: https://askubuntu.com/a/30157/8698
if ! [ $(id -u) = 0 ]; then
   echo "The script need to be run as root." >&2
   exit 1
fi

if [ $SUDO_USER ]; then
    real_user=$SUDO_USER
else
    real_user=$(whoami)
fi

# Commands that you don't want running as root would be invoked
# with: sudo -u $real_user
# So they will be run as the user who invoked the sudo command
# Keep in mind if the user is using a root shell (they're logged in as root),
# then $real_user is actually root
# sudo -u $real_user non-root-command

# Commands that need to be ran with root would be invoked without sudo
# root-command
16
ответ дан 5 October 2017 в 19:54

На самом деле есть гораздо более простой способ сделать это. Для переносимости это моя реализация, но не стесняйтесь манипулировать ею в соответствии с вашими потребностями.

Введите свой пароль sudo в качестве параметра при запуске сценария, зафиксируйте его и повторите его с каждой командой, которая будет запрашивать пароль sudo.

#!/bin/bash

PW=$1
echo $PW | ./playback_delete_data_patch.sh 09_delete_old_data_p.sql  
./command_wo_sudo.sh <param>
echo $PW | ./other_command_requires_sudo.sh <param>

Вы можете добавить приглашение и захват после запуска сценария следующим образом:

echo "enter the sudo password, please"
read PW

Но если кто-то другой отслеживает, что выполняется на узле; имеет доступ к созданным им журналам; или просто случайным образом просматривает ваше должно, когда вы запускаете тест, который может поставить под угрозу безопасность.

Это также работает с запущенными командами / скриптами, для которых требуется да для продолжения:

echo $PW | yes | ./install.sh

Эхо - это ответ на приглашение, поэтому вы можете использовать все, что вам нужно, если вы запускаете другие скрипты, которые имеют подсказки о ходе выполнения, в последовательном порядке. Убедитесь, что вы знаете этот приказ, иначе могут случиться неприятности.

7
ответ дан 5 October 2017 в 19:54

Вы можете попробовать добавить пользователя, который запускает сценарий, в файл sudoers:

#give permissions to the file
sudo chmod 700 /etc/sudoers.d/useradm

sudo visudo /etc/sudoers.d/useradm

#add the following text, changing "user" but your desired user
user ALL=(ALL)NOPASSWD:ALL

#return the right permissions to the file
sudo chmod 440 /etc/sudoers.d/useradm
0
ответ дан 5 October 2017 в 19:54

Другие вопросы по тегам:

Похожие вопросы: