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