Переход на пользователя root внутри сценария оболочки

У меня есть сценарий оболочки, которому требуется учетная запись пользователя без полномочий root для запуска определенных команд, а затем изменение пользователя на пользователя root для запуска остальной части сценария. Я использую SUSE11. Я использовал expect для автоматизации запроса пароля. Но когда я использую spawn su - и команда выполняется, приглашение возвращается с корнем, а остальная часть скрипта не выполняется.

Eg.

< non-root commands>
 spawn su -
<root commands>

Но после su приглашение возвращается обратно с пользователем как root. Как выполнить оставшуюся часть скрипта.

Параметр sudo -S не помогает, так как он не запускает команду sudo -S ifconfig, которая мне нужна, чтобы найти IP-адрес машины.

Я уже просмотрел эти ссылки, но не смог найти решение: Изменить каталог сценария на домашний каталог пользователя в сценарии оболочки

Изменение пользователя unix в сценарии оболочки


person Deepti Jain    schedule 24.07.2012    source источник
comment
Если вы используете bash, вы можете создать функцию и передать определение sudo: unix.stackexchange.com/questions/269078/   -  person Nishant    schedule 22.05.2021


Ответы (5)


Здесь будет работать 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.

person Igor Chubin    schedule 24.07.2012

Есть простой способ сделать это без второго скрипта. Просто поместите это в начало вашего файла:

if [ "$(whoami)" != "root" ]
then
    sudo su -s "$0"
    exit
fi

Затем он автоматически запустится как root. Конечно, это предполагает, что вы можете sudo su не указывать пароль, но это выходит за рамки этого ответа; см. один из других вопросов об использовании sudo в сценариях оболочки, чтобы узнать, как это сделать.

person Benubird    schedule 07.08.2015
comment
Будь осторожен; "$0" может быть не тем, что вы думаете. - person ELLIOTTCABLE; 15.05.2017
comment
@ELLIOTTCABLE Это интересно, но я предполагаю, что $0 — это команда для запуска текущего процесса, а не путь к текущему файлу, поэтому он немного менее уязвим. Тем не менее, хороший момент, и очень полезная ссылка. - person Benubird; 01.06.2017
comment
для запроса пароля просто используйте echo $PASSWORD | sudo -S su -c "$0" - person Leathan; 29.01.2018

Краткая версия: создайте блок для включения всех команд, которые будут выполняться от имени пользователя root.

Например, я создал скрипт для запуска команды из корневого подкаталога, сегмент выглядит следующим образом:

sudo su - <<EOF
cd rootSubFolder/subfolder
./commandtoRun
EOF
person Juan T    schedule 12.11.2018

Самый простой способ сделать это — создать как минимум два скрипта.

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

Например:

runasroot.sh

sudo su-c'./scriptname.sh'

имя_скрипта.sh

apt-get install mysql-server-5.5

или что вам нужно.

person Josh    schedule 16.03.2013
comment
Что, если вместо root назовем его $USERNAME2? Заранее спасибо. - person raja777m; 03.12.2015
comment
Привет, спасибо за ваш ответ, но это должно быть sudo su -c'bash scriptname.sh' Между su и -c должен быть пробел - person Lakshay; 14.03.2021

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

Чтобы решить эту проблему, просто процитируйте весь документ, используя ‹‹'EOF' вместо EOF.

sudo -i <<'EOF'
ls
echo "I am root now"
EOF
person Alok Tiwari    schedule 25.12.2019