- ベストアンサー
危険なLinuxコマンドについての質問
- 危険なLinuxコマンドについての質問です。特に「実行してはいけない危険なLinuxコマンド10選」について知りたいと思っています。
- 質問文章で紹介されている四つのLinuxコマンドについて疑問があります。それぞれのコマンドについて安全性や注意点について教えてください。
- 質問文章にあるLinuxコマンドの意味や使い方について知りたいです。具体的には、:(){:|:&};:, gunzip untrusted.gz, command > file.conf, ^mistake^correctionについて教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
> :(){:|:&};: > これはさっぱり分からないです。 これは関数定義です。それで再帰で自分自身を呼び出してるから、メモリとプロセステーブル食い尽してにっちもさっちも行かなくなるか、kernel panic にでもなるのでは無いかと思います。でも : は builtin command なので上書き出来ないシェルもあります。(bash は出来るみたいですが) > ^mistake^correction > ^は行頭の意味の正規表現だったと思いますが、これはどういうことでしょう? これは直前のコマンドの mistake 部分を correction して実行するヒストリ置換の一種で、!:s/mistake/correction と同じ意味です。いやこれは普通に使うでしょ。というかコマンドライン編集が出来無いシェルでは必須でした。
その他の回答 (3)
- trapezium
- ベストアンサー率62% (276/442)
> The FUNCNEST variable, if set to a numeric value greater than 0, defines a maximum > function nesting level. Function invocations that exceed the limit cause the entire command to abort. > と書いてあるので、この変数を設定すれば、無限ループを途中で止められるかもしれません。 はい。安全の為に事前に適当な数値、(100~1000くらいかな) を指定しておくのはいいと思います。ただし、本来の POSIX sh にはありませんので、他の OS の sh では使えないかもしれません。 > いつになっても二つ目の:の実行には取り掛かることができず、 > &によってバックグラウンドに回すことはできないのでは、 > と感じたのですが > そうではないということですよね。 パイプについては、少し考え違いがあるようです。例えば $ ls | grep linux とあるとき、ls と grep linux は同時に実行されています。ls の実行が終ってから grep が起動されているわけでは無いです。というのはパイプの結合の為には、双方のプロセスの入出力を直接繋ぐ必要があるからです。また組み込みコマンド (builtin command) は少し例外ですが、一般のコマンドはシェル自身のプロセスで実行しているわけではなく、子プロセスを fork() して実行しています。 これは & 付きでも同様で、 : | : & のときは二つのプロセスをパイプで結合してから、コマンドリスト全体をバックグラウンド処理します。(逆に言えば wait しない) ですから、親プロセスと最初の : と2番目の : はそれぞれ別プロセスで、同時に実行されますので、更に再帰で : | : & と倍々ゲームでプロセスが増植していくことになります。 これらの Unix システムコールの pipe(), fork(), execve() の仕組みと関連しています。
お礼
どうもありがとうございます。 おかげさまでだいたいは理解することができました。 ふだんパイプなどを用いてコマンドを使う時には 内部の動作の仕組みまでは意識せずに使えてしまいますが 個人でも少し規模の大きい処理をコンピューターにさせようと思えば こういうことをもっと知っておかねば、と改めて認識したところです。
- notnot
- ベストアンサー率47% (4901/10362)
> gunzip untrusted.gz 伸張すると、1TBのファイルが出来るかもしれません。 > :(){:|:&};: 回答がありますが、 foo() { foo | foo & } foo と同じですね。回答のある通り、自分自身を無限に呼び出す関数を定義して、それを呼び出します。 > command > file.conf commandというのは、bashの組み込みコマンドなので、何かあるのかと思って調べましたが、何も無いようです。 > ^mistake^correction これも直前のコマンドを一部変更して再実行するだけなので、特に危険では無いと思います。
お礼
どうもありがとうございます。 > > gunzip untrusted.gz > 伸張すると、1TBのファイルが出来るかもしれません。 言わてみれば確かにそうですね。 :(){:|:&};: これについては別の回答へのお礼に疑問点を記しておきましたので目を通していただけるとありがたいです。
- trapezium
- ベストアンサー率62% (276/442)
> : (a colon) > : [arguments] > Do nothing beyond expanding arguments and performing redirections. The return status is zero. builtin command の : はコマンド自身は何もしません。返り値は常に 0 を返します。ただし、arguments は評価されますから、 : $((a++)) として変数のカウントアップしたり、ファイルの作成(切り詰め)などに使います。 > 申し訳ありませんが > :(){:|:&};: > を理解するためにはどこを見ればよいか教えていただけますでしょうか。 まず、最後の ;: はマルチステートメントの ; と、その前で定義した関数 : の実行です。 関数定義は name () { command } という形式で、この場合は name が : command が : | : & で関数 : を再帰で実行し、更にバックグラウンドに回しているので、プロンプト自体はすぐ返ってくるようにして悪質度を上げてます。更に言えば不用意に実行しやすい、builtin command を override するという念の入れよう。 詳細はこのあたり https://www.gnu.org/software/bash/manual/html_node/Shell-Functions.html#Shell-Functions ヒストリ置換は https://www.gnu.org/software/bash/manual/html_node/Event-Designators.html#Event-Designators
お礼
どうもありがとうございます。 おかげさまでだいぶ理解できてきました。 https://www.gnu.org/software/bash/manual/html_node/Shell-Functions.html#Shell-Functions ここに The FUNCNEST variable, if set to a numeric value greater than 0, defines a maximum function nesting level. Function invocations that exceed the limit cause the entire command to abort. と書いてあるので、この変数を設定すれば、無限ループを途中で止められるかもしれません。 ただ、こういう危険なコマンドをうっかり実行してしまう時に そういう配慮をする余裕はないだろうとは思いますけども。 それと、まだよく理解できない点がいくつかあります。 :(){:|:&};: この中の|このパイプの機能がまだよく分かりません。 $ ls | grep linux などとは違う意味に見えますし。 また、 :(){:|:&};: で定義された関数 : の実行が行われる時に、 まず最初に {:|:&} を呼び出して実行しようとし、この中の一つ目の:の実行にかかったところで、また {:|:&} を呼び出して実行しようとし、この中の一つ目の:の実行にかかったところで、また {:|:&} を呼び出して実行しようとし、・・・・・ という繰り返しになり、 いつになっても二つ目の:の実行には取り掛かることができず、 &によってバックグラウンドに回すことはできないのでは、 と感じたのですが そうではないということですよね。 たびたびすみませんが、もう少し解説していただけますでしょうか。
お礼
どうもありがとうございます。 ある程度検索して探してみました。: についてだけは : (a colon) : [arguments] Do nothing beyond expanding arguments and performing redirections. The return status is zero. と https://www.gnu.org/software/bash/manual/html_node/Bourne-Shell-Builtins.html#Bourne-Shell-Builtins に書いてあるのですが、よく意味が分かりません。 申し訳ありませんが :(){:|:&};: を理解するためにはどこを見ればよいか教えていただけますでしょうか。