2011-11-02 4 views

답변

17

이 주제에 대한 인터넷 검색은 놀라운 결과를 얻지 못했습니다. 나는이 주제에 관심이있는 다른 사람들을 위해 질문과 답변을 게시 할 것이라고 생각했습니다.

다음 클라이언트 및 서버 응용 프로그램은 표준 파이썬 인터프리터를 사용하여 Linux에서이를 수행하는 방법을 보여줍니다. 확장은 필요하지 않지만 임베디드 상수를 사용하기 때문에이 코드는 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 상수는 파이썬의 소켓 모듈 내 보내지 않습니다. 이 값은 변하지 않을 수도 있지만 가능합니다. 이 방법을 사용하는 모든 응용 프로그램에서 고려해야합니다.

+0

나는 그들이 변할 수 있다고 생각하지 않습니다. 이 경우 모든 기존 응용 프로그램을 다시 컴파일해야하지만 ... 여러 OS 또는 여러 플랫폼간에 다를 수 있습니다. – glglgl

+2

나는 당신을 +1 하겠지만, 한 가지만 들어, 이것은 실제로 자격증이 통과하는 것이 아닙니다. 'SO_PASSCRED'는 신임장을받지 못하게하지만 sendmsg와 ancillarry'SCM_CREDENTIALS' 메시지를 사용하여 보내집니다. 이것에 의존하지 않는'SO_PEERCRED'를 읽고 있습니다. 단지 소켓이 유닉스 도메인 소켓이거나'socketpair'에 의해 생성 된 것입니다. 현재 자격 증명 만 가져옵니다 (루트는 다른 사용자와 일치하는 자격 증명 메시지를 보낼 수 있음) – Hasturkun

+2

SO_PEERCRED 및 SO_PASSCRED는 현재 소켓 모듈에 있습니다 (적어도 3.3 이상). 추가 될 때 발견되지 않았습니다. 나는 1 년 전에이 게시물을 처음 발견했을 때 그곳에 없었던 것을 기억했다 ... – yuyichao

관련 문제