我有一个由我的用户 ID 创建的可执行文件,我需要以 root 身份运行它。因此,我需要将可执行文件的所有权更改为 root:root 并使用 setuid。当我尝试
sudo chown root:root [EXE_NAME]
我收到错误:
chown: changing ownership of `[EXE_NAME]`: Operation not permitted
我的限制是:
- 我在 sudoers 文件中为我的用户 ID 设置了 sudo ALL ALL,但无法以 root 身份登录
- 需要以 root 身份运行的可执行文件正在尝试使用 pcap_open_live 函数以混杂模式绑定到网络接口(因此需要以 root 身份运行)。
有没有更好的方法来解决我的最终问题,即需要运行一个绑定到安全网络接口的可执行文件并且不需要 sudo 或创建 root 拥有的 shell(sudo tcsh
)
答案1
如果sudo
实际上给出的是 UID 0(使用 进行检查sudo id
),我怀疑该文件驻留在不支持权限的文件系统上(例如 FAT32)。在这样的文件系统上,您无法更改文件的所有权(或权限)。
答案2
如果您的文件系统支持所有权,我还能想到另外三个原因:
该分区以只读方式安装。
尝试重命名文件或在同一目录中创建另一个文件。如果可以,则不是问题。
该文件已被锁定。
检查程序是否正在运行。尝试重命名文件。
该文件设置为仅附加或者不可变的。
要更改此设置,请执行以下命令:
sudo chattr -ai filename
答案3
如果你只需要改变所有权(而不是所有权和组)那么您可以使用chown root filename
。如果您不是root,则以sudo为前缀。
如果您也想更改群组,请始终这样做chgrp
。
(当然,不如用一个命令就完成所有操作那么好)。
答案4
普通用户也可以绑定到网络接口,但不能绑定到 1024 以下的端口。因此,您可以让您的程序绑定到 >= 1024 的端口,然后从外部或通过重定向到该端口ssh -fN -L 0.0.0.0:<PRIV_PORT>:localhost:<UNPRIV_PORT>
。
话虽如此,您的问题也可能与 SElinux 有关,它在 RHEL 中默认启用。要禁用它,请SELINUX=disabled
在 中设置/etc/selinux/config
。