我正在使用ZMQ在Red Hat Enterprise上运行客户端/服务器应用程序以进行消息传递。用于将客户端与服务器关联的IPC套接字是使用Unix域套接字实现的。
如果用户A启动服务器进程,则似乎只有用户A启动的客户端才能连接到该套接字并通过该套接字进行通信。我们的项目要求客户能够由不同的用户运营,因此这是一个主要的关键点。
套接字位于/ tmp / ipc_assoc,默认为755权限。 chmod
777无法解决问题。 chown
userB允许用户B访问套接字,但用户A则失去访问权限。甚至根也无法访问套接字。机器上没有使用ACL或SeLinux。
这是Unix域套接字的典型行为吗?有没有人想出如何解决它?
答案 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添加到公共用户组?