Unix套接字凭证在Python中传递

Rak*_*kis 10 python sockets linux credentials

如何在Python中完成Unix套接字凭证传递?

Rak*_*kis 20

关于这一主题的互联网搜索得出的结果令人惊讶.我想我会在这里发布问题并回答其他对这个主题感兴趣的人.

以下客户端和服务器应用程序演示了如何使用标准python解释器在Linux上完成此任务.不需要扩展,但由于使用了嵌入式常量,代码是特定于Linux的.

服务器:

#!/usr/bin/env python

import struct
from socket import socket, AF_UNIX, SOCK_STREAM, SOL_SOCKET

SO_PEERCRED = 17 # Pulled from /usr/include/asm-generic/socket.h

s = socket(AF_UNIX, SOCK_STREAM)

s.bind('/tmp/pass_cred')
s.listen(1)

conn, addr = s.accept()

creds = conn.getsockopt(SOL_SOCKET, SO_PEERCRED, struct.calcsize('3i'))

pid, uid, gid = struct.unpack('3i',creds)

print 'pid: %d, uid: %d, gid %d' % (pid, uid, gid)
Run Code Online (Sandbox Code Playgroud)

客户:

#!/usr/bin/env python

from socket import socket, AF_UNIX, SOCK_STREAM, SOL_SOCKET

SO_PASSCRED = 16 # Pulled from /usr/include/asm-generic/socket.h

s = socket(AF_UNIX, SOCK_STREAM)

s.setsockopt(SOL_SOCKET, SO_PASSCRED, 1)

s.connect('/tmp/pass_cred')

s.close()
Run Code Online (Sandbox Code Playgroud)

不幸的是,SO_PEERCRED和SO_PASSCRED常量不会被python的套接字模块导出,所以必须手动输入它们.虽然这些值不太可能改变,但这是可能的.任何使用此方法的应用程序都应考虑这一点.

  • 我会给你+1,但一方面,这实际上不是凭证传递.`SO_PASSCRED`允许接收(不发送)凭证,但这些凭证使用`sendmsg`和ancillarry`SCM_CREDENTIALS`消息发送.你正在阅读不依赖于它的`SO_PEERCRED`,只是套接字是一个unix域套接字或是由`socketpair`创建的.并且只获取当前凭据(root可以发送与其他用户匹配的凭证消息) (3认同)
  • 我认为SO_PEERCRED和SO_PASSCRED现在在套接字模块中(至少在3.3中).添加时没有找到.我确实记得他们在一年前第一次找到这篇文章时不在场...... (2认同)