是否可以使用 sudo 将可执行文件的所有权更改为 root?

是否可以使用 sudo 将可执行文件的所有权更改为 root?

我有一个由我的用户 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

如果您的文件系统支持所有权,我还能想到另外三个原因:

  1. 该分区以只读方式安装。

    尝试重命名文件或在同一目录中创建另一个文件。如果可以,则不是问题。

  2. 该文件已被锁定。

    检查程序是否正在运行。尝试重命名文件。

  3. 该文件设置为仅附加或者不可变的

    要更改此设置,请执行以下命令:

    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

相关内容