我试图在python中获取Unix套接字对等凭证。
我正在使用这段代码:
peercred = conn.getsockopt(socket.SOL_SOCKET, socket.SO_PEERCRED, struct.calcsize("3i"))
pid, uid, gid = struct.unpack("3i", peercred)这在Linux中是正确的,但是在OpenBSD中顺序是不同的。在OpenBsd中,顺序是[uid, gid, pid]。
是什么造成了这种差异?我怎么知道什么时候该使用哪种订单?
我尝试过的linux系统运行在x86_64体系结构上,openbsd系统运行在amd64体系结构上。
发布于 2019-01-25 01:35:55
我不是python程序员,但我想您应该使用基于sys.platform的特例代码。
SO_PEERCRED不是一个标准化的接口,系统之间的实际结构/二进制接口是不同的。
在Linux上,如/usr/include/bits/socket.h中所定义的:
struct ucred {
__u32 pid;
__u32 uid;
__u32 gid;
};在OpenBSD上,如/usr/include/sys/socket.h中所定义的:
struct sockpeercred {
uid_t uid; /* effective user id */
gid_t gid; /* effective group id */
pid_t pid;
};(uid_t、gid_t和pid_t在OpenBSD上也有32位)
其他系统(如solaris,FreeBSD)有一个完全不同的接口--对于某些以“系统无关”的方式获取对等凭据的代码,您可以从heimdal源代码中查看更新_客户端_creds()函数(它在OpenBSD和FreeBSD上使用getpeereid(3)库函数,而不是直接使用SO_PEERCRED或LOCAL_PEERCRED)。
无论如何,以这种方式获得的凭据将是在套接字上调用connect(2)或listen(2) (可能不再存在的进程)的进程的凭据,而不一定是通过向套接字写入或读取而实际使用该套接字的进程的凭据。
发布于 2019-01-25 01:54:48
您可以使用cffi和"API级“方法。这需要一个C编译器,尽管可以在兼容的系统上进行编译,然后再使用结果。
https://cffi.readthedocs.io/en/latest/overview.html#api-mode-calling-the-c-standard-library
请注意,这与
struct passwd的精确C布局无关(它是“API级别”,而不是“ABI级别”)。
https://unix.stackexchange.com/questions/496577
复制相似问题