如何在Python中完成Unix套接字凭证传递?
8hhllhi21#
关于这个主题的互联网搜索结果出奇的少。我想我应该把这个问题和答案贴在这里给其他对这个主题感兴趣的人。下面的客户端和服务器应用程序演示了如何在Linux上使用标准的python解释器来实现这一点。不需要任何扩展,但是由于使用了嵌入式常量,代码是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)
委托单位:
#!/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()
遗憾的是,SO_PEERCRED和SO_PASSCRED常量不是由python的socket模块导出的,因此必须手动输入。虽然这些值不太可能更改,但也是可能的。使用这种方法的任何应用程序都应该考虑到这一点。
67up9zun2#
下面是Rakis的www.example.com的Python 3版本server.py,它不使用硬编码的ID,也显示客户端的用户和组名:
#!/usr/bin/env python import os import atexit import grp import pwd import struct from socket import socket, AF_UNIX, SOCK_STREAM, SOL_SOCKET, SO_PEERCRED def remove_sock(): try: os.unlink('/tmp/pass_cred') except FileNotFoundError: pass remove_sock() atexit.register(remove_sock) 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) user_name = pwd.getpwuid(uid)[0] group_name = grp.getgrgid(gid)[0] print(f'pid={pid}, uid={uid}({user_name}), gid={gid}({group_name})')
还更新为可重用(您不能将套接字绑定到已存在的文件名,因此我们在绑定之前和正常进程退出之后都清理套接字)
2条答案
按热度按时间8hhllhi21#
关于这个主题的互联网搜索结果出奇的少。我想我应该把这个问题和答案贴在这里给其他对这个主题感兴趣的人。
下面的客户端和服务器应用程序演示了如何在Linux上使用标准的python解释器来实现这一点。不需要任何扩展,但是由于使用了嵌入式常量,代码是Linux特有的。
伺服器:
委托单位:
遗憾的是,SO_PEERCRED和SO_PASSCRED常量不是由python的socket模块导出的,因此必须手动输入。虽然这些值不太可能更改,但也是可能的。使用这种方法的任何应用程序都应该考虑到这一点。
67up9zun2#
下面是Rakis的www.example.com的Python 3版本server.py,它不使用硬编码的ID,也显示客户端的用户和组名:
还更新为可重用(您不能将套接字绑定到已存在的文件名,因此我们在绑定之前和正常进程退出之后都清理套接字)