8
Unixソケット資格情報の受け渡しはPythonでどのように行われますか?Pythonで渡すUnixソケット資格情報
Unixソケット資格情報の受け渡しはPythonでどのように行われますか?Pythonで渡すUnixソケット資格情報
このトピックに関するインターネット検索は驚くほどわずかな結果しか得られませんでした。私は、このトピックに興味を持っている他の人のために質問を投稿し、ここに答えたいと思った。
次のクライアントおよびサーバーアプリケーションは、Linuxで標準のPythonインタープリタを使用してこれを実行する方法を示しています。拡張は必要ありませんが、埋め込み定数を使用するため、コードはLinux固有のものです。
サーバー:
#!/usr/bin/env python
import struct
from socket import socket, AF_UNIX, SOCK_STREAM, SOL_SOCKET
SO_PEERCRED = 17 # Pulled from /usr/include/asm-generic/socket.h
s = socket(AF_UNIX, SOCK_STREAM)
s.bind('/tmp/pass_cred')
s.listen(1)
conn, addr = s.accept()
creds = conn.getsockopt(SOL_SOCKET, SO_PEERCRED, struct.calcsize('3i'))
pid, uid, gid = struct.unpack('3i',creds)
print 'pid: %d, uid: %d, gid %d' % (pid, uid, gid)
クライアント:
彼らは手で入力する必要がありますので、#!/usr/bin/env python
from socket import socket, AF_UNIX, SOCK_STREAM, SOL_SOCKET
SO_PASSCRED = 16 # Pulled from /usr/include/asm-generic/socket.h
s = socket(AF_UNIX, SOCK_STREAM)
s.setsockopt(SOL_SOCKET, SO_PASSCRED, 1)
s.connect('/tmp/pass_cred')
s.close()
残念ながら、SO_PEERCREDとSO_PASSCRED定数はPythonのソケットモジュールによってエクスポートされません。これらの値は変わることはありませんが、可能です。これは、このアプローチを使用するアプリケーションで考慮する必要があります。
私は彼らがいつも変わるとは思わない。この場合、既存のアプリケーションはすべて再コンパイルする必要があります...しかし、いくつかのOSやいくつかのプラットフォームでは異なるかもしれません。 – glglgl
私はあなたに+1しますが、実際には信任状を渡すことではありません。 'SO_PASSCRED'は信用証明書の受信(送信ではない)を許可しますが、それらは' sendmsg'とアンシラリ 'SCM_CREDENTIALS'メッセージを使って送信されます。これに依存しない 'SO_PEERCRED'を読んでいるだけで、ソケットはunixドメインソケットであるか、' socketpair'によって作成されたものです。 (ルートは他のユーザーと一致する資格情報メッセージを送ることができます) – Hasturkun
私はSO_PEERCREDとSO_PASSCREDがソケットモジュール内にあると思っています(3.3では少なくとも)。追加されたときに見つかりませんでした。私は1年前にこの投稿を最初に見つけたとき、彼らがそこにいなかったことを覚えていました... – yuyichao