2

2 台の Ubuntu 64 ビット サーバーで ZABBIX エージェント (C で記述) をセットアップしています。特に64ビットが必要でない限り(データベースサーバーなど)、通常はすべて32ビットでコンパイルします。問題のサーバーは仮想サーバーをホストし、8GBのRAMを搭載するため、64ビットのままにしています。

ZABBIX エージェントが root として起動する場合、C の getpwnam() 関数を使用してルックアップする zabbix ユーザーのアクセス許可レベルにドロップダウンしようとします。

純粋な 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() 関数を中心にしているため、プログラミングに関連していると思いました。私もグーグルで調べましたが、役に立つものは何も見つかりませんでした。そのため、それが私の設定だと思う傾向があります。

4

2 に答える 2

2

従来とは異なる名前のルックアップ (つまり、単なる ではなく LDAP /etc/{passwd,shadow}) をサポートするために、libc はName Service Switchを使用します。一部のメソッドは libc に組み込まれておらず、個別にロードする必要があります/lib/libnss_ldap.so.2。たとえば、. これは、静的にリンクする場合、実際には非常に問題になります。そうしていませんよね?

明らかに、同じモジュールを 64 ビットと 32 ビットの両方に使用することはできません。Ubuntu Karmic/lib32/libnss_ldap.so.2はパッケージで出荷されますia32-libs– これはインストールされていますか?

于 2010-02-28T19:56:33.567 に答える