python - 在 Python 中传递的 Unix 套接字凭证

标签 python linux sockets credentials

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

最佳答案

关于此主题的互联网搜索得出的结果少得惊人。我想我会在这里发布问题和答案,以供对此主题感兴趣的其他人使用。

以下客户端和服务器应用程序演示了如何使用标准 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)

客户:

#!/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 的套接字模块导出,因此必须手动输入它们。尽管这些值不太可能改变,但有可能改变。任何使用此方法的应用程序都应考虑这一点。

关于python - 在 Python 中传递的 Unix 套接字凭证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7982714/

相关文章:

Python 3 怪除法

linux - 在 Linux 上设置 tmpfile() 的目录

linux - 如何识别从您的用户帐户提供的工作并将其终止

python - 如何只打印字典中的一项

python - 使用 Python 在后台下载文件

c++ - Windows 套接字 WSACleanup C++

c - Nginx 代理模块和套接字描述符传递

node.js - 当客户端发出时如何测试 socket.io 服务器

python - Google App Engine os.environ 更改需要重新加载模块

linux - 如何从docker swarm中的管理器中删除服务