【问题标题】:change linux socket file permissions更改 linux 套接字文件权限
【发布时间】:2012-08-02 15:44:08
【问题描述】:

首先,是的,这与 this stack overflow question 有关,但我的情况略有不同,我的帖子没有得到答案。

因此,在我的戴尔台式工作站 Ubuntu 10.04 32 位上,我开发了一个服务器程序,旨在为 Apache 运行的 PHP“程序”提供 Unix-Domain 套接字。 (注意:umask = 0022)我将套接字文件命名为 /home/wmiller/ACT/web_socket_file。 (ACT 是对产品名称的引用)。 /home/wmiller/ACT 的权限为 777。/home/wmiller/ACT/web_socket_file 的权限为 777。

现在,我将程序复制到我的测试平台,一个 Q7 格式的英特尔处理器板,它也有 Ubuntu 10.04 32 位和 umask = 0022。相同的目录,相同的 777 目录权限。但是,现在当我运行代码 /home/wmiller/ACT/web_socket_file 时出现 755 权限,而 Apache/PHP 无法打开 Unix 域套接字,因为它获得了 r-x 权限而不是 rw- 或 rwx。 Apache 在 uid = www-data 中运行。

sockaddr_un       webServAddr;
remove( g_webSocketFileName.c_str() );       // to erase any lingering file from last time

memset(&webServAddr, 0, sizeof(webServAddr));
webServAddr.sun_family        = AF_UNIX;
snprintf( webServAddr.sun_path, UNIX_PATH_MAX, "%s", g_webSocketFileName.c_str() );

if (( g_webServerSock = socket(AF_UNIX, SOCK_STREAM, 0)) < 0 )
{
    PLOG( ERROR ) << "Failed to acquire the web Server socket: ";  // uses google glog tool
    return -1;
}

所以我尝试了这两种方法,但都没有成功。

chmod( g_webSocketFileName.c_str(), S_IRWXU | S_IRWXG  | S_IRWXO );

char temp[100];
sprintf( temp , "chmod o+w %s\n", g_webSocketFileName.c_str() );
system( temp );

尝试了777和o+w的权限。

我什至尝试添加一个

unlink( g_webSocketFileName.c_str() );

但那里没有帮助。

有人对为什么 ir 在一台机器上工作而不是在另一台几乎相同的机器上工作有什么建议吗? 将套接字文件放在其他地方会更好吗?是否有一个标准的 place-where-socket-files-go?

【问题讨论】:

  • 知道了!我所要做的就是在 bind() 语句之后移动 chmod() ,它就可以工作了!

标签: c++ sockets unix-socket


【解决方案1】:

在 Linux 上,您需要在 Unix 域套接字文件描述符上调用 fchmod()之前 bind()。这样,bind() 调用将创建具有指定权限的文件系统对象。在已绑定的套接字上调用fchmod() 无效。

使用 chmod() 可能会导致 TOCTTOU 竞争条件。如果可能,请改用fchmod()

这是一个特定于 Linux 的 hack。在大多数 BSD 系统上,fchmod() 将在套接字 fd 上失败并设置 EINVAL


编辑。 我通过修补发现了这种与系统相关的行为差异。也许最好的“来源”应该是内核源代码本身。

  • 在 FreeBSD 上,Unix 域套接字上的 fchmod() 似乎被定义为设置 EINVAL (Ref1) 的空操作
  • 在 Linux 上,似乎 Unix 域套接字 fd 的创建就像一个 inode 以及文件模式(但带有 S_IFSOCK 按位或)。 (Ref2) Linux 的fchmod() 实现将愉快地将更改应用于此类对象。将 Unix 域套接字绑定到地址时,文件模式用于创建文件系统对象。 (Ref3) 根据man 2 statS_IFSOCK 存在于 POSIX.1-2001 中。

如果我读错了来源,请随时纠正我。

【讨论】:

  • 你有这个在 linux 上工作的权威来源吗?在手册页中(fchmod(3),而 fchmod(2) 根本不谈论套接字),行为被描述为未指定。
  • 我已经在 Linux 上测试了 fchmod()。没有一个组合(绑定之前,听之后)起作用。在所有情况下,它都返回 0 但没有更改文件权限。只有 chmod() 有效。
猜你喜欢
  • 2014-12-16
  • 2021-09-18
  • 2011-12-16
  • 2012-08-06
  • 1970-01-01
  • 1970-01-01
  • 2012-02-16
  • 2013-06-27
相关资源
最近更新 更多