私はここで何が間違っているのかわかりません。
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
エイリアスはこのように動作できませんか?
このコマンドは、エイリアスが完全に無視されると機能します。
答え1
シェルが非対話型の場合、expand_aliases
シェルオプションの設定に使用されない限り、エイリアスは拡張されませんshopt -s expand_aliases
。
Aliasはインタラクティブな使用のための短縮ツールです。すべての種類のスクリプトには代わりにシェル関数を使用してください。
startservices () {
# commands go here
}
シェル関数は、多くの点でエイリアスよりもはるかに柔軟です。まず、シェルスクリプトなどのパラメータを受け入れます。
startservices () {
user="$1"
service="$2"
# code to start service "$service" as user "$user"
}
他のユーザーのソースを明示的にインポートする必要はありません.bash_profile
。代わりに使用してくださいsudo -i
。これにより、.bash_profile
起動時に次のログインシェルが起動します。
$ sudo -i -u User2 startservices
これはstartservices
、スクリプトまたはその他の外部ユーティリティ、シェル起動ファイル$PATH
で定義されているシェル関数、またはシェル起動ファイルで定義さUser2
れたエイリアスでなければなりませんUser2
(シェルを実行するにはsetを使用)。expand_aliases
User2
また、見ることができますsudo suを実行する理由はありますか?
答え2
エイリアスは user1 の .bash_profile で定義されています。 「su -l user2」を使用すると、実際にはuser1のすべての環境変数が消去され、「startservices」エイリアスが定義されていないuser2の変数がロードされます。
"su -p"オプションを使用して現在の環境を保存できますが、この場合、user2にはuser1の.bashrcファイルに対する読み取り権限が必要です。