2

発信者の名前に応じてNSSモジュールの応答を作成しています。たとえば、sshdがを呼び出すgetpwnam_r(...)場合、pw_shell/ bin/bashになります。telnetdが呼び出す場合getpwnam_r(...)pw_shell/ bin/kshになります。

プロトタイプが作成され、動作します。ただし、nscdが実行されていてキャッシュがホットの場合、モジュールの関数は呼び出されません。nscdのキャッシュされた結果は、すべての呼び出し元に返されます。nscdは、結果に対する唯一の変数が時間であると想定しています。プロセス名が結果に影響を与えるとは考えていません。

nscdをオーバーライドするデーモンまたはモジュールを作成できるとすると、コードはプロセス名が私のリストにあるかどうかを確認する必要があります。リストにある場合は、nscdをスキップしてください。それ以外の場合は、nscdに回答させてgetpwnam_r(...)ください。

出来ますか?


編集:あまり好ましくありませんが、OKの代替手段は、呼び出し時にnscdgetpwnam_r(...)をバイパスすることです。

4

2 に答える 2

1

nscd への呼び出しは標準ライブラリに組み込まれているため、マップ関連の関数 (getpwnam()、gethostbyname() など) を呼び出すと、最初に nscd が照会されます。唯一の解決策は、nscd をオフにするか、独自のものを作成することです。

これは、getent と strace を使用して確認できます。

strace -ttt getent passwd

他の人が nscd の代替品を書いています - Google の gnscd、BusyBox の unscd。したがって、nscd を無効にできない場合は、書き換える必要があります....

于 2012-02-25T16:43:27.820 に答える
0

はい。少しハックですが、プロセスごとにnscdをバイパスすることは可能です。

glibcのソース コードを確認すると、 __nss_disable_nscdという関数があることがわかります。これはnscd (またはunscd ) によって使用され、再帰的にならないようにします。

unscdの例の方が読みやすいでしょう。http://busybox.net/~vda/unscd/nscd-0.51.cを参照してください。

于 2014-06-03T03:55:42.680 に答える