Bashで行の先頭に入力すると、残りのsudo
コマンドにも適用されますか?
つまり、これは次のようになります。
sudo foo | foo2 | foo3
これと同等です:
sudo foo | sudo foo2 | sudo foo3
ベストアンサー1
提供された最初のコマンドでのみ実行し、最初のパイプ以降の他のすべてのエントリが元のユーザーIDで実行されることを自信を持って確認する方法で、この役に立たsudo
ないコマンドチェーンを使用してこれを確認できます。
例 #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
最初は実行されたが、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のため、二重引用符内のechoプログラムはrootとして実行されますが、echoの出力をルート専用ファイルにリダイレクトするシェルは依然としてユーザーとして実行されます。現在のシェルは起動する前にリダイレクトを実行しますsudo
。
方法#2
$ sudo tee /proc/sys/vm/drop_caches <<<1
どのように動作しますか?
このメソッドはtee
プログラムをrootとして実行しますここにある文字列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'
ただし、マニュアルページを見ると、-s
スイッチはユーザーファイルエントリで定義されているシェルに単一のコマンドを渡すことがわかります/etc/passwd
。したがって、sh -c
実行されるコマンド文字列を「バックドア」する別のシェル()であるシェルを渡すことに関連する2番目の形式のトリックを使用します。
もっとたくさんありますが、ここでやめましょう。これは、あなたが理解している場合は何ができるかを示すためのものです。しかし、必ずしもゴミを互いに接続する必要はありません。他の人が理解してサポートできるように、コードプラグマを論理レベルに保つ必要があります。未来にあります。