c - 理解 `man ls` 长格式 : set-user-id and set-group-id modes

标签 c unix permissions

作为学校练习的一部分,我正在尝试用 C 重新创建 UNIX ls。它必须完全支持 -l 选项,并且行为与原始选项一样。

顺便说一下,我使用的是 OSX 10.8,如果这有什么不同的话。

我无法理解 MAN 的这一部分,来自 Long Format 部分。具体来说,我想知道同一行上的两个 ifIF ... OR IF ... 还是 IF ... AND IF 。 ..:

The first of the following that applies:

S     If in the owner permissions, the file is not executable and set-user-ID mode is set.  If in the group permissions, the file is not executable and set-group-ID mode is set.

s     If in the owner permissions, the file is executable and set-user-ID mode is set.  If in the group permissions, the file is executable and setgroup-ID mode is set.

据我从 man 2 stat 页面了解,我可以检查 set-user-id 模式,例如:

st_mode & 4000

像这样设置组 ID 模式:

st_mode & 2000

那么如何检查两者是否都已设置?如果 st_mode & 2000 为真,st_mode & 4000 一定是假的吧?

最佳答案

I'm having trouble understanding this part of the MAN, from the Long Format section. Specifically, I'm wondering if the two ifs on the same lines are IF ... OR IF ... or IF ... AND IF ...

IF 是独立的。文件可以打开或关闭 setuid 位,也可以打开或关闭 setgid 位。 ls 手册页中的描述可能有点困惑,因为措辞非常简洁。这是一个希望更清楚的描述。引用stat.h位定义的手册页。

  • 首先,考虑所有者位和 setuid 位。

    • 如果所有者读位是on,输出r,否则输出-
    • 如果所有者写位打开,输出w,否则输出-
    • 如果所有者可执行位关闭且 setuid 位打开,则输出 S,否则如果所有者可执行位打开且 setuid 位打开,则输出 s,否则如果所有者可执行位打开,则输出 x,否则输出 -
  • 接下来,考虑组位和 setgid 位。

    • 如果组读位为on,则输出r,否则输出-
    • 如果组写位打开,输出w,否则输出-
    • 如果组可执行位关闭且setgid位打开,输出S,否则如果组可执行位打开且setgid位打开,输出s, else 如果组可执行位打开,输出 x,否则输出 -
  • 接下来,考虑其他位和 S_ISVTX 位。

    • 如果另一个读位是on,输出r,否则输出-
    • 如果另一个写位打开,输出w,否则输出-
    • 如果文件是目录且其他可执行位关闭且 S_ISVTX 位打开,则输出 T,否则如果文件是目录且其他可执行位打开且 S_ISVTX位打开,输出t,否则如果其他可执行位打开,输出x,否则输出-
    • 在某些版本的UNIX中,省略了“如果文件是目录”的要求,如果其他要求,普通文件可以输出Tt满足。

历史视角

最初,setuid、setgid 和 save-text 位仅对可执行文件有意义,因此长格式 ls 可以通过将 x 标记替换为st,据了解,x 标签是隐含的。 UNIX 的后来修订版允许 setuid、setgid 和 save-text 位对不可执行文件和目录具有不同的语义(通常,文件锁定、新文件对目录组的继承以及限制删除),因此 ST 标签被添加到 ls 的输出中。

关于c - 理解 `man ls` 长格式 : set-user-id and set-group-id modes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20238771/

相关文章:

macos - 在 Mac 上,在 shell 中,我如何知道我有一个 GUI?

bash - 如何根据匹配的关键字段用另一个文件中的行替换文本文件中的行?

.net - 防止 .NET 写入 C :\Windows\Temp

php - 如何创建一个空的 op_array?

c++ - 需要一个散列函数来从 ipv6 16 字节地址和 TCP 2 字节端口号中创建 32 位值

c - 编写调用过程中dll调用的问题

bash - 如何在 pg_dump 中传递日志文件

.net - '/' 应用程序中的服务器错误。 - 没有相关源代码行.NET FRAMEWORK 4.0

node.js - gyp WARN EACCES 用户 "root"没有访问开发目录的权限

c - While 循环使用多个条件过早中断