gpt4 book ai didi

c - 如何创建具有特定访问权限的 Unix 域套接字

转载 作者:太空狗 更新时间:2023-10-29 12:14:09 24 4
gpt4 key购买 nike

我有一种情况,我打算通过文件系统上的 UNIX 域套接字提供的命令接口(interface)与服务通信。我能够成功地向它发送命令,但有一段时间我很困惑为什么我无法收到对我的查询的任何响应。

事实证明,该服务没有足够的权限写入我(或操作系统)为其提供的地址。但是,我意识到,如果我显式绑定(bind) 到文件系统上的地址,那么我可以通过利用chmod 来调整文件权限。

类似于:

int mySocket;
struct sockaddr_un local_addr;

mySocket = socket(AF_UNIX, SOCK_DGRAM, 0);
local_addr.sun_family = AF_UNIX;
snprintf(local_addr.sun_path, 108 "/path/to/mySocket");

bind(mySocket, (struct sockaddr *) &local_addr, sizeof(struct sockaddr_un));
chmod("/path/to/mySocket", 777);

也就是说,如果没有最后的 chmod 步骤,服务将无法写入 mySocket,因为它没有适当的写入权限。显然,如果没有显式 bind 到特定地址,这是一个更难发现的问题,因为底层操作系统将为用户隐式生成此套接字 - 但它仍然存在并且 仍然 会有同样的访问问题。

那么,我的问题是关于这最后一步的。有没有办法允许操作系统为我的端点隐式生成套接字(即服务将响应的地址)但请求它被授予某些权限?


解释

这个问题成为问题的原因是程序的其他部分需要以 root 身份执行。因此,当我以 root 身份尝试connect/send 到后台服务时,操作系统将隐式创建一个地址,回复将定向到该地址。然而,这导致了我的套接字文件的问题,无论是隐式的还是使用 bind 创建的,都将具有像 srw- --- --- 这样的权限,所以另一个端点只有在他们也提升自己的情况下才能回复。

因此,如果我先bind 然后chmod 权限,问题就会消失,如上所示。

最佳答案

Is there a way to allow the OS to implicitly generate the socket for my endpoint (i.e. the address to which the service will respond) but request that it be given certain permissions?

我通过两次调用 umask() 解决了这个问题.

伪代码:

current_mask = umask(umask_to_be_used_on_afunix_socket_file_system_entry_creation);
bind afunix socket here
umask(current_umask);

关于c - 如何创建具有特定访问权限的 Unix 域套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31619445/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com