例:
# show starting permissions
% stat -c '%04a' ~/testdir
0700
# change permissions to 2700
% chmod 2700 ~/testdir
# check
% stat -c '%04a' ~/testdir
2700
# so far so good...
# now, change permissions back to 0700
% chmod 0700 ~/testdir
# check
% stat -c '%04a' ~/testdir
2700
# huh???
# try a different tack
% chmod g-w ~/testdir
% stat -c '%04a' ~/testdir
0700
バグや機能?
chmod 0700 ~/testdir
権限をからに変更2700
できないのはなぜですか0700
?
複数の異なるファイルシステムで同じ動作が観察されます。たとえば、最新の出力では、関連するmount
出力ラインは次のようになります。
/dev/sda5 on / type ext4 (rw,relatime,errors=remount-ro,data=ordered)
また、FWIW
% stat -c '%04a' ~/
0755
答え1
GNUを使用すると仮定すると、chmod
この内容は次の記事で説明されています。マンページ:
chmod
特に明示的に指定しない限り、ディレクトリの set-user-ID および set-group-ID ビットは保持されます。u+s
アンパサンドやその他のシンボルモードを使用してこれらのビットを設定または消去し、g-s
数値モードを使用してこれらのビットを設定できます(消去できません)。
これは許されるPOSIX:
8進数で設定された各ビットに対して、下の表に示す対応するファイル許可ビットを設定し、他のすべてのファイル許可ビットをクリアする必要があります。通常のファイルでは、set-user-ID-on-executionまたはset-group-ID-on-executionに対応する8進数に設定された各ビットに対して、次の表に示すビットを設定する必要があります。 8進数が設定されると消去されます。他のファイル形式の場合、 set-on-execute-user-ID または set-on-execute-group-ID ビットのセットまたはクリア要求が許可されるかどうかは、実装によって定義されます。
GNUの動作理由は次chmod
のとおりです。coreutils
6.0 リリースノート:
chmod
、、、ディレクトリのset-user-ID、およびset-group-IDビットは、明示的に他に要求されない限り保存されますinstall
。たとえば、set-user-ID および set-group-ID ビットは今や削除されずに保持されます。これらのビットをクリアするには、シンボルモード(例)で明示的に言及してください。これを設定するには、記号または数値モードで明示的に言及してください(例:、)。これらの変更は、これらのビットが親から継承されるシステムを容易にするためのものです。残念ながら、他のオペレーティングシステムはここでは一貫性がなく、移植可能なスクリプトは、これらのビットが明示的に言及されていても、これらのビットが設定、解放、または予約されていると仮定することはできません。たとえば、OpenBSD 3.9はsetgidビットを保持しますが消去します。対照的に、Solaris 10 およびすべてのバージョンは setgid ビットを保持するため、これをクリアするには同様の方法を使用する必要があります。mkdir
chmod 755 DIR
chmod u=rwx,go=rx DIR
DIR
mkdir -m 755 DIR
mkdir -m u=rwx,go=rx DIR
mkdir -m u=rwx,go=rx,-s DIR
mkdir -m 2755 DIR
mkdir -m u=rwx,go=rx,g+s DIR
mkdir -m 777 D
D
chmod 777 D
mkdir -m 777 D
mkdir -m g-s D
chmod 0777 D
D
chmod g-s D
このトピックに関する追加情報があります。8391、前にゼロを含めることはあいまいさのもう1つの理由です(ユーザーには消去されたビットまたは8進値を表すことができます)。マニュアルcoreutils
には専用セクションもあります。ユーザーIDをディレクトリ化して設定し、グループIDビットを設定します。;これは、問題のあるビットをクリアできるGNU拡張があることを示します。
chmod =700 ~/testdir
chmod 00700 ~/testdir
どちらもクリアビットです(ただし、どちらも移植可能ではありません)。
答え2
この試み:
chmod 000700 ~/testdir
答え3
起動権限の表示
% stat -c '%04a' ~/testdir 0700
==>わかりました!
権限を2700に変更
% chmod 2700 ~/testdir
==>グループIDを設定していますので参考にしてください!
確認する
% stat -c '%04a' ~/testdir 2700
==>わかりました!
これまではそんなに良くなった…
次に、権限を0700に戻してください。
% chmod 0700 ~/testdir
==>制限付き削除または固定タグ(グループIDではない)が削除されることに注意してください。
確認する
% stat -c '%04a' ~/testdir 2700
ああ? ? ?
さまざまな戦略を試してください
%chmod gw ~/testdir %stat -c '%04a' ~/testdir 0700
================================================== ========= 最後に、次のコマンドを使用して成功することができます。
chmod 000700 ~/testdir