2011-11-02 10 views

risposta

17

Le ricerche su Internet su questo argomento hanno prodotto sorprendentemente pochi risultati. Ho pensato di pubblicare la domanda e rispondere qui per gli altri interessati a questo argomento.

Le seguenti applicazioni client e server dimostrano come eseguire ciò su Linux con l'interprete python standard. Non sono richieste estensioni ma, a causa dell'uso di costanti incorporate, il codice è specifico per Linux.

Server:

#!/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) 

Cliente:

#!/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() 

Purtroppo, le costanti e SO_PEERCRED SO_PASSCRED non vengono esportati dal modulo zoccolo di pitone quindi devono essere inseriti manualmente. Anche se è improbabile che questi valori cambino, è possibile. Questo dovrebbe essere considerato da qualsiasi applicazione che utilizzi questo approccio.

+0

Non penso che possano mai cambiare. In questo caso, tutte le applicazioni esistenti dovrebbero essere ricompilate ... Ma potrebbero essere diverse tra diversi sistemi operativi o diverse piattaforme. – glglgl

+2

Vorrei fare +1 su di te, ma per una cosa, questo non è in realtà il passaggio delle credenziali. 'SO_PASSCRED' consente di ricevere (non inviare) credenziali, ma queste vengono inviate usando' sendmsg' e un messaggio di ancillarry 'SCM_CREDENTIALS'. stai leggendo 'SO_PEERCRED' che non dipende da questo, solo che il socket è un socket di dominio unix o è stato creato da' socketpair'. e ottiene solo le credenziali correnti (root può inviare messaggi credenziali corrispondenti ad altri utenti) – Hasturkun

+2

Penso che SO_PEERCRED e SO_PASSCRED siano nel modulo socket adesso (almeno in 3.3). Non trovato quando sono stati aggiunti. Mi sono ricordato che non erano lì quando trovo questo post per la prima volta un anno fa ... – yuyichao