2011-11-02 25 views

答えて

17

このトピックに関するインターネット検索は驚くほどわずかな結果しか得られませんでした。私は、このトピックに興味を持っている他の人のために質問を投稿し、ここに答えたいと思った。

次のクライアントおよびサーバーアプリケーションは、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のソケットモジュールによってエクスポートされません。これらの値は変わることはありませんが、可能です。これは、このアプローチを使用するアプリケーションで考慮する必要があります。

+0

私は彼らがいつも変わるとは思わない。この場合、既存のアプリケーションはすべて再コンパイルする必要があります...しかし、いくつかのOSやいくつかのプラットフォームでは異なるかもしれません。 – glglgl

+2

私はあなたに+1しますが、実際には信任状を渡すことではありません。 'SO_PASSCRED'は信用証明書の受信(送信ではない)を許可しますが、それらは' sendmsg'とアンシラリ 'SCM_CREDENTIALS'メッセージを使って送信されます。これに依存しない 'SO_PEERCRED'を読んでいるだけで、ソケットはunixドメインソケットであるか、' socketpair'によって作成されたものです。 (ルートは他のユーザーと一致する資格情報メッセージを送ることができます) – Hasturkun

+2

私はSO_PEERCREDとSO_PASSCREDがソケットモジュール内にあると思っています(3.3では少なくとも)。追加されたときに見つかりませんでした。私は1年前にこの投稿を最初に見つけたとき、彼らがそこにいなかったことを覚えていました... – yuyichao