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