いつも「sudo」の代わりに「sudo bash -c」を使うのは良い考えですか?

いつも「sudo」の代わりに「sudo bash -c」を使うのは良い考えですか?

まず、Debian/Ubuntu オペレーティングシステムについてのみ議論します。 (不快なら申し訳ありません。私はこの2つだけ知っているからです。)

第二に、sudo権限のみを持つroot以外のユーザーについて話しています。


sudo権限でコマンドを実行しようとするたびに、私はいつもsudo bash -c 'command'sudoを使用する必要があるのか​​、それともsudoのみを使用するのかを尋ねますsudo command。これは少し痛いです。

sudo commandたとえば、場合によっては直接動作しないためsudo echo "smth" >> /etc/privilegedfile

しかし、sudo sh -c "echo 'smth' >> /etc/privilegedfile"or常に動作しているようです。sudo bash -c "echo 'smth' >> /etc/privilegedfile"

(またはteeMake It Workなどの他のツールを使用してください。)


だから質問は、

sudo bash -c 'command'実行できず、sudo command実行のみ可能な状況(例外)がありますか?

sudo bash -c永遠に代わりに使用するのは良い考えですかsudo

答え1

sudo bash -c特定のコマンドを実行する特定のユーザーに権限を付与するように構成できることとはsudo大きな違いがあります。したがって、特定の値に対して実行を許可するが実行を許可しないsudo設定にある可能性があります。sudo commandcommandsudo bash

一般的にできるだけ具体的に説明することをお勧めしますので、優先順位をsudo command決めてくださいsudo bash -c command

答え2

sudoで使用すると、bash -c単独で使用するよりもはるかに危険ですsudo。シェルでコマンドを実行すると、シェルはさまざまな方法で多くの特殊文字を処理して拡張します。たとえばrm *.txt、入力しているシェル(通常bash)は、* .txtを.txtで終わる現在のフォルダのファイルのリストに展開します。単純さとセキュリティのために、sudoコマンドはこれを行いません。代わりに、渡した引数を使用してコマンドを直接実行します。たとえば、シェルで次のコマンドを実行するとします。

$ file=/etc/passwd
$ sudo vim $file
$ ls *.txt
hello.txt  world.txt
$ sudo rm *.txt

$file最初の行は、現在のシェルでsudoコマンドを実行する変数を設定し、すべてのsudo vim /etc/passwdテキストファイルを一覧表示してsudoを削除します。シェルは、sudoがそれを表示または実行する機会がある前に、変数とファイル名のワイルドカードを拡張します。最後の行でsudoが呼び出されると、3つのパラメータが提供されたことがわかりますrm。その後、ユーザールートとして呼び出され、2つのパラメータのみを使用し、追加の処理はありません。たとえば、周囲に引用符を使用すると、sudoはそれを確認し、1つの引数でコマンドを呼び出します。 rmコマンドはそれを文字通り受け入れ、「*.txt」というファイルを削除しようとしますが、そのファイルが存在しないことを発見します。 .txtで終わる他の2つのファイルも表示されません。拡張はシェルによって行われます。hello.txtworld.txtrmsudo rm "*.txt"rm*.txt

要点を明確に説明するために、人生をより簡単にするシェルの魔法を取り除くときに上記のコマンドは、次のように変数やワイルドカードなしで直接作成する必要があります。

$ sudo vim /etc/passwd
$ ls hello.txt world.txt
hello.txt  world.txt
$ sudo rm hello.txt world.txt

ls、*.txtを拡張する方法がrmわからないか、これがシェルの操作です。それでは、sudoが危険にさらされる可能性のある部分を見てみましょう。自宅でこれを試さないでください:sudo$filebash -c

$ file=/etc/passwd
$ sudo vim $file
# Take a short break from your computer here...
$ file="/lets/be/malicious; cp /dev/zero /dev/sda"
$ sudo vim $file  # Might see a harmless error here
$ sudo bash -c "vim $file"  # Goodbye hard-drive

これが非常に人為的な例であることは認めなければなりませんが、ここで起こりうる潜在的な危険を想像することは難しくないことを願っています。問題は、ルートとしてメタ文字を拡張する機能をシェルに提供することです。あなたがいない間、誰かがファイル変数を修正し、その中にハードドライブを消去する悪意のあるコマンドを挿入したとしましょう。以前の構文を使用すると、sudo vim $file権限のない一般ユーザーに拡張され、失敗します。 2番目の使用では、$ fileとその中に含まれるすべての魔法を拡張して、ルートとして実行される完全なシェルで実行されます。

関連情報