他のアプリで作成された既存のソケットのソケットオプションをご覧ください。
-
06-07-2019 - |
質問
既存のソケットに特定のソケットオプションが設定されているかどうかをテストします。すなわち、あなたが見ることができるほとんどすべて:
#!/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ソケットプログラミングに関するほとんどすべてのドキュメントは、新しいソケットの作成に関するものです。
解決
残念ながら、nailerの答えは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]
他のヒント
これはPythonでは不可能です。
Linuxカーネルは、TCPソケットの状態を報告するメカニズムを/ procfsに提供しません(BSDや他のUnixライクなOSとは異なります)。カーネルはこの情報を公開しないため、python-linux-procfsモジュールまたは同様のものを介して表示することはできません。
lsof FAQ item 3.14.1 を参照してください:
Q。 ‘なぜlsofが方言のソケットオプション、ソケット状態、TCPフラグと値を報告しないのですか?’。
A。 「ソケットオプション、ソケットの状態、TCPフラグと値は、/ procファイルシステムでは使用できません。」
ただし、SystemTapのネットワークtapsetは、プロセスによって設定されたソケットオプションをインターセプトするために使用できる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")
}
ソケットライブラリは、実際に新しいソケットを作成して操作します。他のプロセスで作成されたソケットは、明らかなセキュリティ上の理由で表示されません。ランダムなアプリケーションがあなた自身のソケットを管理する方法を変更したり、悪いことにあなたの前にソケットからデータを読み取ることは望ましくありません。したがって、ソケットはシステムオブジェクトであり、ハンドルによって参照され、(まともなOSでは)アクセス権が適用されます。そのため、他のプロセスによって作成された既存のソケットを一覧表示することはできません。
最終的に、ソケットハンドルを取得する方法を見つけるかもしれません(どこかに方法があるはずです、Windowsでシステムハンドルをリストする方法を見たことを覚えています)が、これはまだOSに非常に固有であるため、利用できない可能性がありますPythonでは、あなたはまだそれらのソケットで何かを実行する権利を持っていない可能性があります。
今、特定のアプリケーションが特定の機能をどのように達成したかを知りたいだけなら、他の方法があります:最も明白なのはプロキシまたはファイアウォールをインストールすることです(私のKerio WinRoute Firewallはソケットオプションをリストしたことを覚えています)、またはこの偉業を達成する方法についてstackoverflowに質問するだけです。