Как запустить команду 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
Как я могу запустить это внутри скрипта?
Есть также несколько других команд, но эта доставляет проблемы.
7 ответов
Это редко хорошая идея иметь sudo
внутри скриптов. Вместо этого удалите sudo
из скрипта и запустить сам скрипт с sudo
:
sudo myscript.sh
Таким образом, все команды в скрипте будут выполняться с правами суперпользователя, и вам нужно будет указать пароль только один раз при запуске скрипта. Если вам нужна определенная команда в скрипте для запуска без sudo
привилегии, вы можете запустить его как обычный пользователь с (спасибо Ли Райан):
sudo -u username command
Пробел не имеет значения, он не должен ни на что влиять, всегда есть пробел между командой и ее аргументами.
Вы могли бы изменить sudoers
файл.
Бежать sudo visudo
,
Добавьте запись для вашего имени пользователя и сценария, который вы хотели бы запустить без запроса пароля.
username ALL=(ALL) NOPASSWD: /path/to/script
Вы можете попробовать что-то вроде:
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
Этот ответ похож на ответ Тердона. Как я бы также предложил запустить основной скрипт с sudo
так что вы можете запускать команды, не спрашивая у пользователя пароль.
Однако в случае, если вы хотите выполнить некоторые команды не как пользователь root или конкретный системный пользователь, а как реальный пользователь, который выполнил команду с sudo
Вы можете проверить на $SUDO_USER
переменная, чтобы выяснить первоначального пользователя.
Это пример сценария того, как вы могли бы достичь этого:
#!/bin/bash
# ref: https://Ask-ubuntu.ru/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
На самом деле есть гораздо более простой способ сделать это. Для переносимости это моя реализация, но вы можете свободно манипулировать ею в соответствии с вашими потребностями.
Введите свой пароль 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
Но если кто-то еще отслеживает, что работает на узле; имеет доступ к созданным им журналам; или просто просматривает ваш случайный случай при запуске теста, что может поставить под угрозу безопасность.
Это также работает с запущенными командами / сценариями, для продолжения которых требуется yes:
echo $PW | yes | ./install.sh
Эхо является ответом на приглашение, так что вы можете использовать все, что вам нужно, там, если вы запускаете другие сценарии, у которых есть запросы на выполнение, в последовательном порядке. Убедитесь, что вы знаете этот порядок, иначе могут произойти плохие вещи.
#!/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
Вы можете попытаться добавить пользователя, который запускает скрипт, в файл 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