2

我正在几个 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() 函数为中心,它与编程更相关。我也用谷歌搜索过,但没有发现任何有用的东西,这就是为什么我倾向于认为这是我的设置。

4

2 回答 2

2

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

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

于 2010-02-28T19:56:33.567 回答
0

必须安装 multilib 和 ia32 库。

sudo apt-get install ia32-libs gcc-multilib

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

于 2014-03-31T21:55:24.533 回答