web-dev-qa-db-ja.com

いつPOSIXとGNU rmは/を削除しないのですか?

数年前から、GNU rmユーティリティは、/オプションを指定して呼び出さない限り、--no-preserve-rootを削除しません。ただし、コマンドrm -rf /は非常に長い間、集団潜在意識に危険であるとして滞留しており、人々は依然としてそれを「怖い」コマンドとして引用することがよくあります。

rm/を削除できないというこのルールがいつ最初に現れたのかと思っていました。私はPOSIX仕様を確認しましたが、 POSIX:2008 にはこの安全機能が含まれていますが、 POSIX:2001 には含まれていないことがわかります。 POSIX仕様のオンラインバージョンは時々更新されるため、新しいサブリリースごとにウェイバックマシンをチェックしたところ、 2010年のPOSIX:2008の関連ページ が見つかり、 rm/を削除できないというルールがすでにリストされていることを確認します。

だから、私の質問は:

  • rm/を削除できないというルールはいつPOSIX仕様に追加されましたか?それは、Single UNIX Specificationバージョン4のオリジナルの2008エディションにありましたか、それともリビジョンに追加されましたか?
  • GNU rm?にこの制限が追加されたのはいつですか?POSIXに追加される前であると確信していますが、いつ発生しましたか?
23
terdon

POSIX 2008のすべてのエディションのHTMLバージョンをオンラインで見つけることができます。

それは2008年版で追加されました。

技術的な正誤表は、通常、新しい機能を追加しません。

以前のバージョン( http://pubs.opengroup.org/onlinepubs/009695399/utilities/rm.html )(POSIX 2004)にはそのテキストがありませんでした。

新しいテキストは、 2003-05-09オースティングループ会議 で承認され、その後の規格の改訂版に含まれました。

同じ年の3月にSun MicrosystemsのJohn Beckによって リクエストされました (リンクにはオープングループの登録が必要です、 も参照してください)ここに拡張リクエスト番号5 )。

ジョンベックは2003年3月11日火曜日にこう書いています:

@ page 820 line 31681-31683 section rm comment {JTB-1}

Problem:

Defect code :  3. Clarification required

An occasional user mistake, with devastating consequences, is to
write a Shell script with a line such as:
      rm -rf $VARIABLE1/$VARIABLE2
or
      rm -rf /$VARIABLE1
without verifying that either variable is set, which can lead to
      rm -rf /
being the resulting command.  Since there is no plausible
circumstance under which this is the desired behavior, it seems
reasonable to disallow this.  Such a safeguard would, however,
violate the current specification.

Action:

Either extend the exceptions for . and .. on the noted lines
to list / as well, or specify that the behavior of rm if an
operand resolves to / is undefined.

GNU rm--preserve-rootおよび--no-preserve-rootオプションを this 2003-11-09 commit に追加しましたが、--preserve-rootthis 2006-09-03 commit のデフォルトなので、coreutils 6.2

FreeBSDはpreserving slash以来 that 2004-10-04 commit"Find-proof of my underwear is実際"コミットログ)、ただし 最初はPOSIXLY_CORRECT の下では、POSIXが強制していることを10年後に確認することを忘れない限り その時点で、POSIXモードでも実行されました

FreeBSDの最初のコミットは、Solarisがその時点ですでにそれを行っていたと述べています。

@JdePB(コメント内)は、 Sunインサイダーストーリーへの(=)リンク がSolaris Originを裏付け、詳細を示し、リクエストを行う前にSolarisがすでに安全対策を講じていることを示唆していることがわかりました。オースティングループに。

それは、その除外を追加する理由を説明しています。 rm -rf /を実行した場合にのみ自分を責めることができますが、rm -rf -- "$1/$2"/$1が提供されていることを確認せずに$2を実行した場合、スクリプトがそれを実行できる場合があります。 (そのリンクによると)Solarisパッチを誤って適用すると、Sunの一部の顧客に悪影響を及ぼしたもの。

.および..の削除を禁止することは、それよりずっと前に追加され 、潜在的な事故から保護するために再度追加されました。 rmは依然として危険なコマンドです。それはそれが何をするつもりであるかをします:あなたがそれを言うことを取り除く.

rm -rf /*
cd /tmp &&  rm -rf .*/   # on some systems where rm -rf ../ still removes
                         # the content of ../ and shells that still
                         # may include . and .. in glob expansions.
rm -rf -- "$diretcory"/* # note the misspelled variable name
dir='foo '; rm -rf $dir/*

また、すべてを削除します。シェルファイル名の補完は、このような問題を引き起こすことがわかっています。

rm -rf someth<Tab>/*

展開先:

rm -rf something /*

somethingはディレクトリではないためです。

tcshzshのようなシェルは、*ワイルドカードを使用してrmを呼び出そうとすると、追加のプロンプトを追加します(デフォルトではtcshはありません)。

28