SO_PEERCRED vs SCM_CREDENTIALS – 为什么有两个呢?

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

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

我应该使用什么?

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

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

  3. dbus守护进程似乎使用SO_PEERCREDgetpeereid() 。 我认为最好是复制他们的代码,以便可移植地获取凭据。

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

SO_PEERCRED返回套接字对等的凭证。 SCM_CREDENTIALS允许您传递您有权享有的任何凭据。 这是特别有价值的,因为内核会翻译id,所以一个pid命名空间中的任务可以发送一个pid来在另一个命名空间中处理,并确保接收到的pid将引用它所期望的相同进程。

如果你想要对方的凭证,那么使用SO_PEERCREDSCM_CREDENTIAL是调用者指定的凭证(它必须具有权限),而不一定是对等的凭证。