他のユーザーがaliasコマンドを実行できなかった場合

他のユーザーがaliasコマンドを実行できなかった場合

私はここで何が間違っているのかわかりません。

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_aliasesUser2

また、見ることができますsudo suを実行する理由はありますか?

答え2

エイリアスは user1 の .bash_profile で定義されています。 「su -l user2」を使用すると、実際にはuser1のすべての環境変数が消去され、「startservices」エイリアスが定義されていないuser2の変数がロードされます。

"su -p"オプションを使用して現在の環境を保存できますが、この場合、user2にはuser1の.bashrcファイルに対する読み取り権限が必要です。

関連情報