Как запустить команду 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
Другие вопросы по тегам