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

51

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

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

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

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

    
задан user251948 24.02.2014 в 23:27
источник

6 ответов

72

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

sudo myscript.sh

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

sudo -u username command 

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

    
ответ дан terdon 25.02.2014 в 12:17
28

Вы можете изменить файл sudoers .

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

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

username ALL=(ALL) NOPASSWD: /path/to/script
    
ответ дан Klaus-Dieter Warzecha 24.02.2014 в 23:46
10

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

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
    
ответ дан Jibbers 06.02.2015 в 15:48
3

Этот ответ похож на ответ terdon . Поскольку я также предложил бы запустить основной скрипт с 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 run with root would be invoked
# with: sudo -u $real_user
# So they will be ran 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
    
ответ дан Dan 30.10.2017 в 14:21
3
#!/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
    
ответ дан Sanyam Jain 06.12.2015 в 08:44
0

Вы можете попробовать добавить пользователя, который запускает скрипт в файл 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
    
ответ дан evinhas 19.01.2017 в 16:10