4

特定のソケットオプションが既存のソケットに設定されているかどうかをテストしたいと思います。つまり、あなたが見ることができるほとんどすべてのもの:

#!/usr/bin/env python
'''See possible TCP socket options'''

import socket

sockettypelist = [x for x in dir(socket) if x.startswith('SO_')]
sockettypelist.sort()
for sockettype in sockettypelist:
    print sockettype

既存のソケット、つまり他のプロセスによって作成されたソケットのオプションを確認する方法を知っている人はいますか?悲しいかな、Pythonソケットプログラミングについて読んだほとんどすべてのドキュメントは、新しいソケットの作成に関するものです。

4

3 に答える 3

2

これは Python では不可能です。

Linux カーネルは、TCP ソケットの状態を報告するためのメカニズムを /procfs に提供していません (BSD や他の Unix ライクな OS とは異なります)。カーネルはこの情報を公開しないため、python-linux-procfs モジュールなどを介して表示することはできません。

lsof FAQ 項目 3.14.1を参照してください。

Q. 「自分の方言のソケット オプション、ソケット状態、および TCP フラグと値が lsof によって報告されないのはなぜですか?」.

A. 「ソケット オプション、ソケット状態、および TCP フラグと値は、/proc ファイル システム経由では利用できません。」

ただし、SystemTap のネットワーク タップセットは、プロセスによって設定されたソケット オプションをインターセプトするために使用できる tcp.setsockopt ブレークポイントを提供しますが、これは python ではなく stap で処理されます。

必要なタップセットを次のように作成しました。

# Show sockets setting options

# Return enabled or disabled based on value of optval
function getstatus(optlen)
{
    if ( optlen == 1 )
        return "enabling"
    else
        return "disabling"
}

probe begin
{
    print ("\nChecking for apps making socket calls\n")
}

# See apps setting a socket option 
probe tcp.setsockopt
{
    status = getstatus(user_int($optval))
    printf ("  App '%s' (PID %d) is %s socket option %s... ", execname(), pid(), status, optstr)
}

# Check setting the socket option worked
probe tcp.setsockopt.return
{
    if ( ret == 0 )
        printf ("success")
    else
        printf ("failed")
    printf ("\n")    
}


probe end
{
    print ("\nClosing down\n")
}
于 2010-03-15T16:20:04.707 に答える
2

残念ながら、ネイラーの回答は SOL_TCP レベルのソケット オプションのみをキャッチし、SOL_SOCKET レベルのオプション (SO_KEEPALIVE など) はキャッチしません。

一部のディストリビューションには、systemtap と一緒にいくつかの例が同梱されています。それらの 1 つは、実行中のプロセスのソケットからソケット オプションを取得するために使用できる pfiles.stp です。ファイルの例:

$ ./pfiles.stp `pgrep udevd`
   787: udevd
  Current rlimit: 32 file descriptors
   0: S_IFCHR mode:0666 dev:0,15 ino:396 uid:0 gid:0 rdev:1,3
      O_RDWR|O_LARGEFILE 
      /dev/null
   1: S_IFCHR mode:0666 dev:0,15 ino:396 uid:0 gid:0 rdev:1,3
      O_RDWR|O_LARGEFILE 
      /dev/null
   2: S_IFCHR mode:0666 dev:0,15 ino:396 uid:0 gid:0 rdev:1,3
      O_RDWR|O_LARGEFILE 
      /dev/null
   3: S_IFDIR mode:0600 dev:0,9 ino:1 uid:0 gid:0 rdev:0,0
      O_RDONLY 
      inotify
   4: S_IFSOCK mode:0777 dev:0,4 ino:2353 uid:0 gid:0 rdev:0,0
      O_RDWR 
      socket:[2353]
      SO_PASSCRED,SO_TYPE(2),SO_SNDBUF(111616),SO_RCVBUF(111616)
        sockname: AF_UNIX
   5: S_IFSOCK mode:0777 dev:0,4 ino:2354 uid:0 gid:0 rdev:0,0
      O_RDWR 
      socket:[2354]
      SO_TYPE(2),SO_SNDBUF(111616),SO_RCVBUF(33554432)
        ulocks: rcv
   6: S_IFIFO mode:0600 dev:0,6 ino:2355 uid:0 gid:0 rdev:0,0
      O_RDONLY|O_NONBLOCK 
      pipe:[2355]
   7: S_IFIFO mode:0600 dev:0,6 ino:2355 uid:0 gid:0 rdev:0,0
      O_WRONLY|O_NONBLOCK 
      pipe:[2355]
于 2013-03-06T09:08:03.283 に答える
1

ソケット ライブラリは、新しいソケットを作成して操作するためのものです。他のプロセスで作成されたソケットは、明らかなセキュリティ上の理由から表示されません。自分のソケットを管理する方法をランダムなアプリケーションで変更したり、ソケットからデータを読み取ったりすることは望ましくありません。したがって、ソケットはハンドルによって参照されるシステム オブジェクトであり、(適切な OS では) アクセス権が適用されます。そのため、他のプロセスによって作成された既存のソケットを一覧表示することはできません。

最終的には、ソケット ハンドルを取得する方法が見つかるかもしれません (どこかに方法があるはずです。Windows でシステム ハンドルを一覧表示する方法を見たことを覚えています)。そして、それらのソケットで何も実行する権利がまだない場合があります。

特定のアプリケーションが特定の機能をどのように達成したかだけ知りたい場合は、他の方法があります。最も明白な方法は、プロキシまたはファイアウォールをインストールすることです (Kerio WinRoute ファイアウォールにソケット オプションがリストされていたことを覚えています)。この偉業を達成する方法について。

于 2009-10-24T14:30:34.127 に答える