我刚刚使用以下命令更改了文件权限:$ sudo chmod g+s filename
,我的文件权限从 drwxr-xr-x
变成了 drwxr-sr-x
。我该如何取消这个设置?
将添加权限的 +
改为删除权限的 -
:
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--
要以数字方式删除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
chmod g-s
就可以解决问题。此外,当setgid无法清除时,不会出现错误,它只是不起作用。多么晦涩的“特性”。 - Fixee关于:“您可以使用数字模式设置(但无法清除)比特”
在RHEL 7上,使用chmod 0644 $filename未能删除setuid(4),setgid(2)或粘滞(1)。
然而,在前面加上额外的0即可解决:
chmod 00644 $filename
我想澄清一下使用数字方式处理文件和目录的方法。
chmod "X"755 file
其中X是特殊权限的八进制数值模式。
chmod "6"755 file
对于suid(4),sgid(2)和粘着位(1),即4+2+1=7
chmod "7"755 file
chmod 00"0"755 file
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
chmod a-s filename
命令,但该问题不适合在此讨论。 - Paulo Scardine