Подтвердить что ты не робот

Изменение для пользователя root внутри оболочки script

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

Например.

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

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

Опция sudo -S не помогает, так как она не запускает команду sudo -S ifconfig, которая мне нужна для поиска IP-адреса машины.

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

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

4b9b3361

Ответ 1

sudo будет работать здесь, но вам нужно немного изменить script:

$ 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.

Ответ 2

Существует простой способ сделать это без второго script. Просто поставьте это в начале вашего файла:

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

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

Ответ 3

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

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

Например:

runasroot.sh

sudo su-c'./scriptname.sh'

scriptname.sh

apt-get install mysql-server-5.5

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

Ответ 4

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

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

sudo su - <<EOF
cd rootSubFolder/subfolder
./commandtoRun
EOF