起動権限の表示

起動権限の表示

例:

# 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のとおりです。coreutils6.0 リリースノート:

chmod、、、ディレクトリのset-user-ID、およびset-group-IDビットは、明示的に他に要求されない限り保存されますinstall。たとえば、set-user-ID および set-group-ID ビットは今や削除されずに保持されます。これらのビットをクリアするには、シンボルモード(例)で明示的に言及してください。これを設定するには、記号または数値モードで明示的に言及してください(例:、)。これらの変更は、これらのビットが親から継承されるシステムを容易にするためのものです。残念ながら、他のオペレーティングシステムはここでは一貫性がなく、移植可能なスクリプトは、これらのビットが明示的に言及されていても、これらのビットが設定、解放、または予約されていると仮定することはできません。たとえば、OpenBSD 3.9はsetgidビットを保持しますが消去します。対照的に、Solaris 10 およびすべてのバージョンは setgid ビットを保持するため、これをクリアするには同様の方法を使用する必要があります。mkdirchmod 755 DIRchmod u=rwx,go=rx DIRDIRmkdir -m 755 DIRmkdir -m u=rwx,go=rx DIRmkdir -m u=rwx,go=rx,-s DIRmkdir -m 2755 DIRmkdir -m u=rwx,go=rx,g+s DIRmkdir -m 777 DDchmod 777 Dmkdir -m 777 Dmkdir -m g-s Dchmod 0777 DDchmod g-s D

このトピックに関する追加情報があります。8391、前にゼロを含めることはあいまいさのもう1つの理由です(ユーザーには消去されたビットまたは8進値を表すことができます)。マニュアルcoreutilsには専用セクションもあります。ユーザーIDをディレクトリ化して設定し、グループIDビットを設定します。;これは、問題のあるビットをクリアできるGNU拡張があることを示します。

chmod =700 ~/testdir
chmod 00700 ~/testdir

どちらもクリアビットです(ただし、どちらも移植可能ではありません)。

おすすめ記事