... 我该如何设置它们?这对目录是否同样有效?粘性位和那些更“奇特”的东西会发生什么?
答案1
根据建议@古斯塔夫,该stat
计划(属于GNU 核心实用程序因此本质上是一个“Linux”程序,尽管你可能有一个港口或者包裹在 BSD 系统中)可以执行此操作。命令
stat -c "%a %n"
文件
生成仅包含八进制模式(包括 setuid、setgid 和 sticky 位编码)和文件名的格式化列表。根据文档
%a
是“八进制访问权限”%n
是“文件名”
例如,给定以下脚本:
#!/bin/sh
for name in $*
do
ls -ld "$name"
stat -c '%a %n' "$name"
done
你可能会看到如下输出myscript /usr/bin /usr/bin/X /usr/bin/bsd-write
:
drwxr-xr-x 5 root root 118784 Jul 11 19:55 /usr/bin
755 /usr/bin
-rwsr-sr-x 1 root root 9232 Dec 16 2011 /usr/bin/X
6755 /usr/bin/X
-rwxr-sr-x 1 root tty 11000 Jun 17 2010 /usr/bin/bsd-write
2755 /usr/bin/bsd-write
你会看到返回 3 或 4 个八进制数字访问权,取决于是否设置了 setuid 等。前导(第四)位数字结合了
- 4(设置 ID)
- 2(设置 gid)
- 1 (粘性)
这访问权返回排除系统调用返回的额外位stat
表示名称是目录 ( S_IFDIR
) 还是文件 ( S_IFREG
)。顺便说一下,所有这些位都适合 16 位值,这是因为 Unix 早在 20 世纪 70 年代和 80 年代早期就已实现 — —标准值. 因为访问权排除文件类型,您可以在命令中按原样使用该值chmod
(以及chmod
函数),因为它是八进制的,并且chmod
命令需要这样。即使是 setuid 等,也可以使用八进制,尽管
chmod u+s /usr/bin/whatever
更具可读性。
进一步阅读
答案2
stat -c "%a %n" <file>
似乎有效——但我不知道更多信息。