файл: test.sh
who
su superuser <<BELUGA
mysuperpassword
BELUGA
who
$ ./test.sh
просто ждет ввода. Что я делаю неправильно? Есть ли способ автоматизировать это?
Я думаю, что было бы намного лучше установить / использовать sudo с конфигурацией конфигурации, которая позволяет NOPASSWD для конкретных действий, которые вы пытаетесь автоматизировать.
Гораздо безопаснее разрешить определенную команду через sudo, чем хранить свой корневой пароль в текстовом файле.
Вы хотите использовать команду "ожидать" для передачи вашего имени пользователя и пароля.
Обратите внимание, что то, что вы хотите сделать, пахнет как плохой подход. Возможно, мы сможем помочь вам лучше, если вы немного подробнее расскажете о своей первоначальной проблеме, которую хотите решить.
Запускать скрипт от имени пользователя и обновлять его права доступа до root, вероятно, плохая идея. Лучшим решением было бы запустить скрипт от имени root и понизить его права доступа по мере необходимости:
#!/bin/sh
UN=user
whoami
sudo -u $UN whoami
При запуске от имени пользователя root (при условии, что user
является действительным пользователем), вывод должен выглядеть так:
root
user
Однако, если вы действительно хотите, чтобы скрипт запускался от имени пользователя и мог выполнять команды от имени пользователя root, есть два варианта, которые мне известны.
Используйте sudo с сохраненным паролем:
#!/bin/sh
whoami
sudo -S -p "" whoami <<EOF
mysuperpassword
EOF
Который будет выводить (при запуске от имени пользователя):
user
root
Используйте sudo без пароля.
Добавьте список команд, которые вы хотите запустить, в файл /etc/sudoers
, запустив visudo
от имени пользователя root. Например, чтобы позволить user
запускать команды apache2ctl
и whoami
, добавьте следующее:
User_Alias SPECIAL = user
Cmnd_Alias SPECIAL_COMMANDS = /usr/sbin/apache2ctl, /usr/bin/whoami
SPECIAL ALL = NOPASSWD: SPECIAL_COMMANDS
Или, если вы действительно доверяете user
, например, это вы, вы можете разрешить пользователю выполнять любую команду без пароля:
user ALL=(ALL) NOPASSWD: ALL
Затем, когда user
запускает следующий скрипт:
#!/bin/sh
whoami
sudo whoami
Это выведет:
user
root