【问题标题】:getpwnam on Ubuntu behaves differently if compiled in 32-bit如果以 32 位编译,Ubuntu 上的 getpwnam 行为会有所不同
【发布时间】:2010-02-28 19:43:51
【问题描述】:

我正在几个 Ubuntu 64 位服务器上设置 ZABBIX 代理(用 C 编写)。我通常以 32 位编译所有内容,除非我特别需要 64 位(例如数据库服务器)。有问题的服务器将托管虚拟服务器并具有 8GB 内存,因此我将它们保留为 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() 函数为中心,它与编程更相关。我也用谷歌搜索过,但没有发现任何有用的东西,这就是为什么我倾向于认为这是我的设置。

【问题讨论】:

  • 为什么需要在 64 位机器上编译成 32 位?
  • getent passwd zabbix 就足够了,不需要grep ;-)
  • @Nikolai - 因为服务器托管虚拟机,我需要在主机操作系统中使用尽可能少的内存占用,并且 ZABBIX 代理是一个很小的应用程序。 @ephemient - 不知道,谢谢!

标签: c ubuntu ldap getpwnam


【解决方案1】:

为了支持非传统名称查找(即 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——安装了吗?

【讨论】:

  • 不是静态链接,我知道(使用 ZABBIX 的配置脚本。)安装 ia32-libs 工作,谢谢。我认为 64 位系统自动包含对 32 位应用程序的支持。
【解决方案2】:

必须安装 multilib 和 ia32 库。

sudo apt-get install ia32-libs gcc-multilib

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

【讨论】:

    猜你喜欢
    • 2013-10-20
    • 1970-01-01
    • 2012-08-30
    • 2012-10-22
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多