我有一个 bash 文件,当由组用户执行时,我想以所有者权限运行它。因此,我使用以下命令设置文件权限:
sudo -u owner_user chmod 4750 bash_script
该文件则具有以下权限:
-rwsr-x---. 1 owner_user group 6559 Mar 15 09:52 bash_script
该文件包含以下行:
cp other_folder/source_file other_folder/destination_file
当我以属于该组但不同于文件所有者的用户身份运行该文件时owner_user
,收到以下错误消息:
cp: cannot create regular file ´other_folder/destination_file´: Permission denied
文件的权限为:
-rw-r--r--. 1 owner_user group 4331 Mar 13 11:51 other_folder/destination_file
-rw-r--r--. 1 owner_user group 4331 Mar 13 11:51 other_folder/source_file
owner_user
当我使用命令运行 bash_script 时
sudo -u owner_user ./bash_script
我没有收到上面的 cp 错误消息。
我期望在运行时应用owner_user
的权限,无论谁执行它,因为 suid 已设置为。但事实似乎并非如此。有谁知道为什么吗?other_folder/destination_file
bash_script
bash_script
答案1
Linux 忽略所有解释型可执行文件的 setuid 位 (SUID) 和 setgid 位 (SGID)。
请阅读我们姊妹网站 Unix & Linux SE 上这个获得高度赞同的答案:允许在 shell 脚本上设置 setuid. 最重要的片段是 [强调添加]:
Linux 忽略所有解释型可执行文件(即以一行开头的可执行文件)上的 setuid¹ 位
#!
。这comp.unix.questions 常见问题解释 setuid shell 脚本的安全问题。这些问题分为两类:shebang 相关和 shell 相关;[…]如果您不关心安全性并希望允许 setuid 脚本,那么在 Linux 下,您需要修补内核。[…]
[…]
- Setuid shebang 不安全但通常会被忽略。
- 如果您以特权运行程序(通过 sudo 或 setuid),编写本机代码或 perl,或者使用清理环境的包装器启动程序(例如带有选项的 sudo
env_reset
)。¹如果你用“setgid”代替“setuid”,本讨论同样适用;它们都会被 Linux 内核在脚本中忽略
如果您发现此信息有用,并且想要在超级用户上对此答案投赞成票,那么请首先考虑对链接的答案投赞成票。
您将在这里找到一些想法和链接:我可以让脚本始终以 root 身份执行吗?