私はルートとして
# WWWFOLDER=myproject
# echo $WWWFOLDER
myproject
# su - anothershelluser /bin/bash -c "echo $WWWFOLDER"
#
ご覧のとおり、私は何も印刷しません。
私は試しましたが、成功しませんでした。
# su - anothershelluser /bin/bash -c "echo ${WWWFOLDER}"
# su - anothershelluser /bin/bash -c 'echo ${WWWFOLDER}'
# su - anothershelluser /bin/bash -c 'echo $WWWFOLDER'
質問
実行するbashコマンドにWWWFOLDERを渡すにはどうすればよいですか?
答え1
渡す-
ことは、su
環境を消去してログインをシミュレートするように明示的に要求することです。
ただ置いてください-
。
また、ほとんどのsu
実装ではターゲットユーザーのログインシェルにコードを渡すため、その-c
シェル構文のコードを渡す必要があります。そのシェルがBourneに似ている場合:
# export VAR=value
# su anothershelluser -c 'printf "%s\n" "$VAR"'
value
ターゲットユーザーのログインシェルに関係なくbashシェルを実行する必要がある場合(なぜそうするのか)、ターゲットユーザーのログインシェル構文を使用してそのbashシェルを実行するようにコードを設定する必要があります。
The Bourne Supremacyと同じなら、次のようになります。
su anothershelluser -c 'exec bash -c '\''printf "%s\n" "$VAR"'\'
sudo
代わりに使用する方がsu
簡単です。
sudo -E -u anothershelluser bash -c 'printf "%s\n" "$VAR"'
(-E
環境を保護するためにsudo
必ずしも環境を保護するわけではありません。みんな環境)。
zshシェルには、UID、EUID、GID、EGID、またはUSERNAME変数を割り当ててuid / gids変更をサポートする機能が組み込まれています。問題は次のとおりです。
(USERNAME=anothershelluser; bash -c 'printf "%s\n" "$VAR"')
(また、pamスタック呼び出し、ロギング、追加のptyラッパーの追加など、su / sudoが実行するすべての追加操作をスキップします。)