1

我有一个 C++ 应用程序,它通过xinetdLinux 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 不同?

4

0 回答 0