linux Python中的Unix套接字凭据传递

qyyhg6bp  于 2022-12-03  发布在  Linux
关注(0)|答案(2)|浏览(151)

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

8hhllhi2

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模块导出的,因此必须手动输入。虽然这些值不太可能更改,但也是可能的。使用这种方法的任何应用程序都应该考虑到这一点。

67up9zun

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})')

还更新为可重用(您不能将套接字绑定到已存在的文件名,因此我们在绑定之前和正常进程退出之后都清理套接字)

相关问题