setuid
をファイルに設定すると、ターミナルで次のようになります。
chmod u+s filename
これは正常に動作します。しかし、8進数の4000は常に(本などの)setuidに関連付けられています。
(ある程度)ファイルのアクセス許可、umask、setuidの概念、およびchmod
での8進数の使用を理解しています。しかし、8進数の4000とsetuidの関係はまだわかりません。説明してください。
それは単なる慣習です。すべての定数識別子は、Linuxソースコード内の番号に関連付けられています。それらのいくつかは非常に古く、カーネルの最初のリリースに由来するものもあれば、最近追加されたものもあります。
定数S_ISUID
"setuid"に関連付けられているのは、多数のLinuxヘッダーの1つである include/uapi/linux/stat.h で定義されています。何にでも定義できたはずですが、たまたま04000でした。
@steeldriverで述べたように、man 2 stat
は、ファイル許可に使用されるさまざまな定数の意味を理解するのに役立ちます。
S_IFMT 0170000 bit mask for the file type bit fields
S_IFSOCK 0140000 socket
S_IFLNK 0120000 symbolic link
S_IFREG 0100000 regular file
S_IFBLK 0060000 block device
S_IFDIR 0040000 directory
S_IFCHR 0020000 character device
S_IFIFO 0010000 FIFO
S_ISUID 0004000 set-user-ID bit
S_ISGID 0002000 set-group-ID bit (see below)
S_ISVTX 0001000 sticky bit (see below)
S_IRWXU 00700 mask for file owner permissions
S_IRUSR 00400 owner has read permission
S_IWUSR 00200 owner has write permission
S_IXUSR 00100 owner has execute permission
S_IRWXG 00070 mask for group permissions
S_IRGRP 00040 group has read permission
S_IWGRP 00020 group has write permission
S_IXGRP 00010 group has execute permission
S_IRWXO 00007 mask for permissions for others (not in group)
S_IROTH 00004 others have read permission
S_IWOTH 00002 others have write permission
S_IXOTH 00001 others have execute permission
このexcertでは、定数とその数値だけでなく、それらの選択方法も確認できます。開発者/設計者は、定数を組み合わせるように選択しています。例えば S_ISUID and S_IRWXU and S_IRUSR and S_IRGRP = 04740
、許可04740
は、正確に「所有者のsetuidとすべての権限、および所有グループの読み取り権限」を意味します。
ほとんどのUnixライクなシステムでは、ファイル、ディレクトリ、またはその他のファイルシステムオブジェクトは、inodeで表されます。 modeと呼ばれ、オブジェクトのタイプとその権限の一部を記述します。 POSIX stat.h で説明されています。
The following symbolic names for the values of type mode_t shall also be defined:
File type:
S_IFREG
Regular.
S_IFDIR
Directory.
S_IFLNK
Symbolic link.
File mode bits:
S_IRWXU
Read, write, execute/search by owner.
S_IRUSR
Read permission, owner.
S_IWUSR
Write permission, owner.
S_IXUSR
Execute/search permission, owner.
...
S_ISUID
Set-user-ID on execution.
S_ISGID
Set-group-ID on execution.
...
これらはすべて整数定数の記号名です。 S_IFREG
は0100000です。S_IRUSR
は000400です。S_ISUID
は004000です。使いやすさのために8進数になっています。ファイルモードビットは、論理的にはそれぞれ3ビットの4つのグループと見なすことができます。
ここで、.profile
のファイルタイプビットとファイルモードビットを確認できます。
$ Perl -e 'printf("%#o\n", (stat(".profile"))[2]);'
0100644
ユーザーは、chmod
システムコールを使用してモードビットを設定できます(ただし、ファイルタイプは設定できません)。整数の引数(これらのS_ *シンボリック定数の一部を使用する可能性があります)またはchmod
ユーティリティを使用できます。 、整数またはシンボリック名(u+r
など)を取ります。
実際には、モードビットの組み合わせはそれほど多くないため、何十年にもわたって多くのUnixユーザーがchmod
(システムコールとコマンドの両方)をシンボリック名ではなく数値引数で呼び出してきました。 0755
は「所有者が書き込み可能、他のすべてのユーザーが読み取りおよび実行可能」を意味し、0644
は「所有者が書き込み可能、他のすべてのユーザーが読み取り可能」を意味し、04755
は「所有者が書き込み可能、他のすべてのユーザーが読み取りおよび実行可能」を意味します。
chmod
(debian jessy)の(英語)マニュアルページから:(Highlight by me)
数値モードは、1から4の8進数(0から7)であり、値4、2、1のビットを加算することによって得られます。省略された桁は先行ゼロと見なされます。 最初の数字は、設定されたユーザーID(4)と設定されたグループID(2)および制限された削除またはスティッキー(1)属性を選択します。 2番目の数字は、ファイルを所有するユーザーの権限を選択します。読み取り( 4)、書き込み(2)、実行(1); 3番目は、同じ値を持つ、ファイルのグループ内の他のユーザーのアクセス許可を選択します。ファイルのグループに含まれていない他のユーザーの4番目は、同じ値です。
これがあなたの質問に答えるかどうかはわかりませんが、数字の意味を説明しています。