Выполнение команды псевдонима в качестве другого пользователя

Не уверен, что я делаю неправильно здесь.

User2 отправляет файл в свой файл .bash_profile для установки псевдонимов, специфичных для конкретной среды.

# .bash_profile source $HOME/set_environment_shortcuts 

Внутри $ HOME / set_environment_shortcuts (здесь много псевдонимов). Пример:

 alias startservices="verylongcommand" 

Теперь я хотел бы «запускать службы от другого пользователя».

 [User1@server1 ~]$ sudo su -l User2 -c '. ~/.bash_profile; startservices' -bash: startservices: command not found 

Команда runuser производит тот же результат.

 [User1@Server1 ~]$ sudo runuser -l User2 -c '. ~/.bash_profile; startservices' -bash: startservices: command not found 

Алиасы не работают таким образом?

Обратите внимание, что при обходе полностью псевдонима команда работает.

Псевдонимы не расширяются, если оболочка не является интерактивной, если expand_aliases оболочки expand_aliases не задан с помощью shopt -s expand_aliases .

Псевдонимы – это инструмент быстрого доступа для интерактивного использования. Для любого типа скриптов вместо этого используйте функцию оболочки:

 startservices () { # commands go here } 

Функции Shell гораздо более гибкие, чем псевдонимы. Они могут принимать аргументы, подобные сценарию оболочки, для стартеров:

 startservices () { user="$1" service="$2" # code to start service "$service" as user "$user" } 

Вам не нужно явно .bash_profile файл .bash_profile другого пользователя. Вместо этого используйте sudo -i . Это запустит оболочку входа, которая будет читать .bash_profile при запуске:

 $ sudo -i -u User2 startservices 

Для этого требуется, чтобы startservices как сценарий или другая внешняя утилита в $PATH User2 , функция оболочки, определенная в файлах запуска оболочки User2 , или псевдоним (с оболочкой, запущенной с expand_aliases набора expand_aliases ), определенный в файлах запуска оболочки User2 .

См. Также Есть ли веская причина для запуска sudo su?

Псевдоним определяется в .bash_profile user1. Когда вы используете «su -l user2», он фактически очищает все переменные среды для user1 и вместо этого загружает переменные user2, где не задан псевдоним «startervices».

Вы можете использовать опцию «su -p», которая сохранит текущую среду, но в этом случае пользователь2 должен иметь разрешение на чтение файла .bashrc user1.