gpt4 book ai didi

c - 如果以 32 位编译,Ubuntu 上的 getpwnam 行为会有所不同

转载 作者:太空宇宙 更新时间:2023-11-03 23:36:29 25 4
gpt4 key购买 nike

我正在几个 Ubuntu 64 位服务器上设置 ZABBIX 代理(用 C 语言编写)。我通常以 32 位编译所有内容,除非我特别需要 64 位(例如数据库服务器)。有问题的服务器将托管虚拟服务器并具有 8GB RAM,因此我将它们保留为 64 位。

如果 ZABBIX 代理以 root 身份启动,它会尝试下拉到 zabbix 用户的权限级别,它使用 C getpwnam() 函数查找。

在纯 32 位系统上,此函数起作用。但是,当在 64 位系统上以 32 位编译时,getpwnam() 在用户确实存在时返回 NULL。如果在 64 位系统上以 64 位编译,它工作正常。

我模拟了一个小应用程序来证明这一点,但我希望它更多的是我的设置而不是 GCC 或 STL 中的错误 - zabbix 用户在 LDAP 目录中。

首先是这个程序的输出:

root@sydney:/tmp# getent passwd|grep zabbix
zabbix:x:1500:1500:Zabbix Service:/home/zabbix:/bin/bash

root@sydney:/tmp# gcc main.c
root@sydney:/tmp# ./a.out
User zabbix exists with UID 1500.

root@sydney:/tmp# gcc -m32 main.c
root@sydney:/tmp# ./a.out
User zabbix does not exist.

这是我使用 ZABBIX 代理源代码改编的小程序的代码。

#include <stdio.h>
#include <stdlib.h>
#include <pwd.h>

int main(int num_args, char** args)
{
struct passwd *pwd;
char user[7] = "zabbix";

pwd = getpwnam(user);
if (NULL == pwd)
{
fprintf(stdout, "User %s does not exist.\r\n", user);
return 1;
}
else
{
fprintf(stdout, "User %s exists with UID %d.\r\n", user, pwd->pw_uid);
}

return 0;
}

如果这证明是我的设置问题,我很乐意在 serverfault.com 上询问,但我认为它以 getpwnam() 函数为中心,它与编程相关。我也谷歌了但没有发现任何有用的东西,这就是为什么我倾向于认为这是我的设置。

最佳答案

为了支持非传统名称查找(即 LDAP 而不仅仅是 /etc/{passwd,shadow}),libc 使用 Name Service Switch .有些方法没有内置到 libc 中,必须单独加载:例如 /lib/libnss_ldap.so.2。这实际上是 quite problematic当静态链接时——你没有这样做,是吗?

显然,同一个模块不能同时用于 64 位和 32 位。 Ubuntu Karmic 在 ia32-libs 包中提供了 /lib32/libnss_ldap.so.2 – 安装了吗?

关于c - 如果以 32 位编译,Ubuntu 上的 getpwnam 行为会有所不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2352373/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com