如何移除 setgid (Linux/Unix)?

25

我刚刚使用以下命令更改了文件权限:$ sudo chmod g+s filename,我的文件权限从 drwxr-xr-x 变成了 drwxr-sr-x。我该如何取消这个设置?


3
尝试使用chmod a-s filename命令,但该问题不适合在此讨论。 - Paulo Scardine
5个回答

50

将添加权限的 + 改为删除权限的 -

sudo chmod g-s filename
如果你想以编程的方式完成这个任务,你需要使用一些位运算符。通常情况下,它是用

If you want to do this programatically, you’ll need to use some bitwise operators. Normally it’s

mode_without_suid = bitwise_and(existing_mode, bitwise_not(S_ISUID))

S_ISUID是0o4000,这是一个使用模式位高于像0644这样的典型rwx位的常量。

例如,在Python中:

import os
import stat

def mode_details(m):
    return f"mode={oct(m)} = {stat.filemode(m)}"

mode = os.stat('foo').st_mode
print("old mode", mode_details(mode))

new_mode = mode & ~stat.S_ISUID

os.chmod('foo', new_mode)
print("new mode", mode_details(new_mode))

打印输出

old mode mode=0o104654 = -rwSr-xr--
new mode mode=0o100654 = -rw-r-xr--

抱歉再次提出这个问题。您知道是否可以使用数字来代替吗?只是出于好奇。您可能认为0XXX会将其删除,但实际上并不会。 - michael.schuett
5
@andrewdotn 它还成功地让文件可写给拥有者、同一组中的所有人和系统中的其他所有人。 - Alex Barker
谢谢@AlexBarker,我已经删除了误导性的评论并在帖子中添加了更好的说明。 - andrewdotn

4

要以数字方式删除setgid,命令为:

sudo chmod 0664 $文件名

这里的假设是文件权限为664,我们不会更改它。上面命令中最左侧的位表示setuid(4),setgid(2)和sticky(1)。现在用符号表示,setuid为u+s,setgid为g+s,sticky为o+t

示例1:chmod u+s 文件名 这将为指定的文件设置setuid,即rwsr_xr_x

示例2:chmod 2770 目录 这将为指定的目录设置setgid,即rwxr_sr_x


11
根据“chmod”的man页面,“您可以使用数字模式设置(但无法清除)位”。看起来,在许多系统上,第四个前导零会被忽略。 - SystemParadox
2
我在Ubuntu上发现这是真的:没有数字值可以清除这个位,但使用chmod g-s就可以解决问题。此外,当setgid无法清除时,不会出现错误,它只是不起作用。多么晦涩的“特性”。 - Fixee
1
@SystemParadox 我查了一下man手册,那个语句似乎只适用于目录,而不是文件。在完整的上下文中:“如果普通文件的组ID与用户的有效组ID或用户的任一附加组ID不匹配,则chmod会清除普通文件的设置组ID位,除非用户具有适当的特权。其他限制可能导致MODE或RFILE的设置用户ID和设置组ID位被忽略。此行为取决于底层chmod系统调用的策略和功能。如有疑问,请检查底层系统行为。” 1/ - AJM
1
chmod命令会保留目录的set-user-ID和set-group-ID位,除非你明确指定不保留。你可以使用类似u+s和g-s的符号模式来设置或清除这些位,也可以使用数字模式来设置(但不能清除)这些位。 - AJM

4

关于:“您可以使用数字模式设置(但无法清除)比特”

在RHEL 7上,使用chmod 0644 $filename未能删除setuid(4),setgid(2)或粘滞(1)。

然而,在前面加上额外的0即可解决:

chmod 00644 $filename


是的,在 Fedora 36 工作站上也可以工作。 - christianbueno.1

1

我想澄清一下使用数字方式处理文件和目录的方法。

  • 为用户/组/其他人添加单个特殊权限。

chmod "X"755 file

其中X是特殊权限的八进制数值模式。

  • 如果您想同时添加多个特殊权限,例如suid(4)和sgid(2),即4+2=6

chmod "6"755 file

对于suid(4),sgid(2)和粘着位(1),即4+2+1=7

chmod "7"755 file

  • 删除所有特殊权限(仅适用于文件)

chmod 00"0"755 file

“在更改文件权限时,4位数字前面的尾随零不会增加任何价值,但在更改目录权限时会增加价值。上述数字代码仅将文件的权限从7755更改为755,但如果您对目录执行相同操作,则权限将变为6755,因为它仅会删除其他人的粘性位。要删除目录的所有特殊权限,请使用chmod“000”755 file。同样,要删除suid权限并具有sgid(2)和粘性位(1),即2 + 1 = 3,请使用chmod 00“3”755 file。早期答案中已经讨论和批准了使用字母(r,w,x,X,s,t)和运算符(+/-)的解决方案。”

0
sgid with number
#chmod 2(permission)  (directory name)  = for adding
#chmod 0(permission)  (directory name)  = for removing
sgid with word
#chmod g+s directory name = for adding
#chmod g-s directory name = for removing

2
欢迎来到Stack Overflow,并感谢您为问题提供答案。您能否编辑您的答案,包括代码解释?这将有助于未来的读者更好地理解正在发生的事情,特别是那些对该语言不熟悉且难以理解概念的社区成员。当已经有一个被社区验证的已接受答案时,这尤其重要。在什么条件下可能会优先考虑您的方法?您是否利用了新的功能? - Jeremy Caney

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接