2010-08-11 78 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 */ 
} 

當然,這是一個壞主意,如果你正在使用線程。