Intereting Posts
Совместите тачпад правильно в xorg.conf на Dell XPS 15 Включая .bash_profile через ssh Выясните, используется ли моя система в качестве бота, если посмотреть на ifconfig? автоматически отключать приложение при его запуске с терминала Оптимизация чтения / вывода с чтением вперед, избегая хранения данных в кеше страницы Что происходит с файлами в точке монтирования после запуска fs-cifs для монтирования NAS? arch linux странное сообщение после установки гостевых дополнений xorg и virtualbox Возможно ли получить сообщение об ошибке из предыдущей команды, которая не удалась при выполнении условной команды с использованием || yum перевод rpm -Uvh Указатель имени домена хоста в Linux Как выводить строки, разделенные запятыми, используя расширение brah brace чашки – сломанная труба Как я могу получить более красивые шрифты в моем терминале (URxvt)? Одиночная машина с двумя дисками Обновлено с CentOS 6.4 -> 6.5, и теперь разрешения не работают должным образом?

Выполнение некоторых частей скрипта как непривилегированного пользователя с оболочкой

Я создаю сценарий конфигурации экземпляра, который устанавливает машину.

Я запускаю скрипт через sudo ie sudo run.sh Большинство этапов требуют доступа root, но некоторые из шагов скрипта не требуют доступа к корневому файлу, и я предпочитаю использовать их как непривилегированного пользователя, который запускал sudo.

Внутри скрипта, работающего с sudo, я пытаюсь сделать

 sudo -i -u username sh -c 'echo $MY_ENV' 

Поскольку .bashrc содержит export MY_ENV=something я ожидаю, что вышеуказанная команда будет печатать "что-то"

Как я могу временно переключиться внутри сценария на другого пользователя для запуска команд, которые включают оболочку пользователя env ?

.bashrc выполняется только интерактивными оболочками, а не скриптами¹. Неправильное место для определения переменных окружения. См. Есть ли эквивалентный файл .bashrc, который читается всеми оболочками? и Ubuntu wiki .

Вы можете сказать bash, чтобы прочитать .bashrc явно. Конечно, вам придется выполнить bash , а не sh который может быть другой оболочкой:

 sudo -i -u username bash -c '. `~/.bashrc; echo "$MY_ENV"' 

Но это плохая идея, потому что файлы .bashrc , вероятно, содержат вещи, которые предполагают, что они выполняются на терминале, и которые тратят время на установление привязок клавиш, псевдонимов, подсказок и т. Д.

Разумным решением является определение определений переменных среды, в которых они принадлежат, в ~/.profile или ~/.pam_environment .

¹ За исключением случаев, когда bash вызывается sshd по какой-то странной причине.