我有一种情况,我打算通过文件系统上UNIX域套接字提供的命令接口与服务进行通信。我能够成功发送命令,但是对于为什么我无法收到对查询的任何响应感到困惑。
事实证明,该服务没有足够的权限来写入为其提供的地址I(或OS)。但是,我意识到,如果我明确地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
指向特定地址,这将是一个更难发现的问题,因为底层操作系统将为用户隐式生成此套接字-但它仍然存在并且仍将具有相同的访问问题。
那么,我的问题是关于这一最后步骤的。有没有一种方法可以允许OS隐式为我的端点生成套接字(即服务将响应的地址),但是要求给它一定的权限?
说明
此问题成为问题的原因是由于要求以root用户身份执行程序的其他部分。这样,当我以root用户身份尝试connect
/send
进入后台服务时,操作系统将隐式创建一个地址,并将回复定向到该地址。但是,这导致了一个问题,即我的套接字文件(无论是隐式的还是由创建的bind
)都将具有像srw- --- ---
这样的权限,因此,其他端点也只能在自身提升时进行回复。
因此,如果我先解决问题bind
,然后再chmod
获得上面显示的权限,问题就解决了。
有没有一种方法可以允许OS隐式为我的端点生成套接字(即服务将响应的地址),但是要求给它一定的权限?
一旦使用两次调用,我就解决了这个问题umask()
。
伪代码:
current_mask = umask(umask_to_be_used_on_afunix_socket_file_system_entry_creation);
bind afunix socket here
umask(current_umask);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句