Intereting Posts
Получил новый ноутбук с аппаратными средствами, которые все еще не поддерживаются. Должен ли я ждать или возвращать его? FreeBSD: Есть ли носители для установки в I2C-модули? Автоматически запускать файл в терминале при нажатии на него Как сохранить работу службы sshd все время и установить постоянное имя домена FQDN в CentOS7? Не удается использовать SSH после установки denyhosts Перепишите команду find, которая использует sed -i для AIX Счетный вход от считывания всегда возвращает 1 в оболочке gcc не может ссылаться на pthread? Linux-арка, устанавливающая просветление, остается такой же, как и обычный kde Как избавиться от «сканирования файловых систем btrfs» при запуске? Что может сделать 64-разрядный Linux для 32-разрядного Linux-устройства? Инструменты Linux для выбора подходящего Cisco ASA 5500 Запустить команду после завершения команды nice bash скрипт переименовывает входной файл при копировании Можно ли получить RAID1, просто добавив HDD?

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

У меня есть сценарий оболочки, который содержит следующие строки:

CURRENT_USER=${USER} echo $CURRENT_USER su echo switch to `who am i` 

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

В чем причина этой проблемы?

su запускает новую оболочку (или запускает некоторую другую команду). Это не волшебным образом переключает UID текущей оболочки. Если вы введете exit после ввода пароля, вы увидите, что ваш скрипт продолжается с помощью echo инструкции (но как исходный пользователь, а не как root).

Вы можете поместить часть скрипта, которая должна быть выполнена как root, в отдельный скрипт и выполнить это с помощью su . (Или некоторые варианты использования этого трюка.)

Что касается оболочки, то su – это команда, как и любая другая. Когда вы запускаете su без аргумента, он запрашивает пароль root, а затем вызывает интерактивную оболочку, как обычно. После выхода этой интерактивной оболочки сценарий переходит к следующей команде.

Чтобы передать команды su без слишком большого количества цитирующих головных болей, простой способ – передать скрипт на его стандартный ввод, используя документ здесь . Используйте литерал heredoc (где маркер конца ввода цитируется), чтобы избежать цитирования головных болей. Обратите внимание, что переменные оболочки родительского скрипта недоступны для скрипта, который выполняется как root: доступны только переменные среды (экспортируются). Пример:

 ADD_USER=john ADD_TO_GROUP=fiddlers export ADD_USER ADD_TO_GROUP su <<'EOF' adduser "$ADD_USER" "$ADD_TO_GROUP" EOF # more commands executed as the original user 

Запуск su запускает новую команду (оболочка по умолчанию).

Чтобы сделать эту работу, попробуйте что-то вроде этого:

 #!/bin/bash if [ `id -u` = 0 ]; then # Do our real work as root else su -c $0 fi