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

时间:2010-02-28 19:43:52

标签: c ubuntu ldap getpwnam

我在一些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()函数为中心,所以它与编程有关。我也谷歌了,但没有找到任何有用的东西,这就是为什么我倾向于认为这是我的设置。

2 个答案:

答案 0 :(得分:2)

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

显然,同一模块不能同时用于64位和32位。 Ubuntu Karmic在/lib32/libnss_ldap.so.2包中发送ia32-libs - 是否已安装?

答案 1 :(得分:0)

必须安装multilib和ia32库。

sudo apt-get install ia32-libs gcc-multilib

这里的类似答案:gcc cannot find bits/predefs.h on i686