なぜ chmod による 8 進表記で setuid/setgid/sticky ビットをクリアできないのでしょうか?

なぜ chmod による 8 進表記で setuid/setgid/sticky ビットをクリアできないのでしょうか?

それで今日、職場に突然経営陣が現れて、エンジニアのグループに Linux の使い方の短期集中講座をするよう私に依頼しました。どうやら、彼らは私が Microsoft と対立していること (Win 10 のプライバシーとセキュリティの問題による) を察知し、今では私は *nix に関するあらゆることの「エキスパート」になっています。

グループに Linux のシンプルさの素晴らしさを説明した後、ファイル権限についての質問がありました。chmod権限を割り当てるためのユーザー、グループ、ワールドの 8 進構文について説明します。

次に、setuid/setgid/sticky ビットについてですが、次のような簡単な例で説明しchmod 2755 somefile.txt、setgid ビットが有効になっていることを指摘します。そのビットをクリアするには、 を発行しますchmod 0755が、残念なことに setgid ビットはそのままです。何ですか?? 以前、この構文を使用して sticky ビットをクリアしたことがありました (おそらく 10 年前ですが)。その設計がいかに優れているかを語った直後に、それが機能しないことがわかったときは、かなり恥ずかしかったです。

とにかく、私は彼らに代替の省略形も示しg+sg-sそれがg-s機能することを発見しました。

プレゼンテーションの後、私は のバグを見つけたと思っていましたchmodが、ページを確認すると、 はスティッキー フラグを設定するために使用できるが、クリアすることはできないmanという明確な注記があり、その動作は「設計によるもの」であることがわかりましたchmod

8 進表記を使用してスティッキー ビットをクリアする機能がchmod削除されたのはなぜですか? Google で検索したところ、先頭の 0 は「紛らわしい」ので省略すべきだと言っている人がいました。本当ですか? その論理では、バイト (例: ASCII コード) に先頭の「0」ビットが含まれるのは「紛らわしい」ので違法であると言っても過言ではありません。先頭の 0 が紛らわしいと思う人は、シンボリック表記を使用できます。8 進表記を使用したい人は、8 進表記を使用できる必要があります。

chmodスティッキー ビットをクリアするための 8 進表記をサポートしないのはなぜですか?

答え1

問題は、スティッキー ビットが導入される前から、3 桁 (またはそれ以下) の 8 進数を使用するシェル スクリプトなどがすでに多く存在していたことです。また、任意の数値の先頭にゼロを付加できるという慣習がかなり深く根付いています。

したがって、先頭にゼロが付いた 8 進形式でスティッキー ビットをリセットできるようにした場合、多くのスクリプトが誤ってスティッキー ビットをリセットすることになります。これをデバッグするのは悪夢となるため、代わりにchmod8 進形式ではスティッキー ビットをリセットできないという制限が設けられました。結局、スティッキー ビットを本当にリセットしたい場合 (これはめったに起こりませんが)、いつでも代替形式を使用できます。

したがって、驚くほど複雑な多くの形式と同様に、答えは「下位互換性」です。

関連情報