12

SO_PEERCRED 是获取连接的 AF_UNIX 流套接字的 pid/uid/gid 的简单方法,SCM_CREDENTIALS 或多或少相同,但更复杂(各种辅助消息)。显示两种方式的示例链接

  1. 为什么有两种方法可以获取或多或少相同的信息?
  2. 为什么更舒适的 SO_PEERCRED 没有在 unix(7) 联机帮助页中列出?
  3. 哪个在实际应用中使用得更多?

我应该使用什么?

4

2 回答 2

11
  1. 如果我理解正确,两者之间存在细微差别。SO_PEERCRED检索对等进程的凭据,而不需要来自对等进程的任何交互。相反,SCM_CREDENTIALS是一种发送/接收对等进程凭据的机制,然后由内核检查。当进程以 UID 0 运行时,这种细微的差异可能很重要。SCM_CREDENTIALS允许以 UID 0 运行的进程声明自己的特权较低(例如,UID 50),而对于SO_PEERCRED.

  2. 看上面。我想SCM_CREDENTIALS鼓励使用,SO_PEERCRED仅支持兼容性。

  3. dbus 守护进程似乎使用SO_PEERCREDand getpeereid()。我认为最好复制他们的代码以便便携地获取凭据。

http://cgit.freedesktop.org/dbus/dbus/tree/dbus/dbus-sysdeps-unix.c?id=edaa6fe253782dda959d78396b43e9fd71ea77e3

于 2012-06-26T18:16:24.467 回答
3

SO_PEERCRED返回套接字对等方的凭据。SCM_CREDENTIALS允许您传递您拥有特权的任何凭据。这特别有价值,因为内核将转换 id,因此一个 pid 命名空间中的任务可以发送一个 pid 到另一个命名空间中的进程,并确保接收到的 pid 将引用它预期的同一进程。

如果您想要对等方的凭据,请使用SO_PEERCRED. SCM_CREDENTIAL是调用者指定的凭证(它确实必须拥有特权),不一定是对等方的凭证。

于 2017-05-18T02:59:23.197 回答