代码之家  ›  专栏  ›  技术社区  ›  Andy Shellam

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

  •  2
  • Andy Shellam  · 技术社区  · 16 年前

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

    我已经模拟了一个小应用程序来证明这一点,但我希望这更多的是我的设置,而不是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 回复  |  直到 16 年前
        1
  •  2
  •   ephemient    16 年前

    为了支持非传统的名称查找(即LDAP而不是 /etc/{passwd,shadow} ),libc使用 Name Service Switch /lib/libnss_ldap.so.2 quite problematic

    显然,同一个模块不能同时用于64位和32位。因果报应船 /lib32/libnss_ldap.so.2 ia32-libs –是否安装了此功能?

        2
  •  0
  •   Community Mohan Dere    9 年前

    sudo apt-get install ia32-libs gcc-multilib
    

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