Я устанавливаю агент ZABBIX (написанный на C) на нескольких 64-битных серверах Ubuntu. Я обычно компилирую все в 32-битной среде, если только мне не нужны 64-битные (например, серверы баз данных). На этих серверах будут размещаться виртуальные серверы и 8 ГБ ОЗУ, поэтому я и оставил их 64-битными.
Если агент ZABBIX запускается от имени пользователя root, он пытается раскрыться до уровня разрешений пользователя zabbix, который он ищет с помощью функции C getpwnam ().
В чисто 32-битной системе эта функция работает. Однако при компиляции в 32-битной системе на 64-битной системе getpwnam () возвращает NULL, когда пользователь существует. Если он скомпилирован в 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 (), она больше связана с программированием. Я также Google, но не нашел ничего полезного, поэтому я склонен думать, что это мои настройки.