我想创建一个限于特定组的Unix域套接字。因此,我理想地要做的是(忽略错误检查)类似:
// Set the "address" (ie filesystem path)
struct sockaddr_un addr;
memset(&addr, 0, sizeof(addr));
addr.sun_family = AF_UNIX;
strcpy(addr.sun_path, "./my.sock");
int fd = socket(AF_UNIX, SOCK_DGRAM, 0); // create the socket
// Set the group owner and permissions
fchmod(fd, 0770); // This seems to succeed
fchown(fd, -1, wanted_group_id); // Silently fails
// Create the filesystem entry
bind(fd, (struct sockaddr *)&addr, sizeof(addr));
但是,fchown
在套接字上没有效果,因此,chown
事后看来,这是设置组的唯一方法。我想避免使套接字临时可供不应被允许访问的进程访问。
我最好的主意是:
int fd = socket(...);
fchmod(fd, 0700); // Remove group permissions
bind(fd, ...); // Create fs entry
chown("./my.sock", -1, wanted_group_id); // set the correct group owner
fchmod(fd, 0770); // And restore group permissions
当然,要使用Unix套接字,这是很常见的事情,并且有一种规范的方法可以实现这一点,但是我还没有找到明确的答案。
我只对Linux真正感兴趣,但是对仅依赖POSIX的东西有加分。
这样做的方法是将套接字放入具有正确权限的目录中。目录可以原子地创建(或重命名),一旦目录存在,套接字本身的权限就不是很重要。这在Unix上也适用,在Unix上并不总是尊重套接字本身的权限。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句