まず、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"
(またはtee
Make It Workなどの他のツールを使用してください。)
だから質問は、
sudo bash -c 'command'
実行できず、sudo command
実行のみ可能な状況(例外)がありますか?
sudo bash -c
永遠に代わりに使用するのは良い考えですかsudo
?
答え1
sudo bash -c
特定のコマンドを実行する特定のユーザーに権限を付与するように構成できることとはsudo
大きな違いがあります。したがって、特定の値に対して実行を許可するが実行を許可しないsudo
設定にある可能性があります。sudo command
command
sudo 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.txt
world.txt
rm
sudo 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
$file
bash -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とその中に含まれるすべての魔法を拡張して、ルートとして実行される完全なシェルで実行されます。