危険なLinuxコマンドについての質問

このQ&Aのポイント
  • 危険なLinuxコマンドについての質問です。特に「実行してはいけない危険なLinuxコマンド10選」について知りたいと思っています。
  • 質問文章で紹介されている四つのLinuxコマンドについて疑問があります。それぞれのコマンドについて安全性や注意点について教えてください。
  • 質問文章にあるLinuxコマンドの意味や使い方について知りたいです。具体的には、:(){:|:&};:, gunzip untrusted.gz, command > file.conf, ^mistake^correctionについて教えてください。
回答を見る
  • ベストアンサー

危険なLinuxコマンド

http://news.mynavi.jp/news/2016/08/23/264/ に「実行してはいけない危険なLinuxコマンド10選」が紹介されていまして、 分からないものがありますので教えて下さい。 :(){:|:&};: これはさっぱり分からないです。 gunzip untrusted.gz これは解凍するだけなので、解凍したものを実行しなければ問題ないと思うのですが。 command > file.conf 既にある何かの設定ファイルを書き換えてしまうからヤバいということでしょうか。 ^mistake^correction ^は行頭の意味の正規表現だったと思いますが、これはどういうことでしょう? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • trapezium
  • ベストアンサー率62% (276/442)
回答No.1

> :(){:|:&};: > これはさっぱり分からないです。 これは関数定義です。それで再帰で自分自身を呼び出してるから、メモリとプロセステーブル食い尽してにっちもさっちも行かなくなるか、kernel panic にでもなるのでは無いかと思います。でも : は builtin command なので上書き出来ないシェルもあります。(bash は出来るみたいですが) > ^mistake^correction > ^は行頭の意味の正規表現だったと思いますが、これはどういうことでしょう? これは直前のコマンドの mistake 部分を correction して実行するヒストリ置換の一種で、!:s/mistake/correction と同じ意味です。いやこれは普通に使うでしょ。というかコマンドライン編集が出来無いシェルでは必須でした。

marebo
質問者

お礼

どうもありがとうございます。 ある程度検索して探してみました。: についてだけは : (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 に書いてあるのですが、よく意味が分かりません。 申し訳ありませんが :(){:|:&};: を理解するためにはどこを見ればよいか教えていただけますでしょうか。

その他の回答 (3)

  • trapezium
  • ベストアンサー率62% (276/442)
回答No.4

> 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() の仕組みと関連しています。

marebo
質問者

お礼

どうもありがとうございます。 おかげさまでだいたいは理解することができました。 ふだんパイプなどを用いてコマンドを使う時には 内部の動作の仕組みまでは意識せずに使えてしまいますが 個人でも少し規模の大きい処理をコンピューターにさせようと思えば こういうことをもっと知っておかねば、と改めて認識したところです。

  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.3

> gunzip untrusted.gz 伸張すると、1TBのファイルが出来るかもしれません。 > :(){:|:&};: 回答がありますが、 foo() { foo | foo & } foo と同じですね。回答のある通り、自分自身を無限に呼び出す関数を定義して、それを呼び出します。 > command > file.conf commandというのは、bashの組み込みコマンドなので、何かあるのかと思って調べましたが、何も無いようです。 > ^mistake^correction これも直前のコマンドを一部変更して再実行するだけなので、特に危険では無いと思います。

marebo
質問者

お礼

どうもありがとうございます。 > > gunzip untrusted.gz > 伸張すると、1TBのファイルが出来るかもしれません。 言わてみれば確かにそうですね。 :(){:|:&};: これについては別の回答へのお礼に疑問点を記しておきましたので目を通していただけるとありがたいです。

  • trapezium
  • ベストアンサー率62% (276/442)
回答No.2

> : (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

marebo
質問者

お礼

どうもありがとうございます。 おかげさまでだいぶ理解できてきました。 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 などとは違う意味に見えますし。 また、 :(){:|:&};: で定義された関数 : の実行が行われる時に、 まず最初に {:|:&} を呼び出して実行しようとし、この中の一つ目の:の実行にかかったところで、また {:|:&} を呼び出して実行しようとし、この中の一つ目の:の実行にかかったところで、また {:|:&} を呼び出して実行しようとし、・・・・・ という繰り返しになり、 いつになっても二つ目の:の実行には取り掛かることができず、 &によってバックグラウンドに回すことはできないのでは、 と感じたのですが そうではないということですよね。 たびたびすみませんが、もう少し解説していただけますでしょうか。

関連するQ&A

  • linux上で、複数のgz圧縮ファイルを、元のgzファイルも保持したま

    linux上で、複数のgz圧縮ファイルを、元のgzファイルも保持したまま解凍したいのですが、 > gunzip -cd *.gz のように、標準出力して元のファイルを残すのではなく、 圧縮ファイルとして元のファイルを保持したまま、解凍も行うことはできないのでしょうか? (例えば、"AAA.gz"を解凍して"AAA"と"AAA.gz"の2つをディレクトリ内に残すことはできないのでしょうか?) ご教授よろしくお願いします。

  • postgresのlinux版でやっている事と同等の事をwindows

    postgresのlinux版でやっている事と同等の事をwindows版でやりたい! os:windows xp やりたい事は以下です。 圧縮して出力 $ pg_dump dbname | gzip > filename.gz 解凍のみ $ gunzip -c filename.gz 解凍してリストア $ gunzip -c filename.gz | psql dbname gzipがzipやlhaに変わってもOKです。 --format=c オプションで出力したファイルは解凍のみの方法が分かりませんでした。 圧縮ツールはwindowsの標準か追加モジュールが第一希望 第二希望はフリーソフトです。

  • grep と gawk

    たとえば圧縮ファイルを解凍して 必要のない行を排除して解凍後ファイルを作成する場合 (1)gunzip -c test.gz | gawk '!/\.txt*/' > test.txt (2)gunzip -c test.gz | grep -v '.txt' > test.txt 上記のコマンドではどちらが処理的にはやいのでしょうか? 自分で試すと(2)の方がはやかったです。 イメージ的にはgawkなんですけど・・・ 一般論とかあるんでしょうか?

  • システムコマンド

    こんにちは。質問させてください。 ソースの中でシステムコマンドを用いようと考えています。 GZファイルを解凍して拡張子txtの文字を含む行を抽出してファイルに吐き出します。 gunzip -c test.gz | gawk '/\.txt*/' > tmp.txt この場合、.txt と .TXT (.Txt,tXt)は区別されるのでしょうか? 区別されない時は C言語で操作するしかないでしょうか? すみませんがよろしくお願いいたします。

  • grepコマンド

    質問させてください。 ファイルから指定した文字列を含まない行を別ファイルに 書き込もうとしています。 gunzip -c tmp.gz | grep -i -v '.txt' > work.txt 上記の場合、tmp.gzを解凍したファイルの行に大文字・小文字関係のない ".txt(Txt, tXt, TxT, ・・・"の文字列を含まない行を  work.txtに書き込んでいます。 これはうまくいったのですが、判定文字列を複数にすると 『ファイルを見つけようとしてエラーがでました』となります。 ちなみにコマンドは gunzip -c tmp.gz | grep -i -v '.txt' -i -v '.log' -i -v '.pdf'> work.txt 複数の大文字小文字を区別しない指定された文字列を含まない行を 別ファイルに書き込むにはどのようにすればいいのでしょうか? すみません、あまり経験がないのでお許しください。 よろしくお願いいたします。

  • PHPからlhaコマンドを使いたい

    こんにちは、Linux初級です。 PHPからlhaコマンドが使えなくて困っています。 実は他の掲示板でも質問しているのですが、私が初級ということもあってか(?)、途中で途切れてしまっています。 何とか、解決までおつきあいいただけないでしょうか? 以下、現状です。 ・サーバーはCentOS5.2で、lhaは自力でインストール ・SSHからのlhaコマンド実行は問題無し  SSHで実行したコマンド "lha efiw=絶対パス 絶対パス/対象圧縮ファイル" //問題無く解凍できました。 ・サーバーレンタル会社へ質問するもサポート外との返事  ただし、PHPの実行ユーザーで動くはずだと思う・・・との事 ・PHP実行時のhttpd.confのエラーログは"sh: lha: command not found" それで、PHPの処理の流れは、アップロードされたlzh圧縮ファイルを解凍するというものです。 if (!shell_exec("lha -e '絶対パス' '絶対パス/$up_file'")) { exit("解凍できません!"); } とか、 if (!system('lha efiw=絶対パス 絶対パス/$up_file')) { exit("解凍できません!"); } とか、-eをeやxに変えたりといろいろやってみましたが、結果は全て"解凍できません!"となります。 ちなみに、zipファイルは解凍できますので、セーフモードでは無いようです。 shell_exec("unzip -j '{絶対パス}$up_file' -d '{絶対パス}'"); //これはOK また、絶対パスはzipの方で確認していますので、間違いありません。 PHPの記述の問題なのか、サーバー側の問題なのか、さすがに困り果てました。 何か情報が不足しておりましたら、ご指摘下さい。 どうぞ宜しくお願いいたします。

    • 締切済み
    • PHP
  • vine linux4.2でのsongbirdのインストール

    linux超初心者です. FUJITSUのノートパソコンにvine linux4.2をインストールし, さらにsongbirdをインストールしようとしました. tarコマンドで解凍後,解凍フォルダにてsongbird*というのが あるので ./songbird とコマンドしたところ, cannot excute binary file と表示され,実行できませんでした. どうしたら実行できるのでしょうか? ちなみにsongbirdはプラットフォームが Linux x86_64のものを解凍してインストールしようとしました. よろしくお願いします.

  • LINUXのsourceコマンド実行

    perlスクリプト内でLINUXコマンドのsourceを実行する方法はないでしょうか? system()を試みたところ、組み込みコマンドだとエラーとなってしまいます。 sourceしたいファイルの内容を解読して$ENV{~~}に設定する方法もあるかと 思いますが、何か単純にできる方法があるのではと思っております。

    • ベストアンサー
    • Perl
  • コマンドプロンプトで、linuxのlocateコマンドのようなコマンドはありますか?

    vista ultimateを使っています。 端的にいうと、 Cドライブ配下全体で、.log,.msi.install.exe,setup.exe のどれかの文字列を含むファイル一覧を表示させたいと思っています。 (できれば、 ☆含むではなく、 .logで終わる or .msiで終わる or install.exeと完全一致 or setup.exeと完全一致 ☆なおかつ、できれば、大文字小文字を区別しない ☆なおかつ、できれば、結果は、ファイル名だけでなく、フルパスで知りたい と思っています。 で、いま、vistaが立ち上がらないエラーが起きているので、 vistaのメディアから、コマンドプロンプトで、 それを実行しようとしています そこで。。。一案ですが・。。 コマンドプロンプトで、 linuxのlocateコマンドのようなコマンドはありますか? findというのがそれかなと思ったのですが、 linuxにおけるgrepと同じようでして。 ご存知の方いらっしゃいましたら、よろしくお願いします。

  • svm_lightの使い方

    環境:ホストWindows ゲストLinux (VMware Ubuntu SVM_LIGHT) 初心者です。 SVMのダウンロードサイトのサンプルプログラムを実行したいのですが サイトに書いてある通り gunzip -c example1.tar.gz | tar xvf - でexample1を解凍し、 svm_lightフォルダに解凍したexample1フォルダを入れて GNOMEでsvm_lightディレクトリに移動し、 svm_learn example1/train.dat example1/model を実行しても bash: svm_learn: command not found って出て何も起こりません これって・・・コマンドが間違っているのでしょうか?それとも他の何かが?教えてくださいお願いします。