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


23

数年前から、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に追加される前のことだと確信していますが、いつそれが起こりましたか?


1
関連:Austin Group Interpretation#019(2003)。変更について説明しています(ただし、実装していません)。
マイケルホーマー

回答:


28

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

これは2008年版に追加されました。

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

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

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

それはされた同じ年という月にサン・マイクロシステムズのジョン・ベックによって要求された(リンクも参照、登録が必要とはOpenGroup 強化リクエスト数5ここに)。

John Beckは、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のオプションこの2003年11月9日には、コミットが、--preserve-root唯一のデフォルトになったコミットこの2006年9月3日、そうcoreutilsの6.2で

FreeBSDは、2004-10-04のコミット「下着の防炎性を調べる」コミットログを使用)からスラッシュを保持していましたが、最初は、下はなく、10年後にPOSIXがチェックされたことを思い出すまで、POSIXモードで行われた時点でそれ強制しますPOSIXLY_CORRECT

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

@JdePB(下記コメント)は、Sunのインサイダーストーリーへのリンクを確認し、Solarisの起源に関する詳細を提供し、オースティングループへのリクエストを行う前にSolarisがすでに適切な手段を備えていることを示唆しました。

その除外を追加する理由を説明します。行う場合にのみ自分を責めるrm -rf /ことができますがrm -rf -- "$1/$2"$1/ $2リンクが提供されていることを確認せずに実行するとスクリプトが実行できる場合があります。

削除を禁止.し、..そのずっと前に添加し、そして再び潜在的な事故に対する保護に。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はディレクトリではなかったからです。

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



1
若い協同組合のSAとして、SunOS上のユーザーのディレクトリにある隠しファイルをrm -rf .*ホームディレクトリから消去しようとしました。その直後、すべての電話回線は...点灯
アーロンD. Marasco

私は$ rm -rf。* = rm -rf /そこに到達するために複雑な方法で賭けました。
Escoce

@GuruAdrian確かに、*はすべてに一致することを意味するので、コマンドのビットスペースがなくなるまで。* = .filenameだけでなく、.. /であり、したがって../ ..および../../ .. ad infinatumです。
Escoce

多分現代のシェルで。いつもそうではなかった。私は15年以上前に、システム管理と開発の深さを残した
Escoce
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.