Credencial de socket Unix pasando en Python

¿Cómo se realiza el paso de credenciales de socket Unix en Python?

Related of "Credencial de socket Unix pasando en Python"

Las búsquedas en Internet sobre este tema arrojaron resultados sorprendentemente escasos. Pensé que publicaría la pregunta y la respuesta aquí para otras personas interesadas en este tema.

Las siguientes aplicaciones de cliente y servidor demuestran cómo lograr esto en Linux con el intérprete de python estándar. No se requieren extensiones pero, debido al uso de constantes incrustadas, el código es específico de Linux.

Servidor:

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

Desafortunadamente, las constantes SO_PEERCRED y SO_PASSCRED no se exportan mediante el módulo de socket de Python, por lo que deben ingresarse manualmente. Aunque es poco probable que estos valores cambien, es posible. Esto debe ser considerado por cualquier aplicación que utilice este enfoque.