Переключение на пользователя root внутри сценария оболочки
У меня есть сценарий оболочки, которому нужна учетная запись пользователя без полномочий root для запуска определенных команд, а затем измените пользователя на root для запуска остальной части сценария. Я использую SUSE11. Я использовал ожидать, чтобы автоматизировать запрос пароля. Но когда я использую spawn su - и команда выполняется, приглашение возвращается с root, а остальная часть сценария не выполняется.
Например.
< non-root commands>
spawn su -
<root commands>
Но после su - приглашение возвращается обратно с пользователем как root. Как выполнить оставшуюся часть сценария.
Параметр sudo -S не помогает, так как он не запускает команду sudo -S ifconfig, в которой мне нужно найти IP-адрес компьютера.
Я уже прошел по этим ссылкам, но не смог найти решение: Измените каталог сценария на домашний каталог пользователя в сценарии оболочки
6 ответов
sudo
здесь будет работать, но вам нужно немного изменить скрипт:
$ cat 1.sh
id
sudo -s <<EOF
echo Now i am root
id
echo "yes!"
EOF
$ bash 1.sh
uid=1000(igor) gid=1000(igor) groups=1000(igor),29(audio),44(video),124(fuse)
Now i am root
uid=0(root) gid=0(root) groups=0(root)
yes!
Вы должны запустить свою команду в <<EOF
блокировать и дать блок sudo
,
Если вы хотите, вы можете использовать su
, конечно. Но вам нужно запустить его с помощью expect/pexpect
это введет пароль для вас.
Но даже если вам удастся ввести пароль автоматически (или отключить его), эта конструкция не будет работать:
user-command
su
root-command
В этом случае root-command
будет выполняться с пользователем, а не с привилегиями root, потому что он будет выполнен после su
будет закончено (su
открывает новую оболочку, а не меняет uid текущей оболочки). Вы можете использовать тот же трюк здесь, конечно:
su -c 'sh -s' <<EOF
# list of root commands
EOF
Но теперь у вас так же, как с sudo
,
Есть простой способ сделать это без второго скрипта. Просто поместите это в начало вашего файла:
if [ "$(whoami)" != "root" ]
then
sudo su -s "$0"
exit
fi
Тогда он автоматически запустится от имени пользователя root. Конечно, это предполагает, что вы можете sudo su
без необходимости ввода пароля - но это выходит за рамки этого ответа; см. один из других вопросов об использовании sudo в сценариях оболочки, чтобы узнать, как это сделать.
Краткая версия: создайте блок для включения всех команд, которые будут запускаться от имени пользователя root.
Например, я создал скрипт для запуска команды из корневого подкаталога, сегмент выглядит так:
sudo su - <<EOF
cd rootSubFolder/subfolder
./commandtoRun
EOF
Также обратите внимание, что если вы переходите к пользователю "root" внутри сценария оболочки, как показано ниже, несколько утилит Linux, таких как awk для извлечения данных или определения даже простой переменной оболочки и т. Д., Будут вести себя странно.
Чтобы решить эту проблему, просто процитируйте весь документ, используя << 'EOF' вместо EOF.
sudo -i <<'EOF'
ls
echo "I am root now"
EOF
Самый простой способ сделать это - создать как минимум два сценария.
Первый должен вызывать второй с правами root. Таким образом, каждая команда, которую вы выполняете во втором скрипте, будет выполняться от имени пользователя root.
Например:
runasroot.sh
sudo su-c'./scriptname.sh'
scriptname.sh
apt-get install mysql-server-5.5
или что вам нужно.
Вы можете использовать эту функцию, которая снова вызовет скрипт от имени пользователя root, передав первый аргумент новому вызову:
A=$1
run_with_sudo() {
local prompt
prompt=$(sudo -nv 2>&1)
if [ $? -eq 0 ]; then
# the current user has sudo and the password is already set
if [ "$(whoami)" != "root" ]; then
# restart script as root
exec sudo su - <<EOF
"$0" "$A"
EOF
exit
fi
elif echo $prompt | grep -q '^sudo:'; then
echo "the current user has sudo but needs the password entered"
return 1
else
echo "the current user has no sudo rights"
return 1
fi
}
обратите внимание, что «0 долларов» может быть не тем, что вы думаете]