UNIX套接字权限(Linux)

And*_*sov 3 c unix sockets linux

我在C中使用UNIX套接字开发服务器。从手册中:

在Linux实现中,文件系统中可见的套接字使用per?所在目录的任务。可以更改其所有者,组和权限。如果进程在创建套接字所在的目录上没有写和搜索(执行)权限,则创建新套接字将失败。连接到套接字对象需要读/写权限。此行为与许多BSD衍生系统不同,后者忽略UNIX域套接字的权限。可移植程序不应依赖此功能来保证安全性。

我有一条世界可写的道路。

    $ ls -ld api
    drwxrwxrwx 2 root www-data 4096 Feb 15 21:57 api
Run Code Online (Sandbox Code Playgroud)

根目录下的进程在此路径中创建一个套接字:

    $  ls -l api/socket
    srwxr-xr-x 1 root root 0 Feb 15 21:57 api/socket
Run Code Online (Sandbox Code Playgroud)

由于权限问题,以用户身份运行的另一个进程无法连接到套接字。如果我手动将套接字权限更改为每个人都可写,则其他进程可以成功连接。

  1. 为什么像文档所说的那样,父级权限不足以使套接字可写?
  2. 在这种情况下,最佳做法是什么?

小智 6

Unix 套接字受进程的 umask 影响,默认情况下,它可能是 0022(默认情况下,它实际上是从父进程继承的属性)。这似乎反映在您的 api/socket 中。

如果您希望您的套接字世界可写,最简单的方法是让您的应用程序创建和绑定套接字之前调用它:

umask(0);
Run Code Online (Sandbox Code Playgroud)


Ama*_*dan 5

1.为什么父权限不足以使套接字可写,如文档所述?

医生

连接到套接字对象需要读/写权限。

父权限仅与创建新的套接字有关,而这就是文档所说的:

如果进程对创建套接字的目录没有写和搜索(执行)权限,则创建新套接字将失败。

您可以随意使套接字可写:

可以更改其所有者,组及其权限。

2.在这种情况下,最佳做法是什么?

创建一个套接字,并使其成为用户的(man 2 chown)。或创建一个套接字,使其可写(man 2 chmod)。