首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Linux和OpenBSD中getsockopt OpenBSD的不同顺序

在Linux和OpenBSD中getsockopt OpenBSD的不同顺序
EN

Unix & Linux用户
提问于 2019-01-24 23:34:52
回答 2查看 836关注 0票数 1

我试图在python中获取Unix套接字对等凭证。

我正在使用这段代码:

代码语言:javascript
复制
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体系结构上。

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2019-01-25 01:35:55

我不是python程序员,但我想您应该使用基于sys.platform的特例代码。

SO_PEERCRED不是一个标准化的接口,系统之间的实际结构/二进制接口是不同的。

在Linux上,如/usr/include/bits/socket.h中所定义的:

代码语言:javascript
复制
struct ucred {
        __u32   pid;
        __u32   uid;
        __u32   gid;
};

在OpenBSD上,如/usr/include/sys/socket.h中所定义的:

代码语言:javascript
复制
struct sockpeercred {
        uid_t           uid;            /* effective user id */
        gid_t           gid;            /* effective group id */
        pid_t           pid;
};

(uid_tgid_tpid_t在OpenBSD上也有32位)

其他系统(如solaris,FreeBSD)有一个完全不同的接口--对于某些以“系统无关”的方式获取对等凭据的代码,您可以从heimdal源代码中查看更新_客户端_creds()函数(它在OpenBSD和FreeBSD上使用getpeereid(3)库函数,而不是直接使用SO_PEERCREDLOCAL_PEERCRED)。

无论如何,以这种方式获得的凭据将是在套接字上调用connect(2)listen(2) (可能不再存在的进程)的进程的凭据,而不一定是通过向套接字写入或读取而实际使用该套接字的进程的凭据。

票数 2
EN

Unix & Linux用户

发布于 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级别”)。

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/496577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档