行の先頭に「sudo」と入力すると、残りのコマンドにも適用されますか?

行の先頭に「sudo」と入力すると、残りのコマンドにも適用されますか?

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番目の形式のトリックを使用します。

もっとたくさんありますが、ここでやめましょう。これは、あなたが理解している場合は何ができるかを示すためのものです。しかし、必ずしもゴミを互いに接続する必要はありません。他の人が理解してサポートできるように、コードプラグマを論理レベルに保つ必要があります。未来にあります。

おすすめ記事