Linux和OpenBSD中getsockopt SO_PEERCRED的顺序不同
作者:互联网
我正在尝试在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架构上运行的.
解决方法:
我不是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源代码(使用getpeereid)查看update_client_creds()函数(3)OpenBSD和FreeBSD上的库函数,而不是直接SO_PEERCRED或LOCAL_PEERCRED).
在任何情况下,以这种方式获得的凭证将是在套接字上调用connect(2)或listen(2)的进程(可能不再存在的进程),而不一定是那些实际使用套接字的进程的凭证.写或读它.
标签:python,linux,openbsd,unix-sockets 来源: https://codeday.me/bug/20190816/1666176.html