簡體   English   中英

UNIX套接字權限(Linux)

[英]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. 在這種情況下,最佳做法是什么?

1.為什么父權限不足以使套接字可寫,如文檔所述?

醫生

連接到套接字對象需要讀/寫權限。

父權限僅與新套接字創建相關,而且所有文檔都說明了這一點:

如果進程對創建套接字的目錄沒有寫入和搜索(執行)權限,則創建新套接字將失敗。

您可以自由地使您的套接字可寫:

他們的所有者,組和他們的權限可以更改。

2.在這種情況下,最佳做法是什么?

創建一個套接字,並使其成為用戶( man 2 chown )。 或者創建一個套接字,並使其可寫( man 2 chmod )。

Unix套接字受進程的umask的影響,默認情況下,它可能是0022(默認情況下,它實際上是來自父進程的繼承屬性)。 這似乎反映在你的api / socket中。

如果您希望套接字可以寫入世界,那么最簡單的方法是讓應用程序創建和綁定套接字之前調用它:

umask(0);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM