用户无法访问UNIX域套接字?

时间:2010-08-11 11:55:48

标签: linux sockets

我正在使用ZMQ在Red Hat Enterprise上运行客户端/服务器应用程序以进行消息传递。用于将客户端与服务器关联的IPC套接字是使用Unix域套接字实现的。

如果用户A启动服务器进程,则似乎只有用户A启动的客户端才能连接到该套接字并通过该套接字进行通信。我们的项目要求客户能够由不同的用户运营,因此这是一个主要的关键点。

套接字位于/ tmp / ipc_assoc,默认为755权限。 chmod 777无法解决问题。 chown userB允许用户B访问套接字,但用户A则失去访问权限。甚至根也无法访问套接字。机器上没有使用ACL或SeLinux。

这是Unix域套接字的典型行为吗?有没有人想出如何解决它?

4 个答案:

答案 0 :(得分:4)

chmod(s.sun_path,0777); 听完套接字。

domain = AF_UNIX;
name = servname;
port = -1;

n = MakeLocalSocket(s);
if (n == 0) {
    fatal("can't create socket");
}

unlink(s.sun_path);

if (bind(fd, & s, n) < 0) {
    fatal("can't bind socket");
}

if (listen(fd, 5) != 0) {
    fatal("can't listen to socket");
}

/* UNIX domain sockets need to be mode 777 on 4.3 */
chmod(s.sun_path, 0777);

答案 1 :(得分:2)

暂时改变umask:

mode_t umask_ = umask(0000); /* let the socket be mode 0777 so that other users can connect */
int err = bind(fd, (struct sockaddr *)&unix_bind_addr, sizeof(unix_bind_addr));
umask(umask_); /* restore old umask (0777 is a pretty bad choice for normal stuff) */
if (err) {
  /* handle bind error here */
}

当然,如果您使用线程,这是一个坏主意。

答案 2 :(得分:1)

在ZMQ邮件列表的帮助下,我做了一个工作。这很难看,但似乎一直都在努力。

我必须在/ tmp和chmod 777下创建一个子目录。服务器现在在该新文件夹中创建套接字。它还以编程方式chmod 777套接字。现在,只要服务器以root身份运行,任何用户都可以运行客户端并与服务器通信。

我不知道为什么UNIX域套接字会以这种方式运行,但确实很烦人。

答案 3 :(得分:0)

您是否尝试将UserS和User添加到公共用户组?