1

私は bash スクリプトをデバッグしていますが、問題をこの非常に単純なスクリプトに要約しました。CentOS 5.7 で実行されます。

# tmp.sh
function do_as_someuser {
  sudo -u someuser -i "$1"
}

do_as_someuser "ls -l"       # line 1
#do_as_someuser "A=1 ls -l"  # line 2

このスクリプトを 1 行目だけコメント解除して実行するとsomeuser、予想どおり、のホーム ディレクトリのリストが表示されます。

[root@centos57 test]# ./tmp.sh 
total 4
drwxr-xr-x 4 someuser someuser 4096 Mar 14 23:36 some_dir
[root@centos57 test]# 

しかし、2行目だけのコメントを外すと、ログに記録さsomeuserれ、ユーザープロンプトに戻りません。間違いなく、私が期待したものではありません。結局のところ、変数を定義することで違いが生じるのはなぜでしょうか?

[root@centos57 test]# ./tmp.sh 
[someuser@centos57 ~]$ 

A=1 ls -lコマンドラインで直接書くと、完全に正常に動作します。これが有効なコマンドなら、確かに にパラメータとして渡して実行できるsudoはずですよね?

私の質問:

  • なぜこれが起こるのですか?
  • do_as_someuser変数が割り当てられたコマンドを実行するように変更するにはどうすればよいですか?
4

2 に答える 2

2

何が起こっているのかというと、それ自体が「var = value」という形式を、単にシェルに渡すのではなく、環境変数の割り当てとして解釈しているということだと思います。sudo関係する限りsudo、あなたはA価値を持つように割り当てて1 ls -l、それからコマンドを実行していません。たとえば、簡単なコンソールセッションは次のとおりです。

$ sudo -i "X=5 ls"
root# echo $X
5 ls

クイックテストに基づいて、--実行するコマンドの直前にあるオプションを使用することで、問題を回避できます。

$ sudo -i -- "X=5 ls"
... files ...
$ sudo -i -- 'BLORT=zorch env' | grep BLORT
BLORT=zorch
SUDO_COMMAND=/bin/sh -c BLORT=zorch env
于 2013-03-14T23:11:20.180 に答える
2

あなたが望むものを達成する1つの方法は、使用することです

sudo -u someuser $SHELL -c "A=1; ls -l; echo \$A"

つまり、そのユーザーとして実行するシェル コマンドの先頭で、他のユーザー コンテキストにシャトルする変数の割り当てを配置します。

ポイントを証明するもう少し読みやすい代替案:

sudo -u someuser $SHELL -c "FOOBAR=BAZ env|grep FOOBAR"

なぜこれが起こるのですか?sudoシェルを仲介として使用して指定されたコマンドを実行していないために発生すると思います。ただし、これは上記のコマンドが行うことです。のエラーメッセージから、(またはいずれにせよ からのログインシェル)がコマンドを実行しようとしていて、引数を分割していない-iと思います-率直に言って、とにかくそれを適切に分割する方法をどうやって知るのでしょうか?:bashpasswdexec(3)

$ sudo -u someuser $SHELL -i "FOOBAR=1 env|grep FOOBAR"
bash: FOOBAR=1 env|grep FOOBAR: No such file or directory

しかし、その場合の実装についてのmanページsudoは間違っていると思います(-iオプションのドキュメント):

コマンドが指定されている場合は、シェルの-cオプションを介して実行するためにシェルに渡されます。

ご覧のとおり、エスケープする必要がある変数を使用しているため、上記は必ずしも便利ではありません。

あなたの例にとどまるには:

# tmp.sh
function do_as_someuser {
    sudo -u someuser $SHELL -c "$1"
}

do_as_someuser "ls -l"       # line 1
do_as_someuser "A=1 ls -l"   # line 2

あなたの質問から私が理解できない部分は-i、コマンドが実行されて戻ると予想されるときに使用を主張する理由です...なぜ最初のログインシェルですか?.profileetから何かが必要ですか。アル。

于 2013-03-14T23:38:59.803 に答える