SO_PEERCRED 是获取连接的 AF_UNIX 流套接字的 pid/uid/gid 的简单方法,SCM_CREDENTIALS 或多或少相同,但更复杂(各种辅助消息)。显示两种方式的示例链接。
- 为什么有两种方法可以获取或多或少相同的信息?
- 为什么更舒适的 SO_PEERCRED 没有在 unix(7) 联机帮助页中列出?
- 哪个在实际应用中使用得更多?
我应该使用什么?
SO_PEERCRED 是获取连接的 AF_UNIX 流套接字的 pid/uid/gid 的简单方法,SCM_CREDENTIALS 或多或少相同,但更复杂(各种辅助消息)。显示两种方式的示例链接。
我应该使用什么?
如果我理解正确,两者之间存在细微差别。SO_PEERCRED
检索对等进程的凭据,而不需要来自对等进程的任何交互。相反,SCM_CREDENTIALS
是一种发送/接收对等进程凭据的机制,然后由内核检查。当进程以 UID 0 运行时,这种细微的差异可能很重要。SCM_CREDENTIALS
允许以 UID 0 运行的进程声明自己的特权较低(例如,UID 50),而对于SO_PEERCRED
.
看上面。我想SCM_CREDENTIALS
鼓励使用,SO_PEERCRED
仅支持兼容性。
dbus 守护进程似乎使用SO_PEERCRED
and getpeereid()
。我认为最好复制他们的代码以便便携地获取凭据。
SO_PEERCRED
返回套接字对等方的凭据。SCM_CREDENTIALS
允许您传递您拥有特权的任何凭据。这特别有价值,因为内核将转换 id,因此一个 pid 命名空间中的任务可以发送一个 pid 到另一个命名空间中的进程,并确保接收到的 pid 将引用它预期的同一进程。
如果您想要对等方的凭据,请使用SO_PEERCRED
. SCM_CREDENTIAL
是调用者指定的凭证(它确实必须拥有特权),不一定是对等方的凭证。