Изменение для пользователя root внутри оболочки script
У меня есть сценарий оболочки, которому нужна учетная запись пользователя без полномочий root для запуска определенных команд, а затем измените пользователя на root для запуска остальной части сценария. Я использую SUSE11. Я использовал ожидать, чтобы автоматизировать запрос пароля. Но когда я использую spawn su - и команда выполняется, приглашение возвращается с root, а остальная часть сценария не выполняется.
Например.
< non-root commands>
spawn su -
<root commands>
Но после su - приглашение возвращается обратно с пользователем как root. Как выполнить оставшуюся часть сценария.
Опция sudo -S не помогает, так как она не запускает команду sudo -S ifconfig, которая мне нужна для поиска IP-адреса машины.
Я уже прошел по этим ссылкам, но не смог найти решение: Измените каталог сценария на домашний каталог пользователя в сценарии оболочки
Изменение пользователя unix в скрипте оболочки
Ответы
Ответ 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