sudo -u username -s“ cmd arg”はコマンドが見つからないことを返します


10

私は以前コマンドを実行していました:

sudo -u elasticsearch -s "ulimit -Hn"

そして、Ubuntu 11.10で試してみるまで、ユーザーelasticsearchに表示されるulimit -Hnの値を返していました。そこに戻ります:

/bin/bash: ulimit -Hn: command not found

いくつかの異なるコマンドを試しましたが、引数を使用すると、常に「コマンドが見つかりません」と表示されます。

$ sudo -u elasticsearch -s "ls all.sh"
/bin/bash: ls all.sh: command not found

引数を必要とするコマンドを実行するにはどうすればよいsudoですか?


なぜ-s?通常のシェルを保持し、それを使用してコマンドを実行します。などsudo -u elasticsearch ls all.shelasticsearch使用できないデフォルトのシェルがある場合は、実際のコマンドの-s bash 前に使用します。
glglgl

回答:


16

二重引用符を削除する必要があります。"ulimit -Hn"と呼ばれるコマンドを単一のコマンド、スペース、およびすべてとして実行しようとしています。コマンドラインの-s最後のsudoオプションである必要があり、実行するためにsudo次のすべての引数が渡され$SHELL -cます。

sudo -u elasticsearch -s ulimit -Hn

私は道推測する-s現在の方法は、あなたがスペースを含む引数を渡すことができますよう、処理されたが変更された$SHELLコマンドラインでそれらをエスケープすることにより:

$ touch '/tmp/foo bar'
$ sudo -s rm '/tmp/foo bar'

引数処理の古い方法は、その'/tmp/foo bar'引数を2つに分割し、コマンドを壊していました。


コマンドを分割しないことをどこでテストしましたか?
Zarathustra

@Zarathustraそれは5年前でした-私はそれまで思い出すことができません。sudoソースコードの履歴を掘り下げることをお勧めします。動作がいつ変更されたかを確認できるはずです。
camh 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.