系统相关
首页 > 系统相关> > Linux和OpenBSD中getsockopt SO_PEERCRED的顺序不同

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