回答:
sudo
最初のコマンドのみを使用して実行すること、および最初のパイプ以降のすべてを元のユーザーIDとして実行することを納得させる方法として、この無用なコマンドチェーンを使用してそれを表示できます。
$ sudo whoami > file1 | whoami > file2 | whoami > file3
次に、cat
これらのファイルを表示すると、次のユーザー名が表示されます。
$ cat file{1..3}
root
saml
saml
ただし、サブシェルを実行する場合:
$ sudo sh -c 'whoami > file4 | whoami > file5 | whoami > file6'
次に、cat
これらのファイルを表示すると、次のユーザー名が表示されます。
$ cat file{4..6}
root
root
root
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
。ここでは、他の人が必ずやるように教えるためだけに示しています。
$ echo "echo 1 > /proc/sys/vm/drop_caches" | sudo sh
使い方?
二重引用符内のエコープログラムは、sudoのためにルートとして実行されていますが、エコーの出力をルート専用ファイルにリダイレクトするシェルは、そのまま実行されます。現在のシェルは、sudo
開始前にリダイレクトを行います。
$ sudo tee /proc/sys/vm/drop_caches <<<1
使い方?
このメソッドは、tee
プログラムをルートとして実行し、コマンドを呼び出す前に実行されるhere文字列から入力をsudo
取得しtee
ます。
# 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
つまり実行するコマンド文字列を「バックドア」する別のシェル()を渡すトリックを使用します。
他にもありますが、ここで停止します。これらは、物事を理解した場合に何ができるかを示すためだけのものですが、ジャンクをつなぎ合わせるだけではなく、コードプラグマを論理的なレベルにして、他の人が理解し、サポートできるようにする必要があります。それらを将来的に。