[英]UNIX Socket permissions (Linux)
我在C中使用UNIX套接字來開發服務器。 從手冊:
在Linux實現中,文件系統中可見的套接字符合它們所在目錄的權限。可以更改其所有者,組和權限。 如果進程對創建套接字的目錄沒有寫入和搜索(執行)權限,則創建新套接字將失敗。連接到套接字對象需要讀/寫權限。 此行為與許多忽略UNIX域套接字權限的BSD派生系統不同。 便攜式程序不應依賴此功能來提高安全性。
我有一條世界可寫的道路。
$ ls -ld api
drwxrwxrwx 2 root www-data 4096 Feb 15 21:57 api
root下的進程在此路徑中創建一個套接字:
$ ls -l api/socket
srwxr-xr-x 1 root root 0 Feb 15 21:57 api/socket
由於權限問題,作為用戶運行的另一個進程無法連接到套接字。 如果我手動將套接字權限更改為每個人都可寫,那么其他進程可以成功連接。
1.為什么父權限不足以使套接字可寫,如文檔所述?
醫生說
連接到套接字對象需要讀/寫權限。
父權限僅與新套接字創建相關,而且所有文檔都說明了這一點:
如果進程對創建套接字的目錄沒有寫入和搜索(執行)權限,則創建新套接字將失敗。
您可以自由地使您的套接字可寫:
他們的所有者,組和他們的權限可以更改。
2.在這種情況下,最佳做法是什么?
創建一個套接字,並使其成為用戶( man 2 chown
)。 或者創建一個套接字,並使其可寫( man 2 chmod
)。
Unix套接字受進程的umask的影響,默認情況下,它可能是0022(默認情況下,它實際上是來自父進程的繼承屬性)。 這似乎反映在你的api / socket中。
如果您希望套接字可以寫入世界,那么最簡單的方法是讓應用程序在創建和綁定套接字之前調用它:
umask(0);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.