我有一个 C++ 应用程序,它通过xinetd
Linux Centos5 64 位上的服务在另一台机器上调用服务器。被调用的进程以 root 身份调用,但我认为它可能是一个不具备全部功能的 root,因为我在应用程序中观察到。
在我的应用程序中,通过 inetd 调用以 root 身份运行,我创建了一个新文件和链接(每个最初的用户 root 和组 root),然后lchown()
在所有者上成功调用,但它总是在使用 EPERMS 的组上失败,Operation not permitted
. 将用户和组组合成一次调用lchown()
同样失败。
我的应用程序中有问题的代码是这样的:
::lchown("pathnameToFile", uid_t(500), static_cast<unsigned>(-1)); // This line works
::lchown("pathnameToFile", static_cast<unsigned>(-1), gid_t(500)); // This line fails
::lchown("LinkToPathname", uid_t(500), static_cast<unsigned>(-1)); // This line works
::lchown("LinkToPathname", static_cast<unsigned>(-1), gid_t(500)); // This line fails
在我的代码运行后,新创建的文件以 NFS 挂载目录的形式存在,具有以下权限:
drwxrwxr-x 2 me me 4096 Jun 22 17:33 .
drwxrwxrwx 2 me me 4096 Jun 22 17:33 ..
-rw-rw-r-- 1 me root 33 Jun 22 17:33 pathnameToFile
lrwxrwxrwx 1 me root 8 Jun 22 17:33 LinkToPathname -> pathnameToFile
gid 500 是“me”的主要组,另一组是“wheel”。
> groups
me wheel
在 shell 提示符下,我可以毫无问题chgrp
地登录root
到组me
。
当我的应用程序通过 inetd 调用时,为什么 lchown() 的行为会有所不同?请注意,以 root 身份调用的同一应用程序通过ssh
正确设置文件的组所有者。为什么通过 ssh 的 root 与通过 xinetd 的 root 不同?