getpwnam в Ubuntu ведет себя иначе, если скомпилирован в 32-битной версии - PullRequest
2 голосов
/ 28 февраля 2010

Я устанавливаю агент 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, но не нашел ничего полезного, поэтому я склонен думать, что это мои настройки.

Ответы [ 2 ]

2 голосов
/ 28 февраля 2010

Для поддержки нетрадиционного поиска имен (то есть LDAP вместо просто /etc/{passwd,shadow}), libc использует переключатель службы имен . Некоторые методы не встроены в libc и должны загружаться отдельно: например, /lib/libnss_ldap.so.2. Это на самом деле довольно проблематично при статической привязке & ndash; ты этим не занимаешься?

Очевидно, что один и тот же модуль нельзя использовать как для 64-битных, так и для 32-битных. Корабли Ubuntu Karmic /lib32/libnss_ldap.so.2 в упаковке ia32-libs & ndash; это установлено?

0 голосов
/ 01 апреля 2014

Должны быть установлены как библиотеки multilib, так и ia32.

sudo apt-get install ia32-libs gcc-multilib

Аналогичный ответ здесь: gcc не может найти биты / prevfs.h на i686

...