2017-06-13 10 views
2

Solarisでは、特定のプロセス(sshdセッション)が使用しているIPアドレスを取得する必要があります。
彼らはどのようにLinux上でそれをしますか?
/proc/ProcessId/fd /にあるプロセスファイル記述子を反復する
反復ファイル記述子がソケットの場合、readlink、open、および最後にファイル記述子を読み込みます。ファイル記述子がsolaris 11.0のソケットであるかどうかを検出し、IPアドレスを抽出する

したがってsolarisでは、プロセスのソケットファイル記述子を検出できます。私はgetpeername(..)のような方法がありました

int fd=NULL; 
struct dirent *dentp; 
while ((dentp = readdir(dirp)) != NULL) { //iterate file descriptors 
    fd = atoi(dentp->d_name); 
    struct stat statb; 
    char temp_dir_path [100]; 
    if (stat(temp_dir_path, &statb) != -1) 
    { 
     if (S_ISSOCK(statb.st_mode)) 
     { 
     //What to do here ?? temp_dir_path is /proc/12345/fd/4 

、のgetsockname(..)彼らは私が他のプロセスのファイル記述子を読みたい、現在のコンテキストのプロセスのファイルディスクリプタのparamとして受け取ります。
ファイルディスクリプタを開いてstruct sockaddr_inにキャストできますか?

ソケットファイルディスクリプタの構造は、LinuxおよびSolarisの間で異なっている..私は私は

答えて

2

lsofを/彼らはPFILEで行うものは何でもする必要が推測私はgetpeername(..)、のgetsockname(のような方法がありました..)彼らは現在のコンテキストプロセスのファイル記述子をparamとして受け取り、別のプロセス用のファイル記述子を読みたい。 ファイルディスクリプタを開いてstruct sockaddr_inにキャストできますか?

いいえ。あなたは、あなたが得ることをopen()し、ファイルディスクリプタにopen()リターンを使用して、ファイルディスクリプタにgetpeername()getsockname()を使用して試すことができます。それはうまくいくかもしれない。

おそらく、pfilesの方法を使用するとより効果的になるでしょう。 Per the pfiles man page

たpfiles

レポートfstat(2)と 各プロセスで開いているすべてのファイルについてfcntl(2)情報。 ネットワークエンドポイントの場合、ローカル(および接続の場合は が接続されている)アドレス情報も提供されます。ソケットの場合、 ソケットタイプ、ソケットオプション、送受信バッファサイズも です。さらに、/ proc/pid/pathから の情報を入手できる場合は、ファイルへのパスが報告されます。これは必ずしもファイルを開くのに使用される同じ名前の ではありません。詳細は、proc(4)を参照してください。コードはhttp://src.illumos.org/source/xref/illumos-gate/usr/src/cmd/ptools/pfiles/pfiles.c

のSolarisで発見することができます

pfiles源は何が必要ありませんlibprocインタフェース・ライブラリを提供します。 pfilesはそれを使用します - ライブラリはpr_getpeername()pr_getsockname()のようなコールを提供します。実装を見ることができますhttp://src.illumos.org/source/xref/illumos-gate/usr/src/lib/libproc/common/pr_getsockname.c

カーネルから直接必要なものを得るための実際のシステムコールがあります。libprocライブラリの

オープン、Solarisのmanページには、彼らは、Solaris 11 libproc実装と実質的に類似である可能性が高いhttp://illumos.org/man/3proc/allで見つけることができます。

これらのツールを使用するには、本当に注意する必要があります。 the Pgrab man page for the function used to grab a processから:

プロセスを取得することは、破壊的な操作です。プロセスを停止すると、すべてのスレッドが実行されなくなります( )。プロセスを停止することによる影響は、そのプロセスの目的上、 に依存します。たとえば、主に計算を実行するプロセス を停止すると、その計算は、停止している時間全体で遅れて になります。ただし、これが アクティブなTCPサーバーの場合は、受け入れバックログが満たされ、接続エラー が発生し、接続タイムアウトエラーが発生する可能性があります。

グラブされたプロセスを停止して読み取り専用にしないオプションもあります。

+0

私は明日仕事で確認してください...私は、ターゲットプロセスの子プロセスからファイルディスクリプタをopen()しようとしたとき、-1を返しました – ilansch

+0

* easy *ソリューションは 'popen(" pfiles 1234 "、" r); "と出力を解析するだけです。これは、文書化されていないSolarisシステムの実装に依存しないという利点があります。 –

+0

これはバッチスクリプトからでも行うことができますが、 pfilesはプロセスを検査している間中断しているので良いです。私はすぐに読み込みが必要なので、一時停止を避けたい。 – ilansch

関連する問題