1つのライナーの最初に「sudo」と入力すると、それは残りのコマンドに適用されますか?


10

sudobashで1行の先頭に入力すると、それは残りのコマンドに適用されますか?

言い換えれば、これは:

sudo foo | foo2 | foo3

これと同等:

sudo foo | sudo foo2 | sudo foo3

回答:


11

sudo最初のコマンドのみを使用して実行すること、および最初のパイプ以降のすべてを元のユーザーIDとして実行することを納得させる方法として、この無用なコマンドチェーンを使用してそれを表示できます。

例1

$ sudo whoami > file1 | whoami > file2 | whoami > file3

次に、catこれらのファイルを表示すると、次のユーザー名が表示されます。

$ cat file{1..3}
root
saml
saml

例2

ただし、サブシェルを実行する場合:

$ sudo sh -c 'whoami > file4 | whoami > file5 | whoami > file6'

次に、catこれらのファイルを表示すると、次のユーザー名が表示されます。

$ cat file{4..6}
root
root
root

例3

sudo foo1 | sudo foo2 ...からの出力sudo foo1がに供給されるため、に関するコメントは機能しませんsudo foo2。私のwhoami例を使用すると、これはその一連のコマンドが何も実行しないことを示しています。

$ sudo whoami | sudo whoami | sudo whoami
root

1つ目は実行されましたが、2つ目と3つ目は入力を受け取る機能がないため、何も実行しません。むしろ私はあなたがこのようなものを書くつもりだったと思います:

$ sudo whoami;sudo whoami;sudo whoami
root
root
root

これは、3つの異なるコマンドプロンプトで3回実行するのと同じです。またはこれ:

$ sudo whoami && sudo whoami && sudo whoami
root
root
root

しかし、これを最後に行わないでください。それは次のセクションに属しています。

sudoを呼び出すあいまいな方法

これらは私の最高の仕事ではありませんが、を使用して複数のコマンドを実行しているのを見たかもしれない他の方法ですsudo。ここでは、他の人が必ずやるように教えるためだけに示してます。

方法#1

$ echo "echo 1 > /proc/sys/vm/drop_caches" | sudo sh

使い方?

二重引用符内のエコープログラムは、sudoのためにルートとして実行されていますが、エコーの出力をルート専用ファイルにリダイレクトするシェルは、そのまま実行されます。現在のシェルは、sudo開始前にリダイレクトを行います。

方法#2

$ sudo tee /proc/sys/vm/drop_caches <<<1

使い方?

このメソッドは、teeプログラムをルートとして実行し、コマンドを呼び出す前に実行されるhere文字列から入力をsudo取得しteeます。

方法#3

# this way
$ sudo -s -- 'whoami'

# or this way
sudo -s -- sh -c 'whoami;whoami'

使い方?

これらは異なって見えるかもしれませんが、彼らは本当に同じことをしています。-sスイッチを使用する場合sudo、単一のコマンドを実行します。それを逃れる方法があるかどうか私は決して理解できなかった。これらのようなものは機能しません。

# this
$ sudo -s -- 'whoami;whoami'

# or this
$ sudo -s -- 'whoami\;whoami'

しかし、manページを見ると、-sスイッチは、/etc/passwdファイルのユーザーのエントリで定義されているシェルに単一のコマンドを渡すことを示しています。したがって、2つ目の形式では、主にシェル、sh -cつまり実行するコマンド文字列を「バックドア」する別のシェル()を渡すトリックを使用します。

他にもありますが、ここで停止します。これらは、物事を理解した場合に何ができるかを示すためだけのものですが、ジャンクをつなぎ合わせるだけではなく、コードプラグマを論理的なレベルにして、他の人が理解し、サポートできるようにする必要があります。それらを将来的に。


6

いいえ、あなたの例でfooはによってのみ実行されsudoます。エスカレートされた特権ですべてのコマンドを実行する場合は、シェルを起動できます。

sudo sh -c 'foo | foo2 | foo3'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.