2010-08-11 64 views
6

我在红帽企业版上使用ZMQ在消息传递上运行客户端/服务器应用程序。用于将客户端与服务器相关联的IPC套接字使用Unix域套接字来实现。UNIX域套接字不可跨用户访问?

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

套接字位于具有默认755权限的/ tmp/ipc_assoc。 chmod 777不能解决问题。 chown userB允许用户B访问套接字,但用户A则失去访问权限。即使root也不能访问套接字。机器上没有使用ACL或SeLinux。

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

回答

1

在ZMQ邮件列表的帮助下,我做了一个解决。这很丑陋,但似乎一直工作。

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

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

+0

为什么777可以工作,而770不可用?我很困惑,我已经把两个用户都放在同一个团队中,也没有去... – knocte 2016-08-06 09:50:06

0

您是否尝试将UserA和UserB添加到普通用户组中?

+0

每个人似乎都已经在同一组中。 – 2010-08-11 12:18:32

+0

是不同权限的另一个文件的符号链接? – 2010-08-11 12:33:00

+0

不,如果你在套接字上运行'ls -l',它会打印出“srwxr-xr-x ... ipc_assoc” – 2010-08-11 14:22:10

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); 
+0

为什么777能工作而770不能?我很困惑,我已经把两个用户放在同一个团队中,不去... – knocte 2016-08-06 09:49:44

+0

不确定。但是,根据http://man7.org/linux/man-pages/man7/unix.7.html的说法,“POSIX不会对权限对套接字文件以及某些系统(例如,旧的BSD),套接字权限将被忽略。便携式程序不应该依赖此功能来保证安全。“ – Homer6 2016-08-07 06:06:32

+0

实际上,我解决了这个问题:我添加到组中的用户必须重新登录才能使更改生效!但感谢您的评论 – knocte 2016-08-07 06:39:21

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 */ 
} 

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