如何通过 Mac OS X 上的 Unix 域套接字传递用户凭据?

Posted

技术标签:

【中文标题】如何通过 Mac OS X 上的 Unix 域套接字传递用户凭据?【英文标题】:How can I pass user credentials through a Unix-domain socket on Mac OS X? 【发布时间】:2008-12-11 10:46:19 【问题描述】:

在许多操作系统下,Unix 域套接字允许一个进程以无法被恶意破坏的方式可靠地将其凭据传递给另一个进程。例如,这是在 Linux 上通过SO_PASSCRED and SO_PEERCRED options、FreeBSD 上的by passing messages that include the cmsgcred structure 和 NetBSD 上的by setting the LOCAL_CREDS option 完成的。但是,我还没有找到在 Mac OS X 下执行此操作的方法。相应的头文件 (socket.h) 似乎禁用了 Apple 构建的功能。

#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
#ifndef __APPLE__
// ...
struct cmsgcred 

有没有其他可以实现相同结果的 Mac OS X 工具的想法?

【问题讨论】:

【参考方案1】:

我从未使用过它,但我认为您正在寻找 LOCAL_PEERCRED。 (见 man unix)

您可以使用 Mac OS X 10.4 中引入的 LOCAL_PEERCRED 套接字选项来确认套接字另一端的程序的身份。

见Technical Note TN2083. Daemons and Agents

【讨论】:

确实,按照您的指示,我找到了 unix(4) 中记录的选项。谢谢!【参考方案2】:

更好的是,感谢接受的答案,我发现 getpeereid() 直接返回所需的数据。

【讨论】:

以上是关于如何通过 Mac OS X 上的 Unix 域套接字传递用户凭据?的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL 服务器发出 unix 域套接字

在 Linux 下将 TCP 流量重定向到 UNIX 域套接字

如何确定打开的套接字是 TCP 还是 unix 域套接字?

Mac OS X 上的超时命令?

Mac OS X 上的超时命令?

我如何获得在 unix 域套接字中排队的数据报数量