¿Cómo se realiza el paso de credenciales de socket Unix en Python?Credencial de socket Unix que pasa en Python
8
A
Respuesta
17
Las búsquedas en Internet sobre este tema arrojaron sorprendentemente pocos resultados. 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 incorporadas, 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()
Por desgracia, las constantes SO_PEERCRED y SO_PASSCRED no se exportan por el módulo de toma de pitón por lo que deben ser introducidos manualmente. Aunque es poco probable que estos valores cambien, es posible. Esto debe ser considerado por cualquier aplicación que use este enfoque.
Cuestiones relacionadas
- 1. Python analógico de Unix 'que'
- 2. Socket de dominio UNIX en Java
- 3. Implementación de socket UNIX para Java?
- 4. Postgresql y django - socket de dominio Unix
- 5. socket unix error 14: EFAULT (dirección incorrecta)
- 6. Python lista que pasa como argumento
- 7. Cómo conectarse a mongodb a través del socket unix en python
- 8. C/Python Socket Performance?
- 9. Python: ¿Socket and Threads?
- 10. Socket de Python UDP que falla al recibir semi-aleatoriamente
- 11. Prueba conexión de socket en Python
- 12. Identificar programa que se conecta a un socket de dominio Unix
- 13. F # parámetro que pasa
- 14. Python socket accept blocks - impide que la aplicación se cierre
- 15. Python Simple SSL Socket Server
- 16. ¿Cómo vaciar un socket en python?
- 17. reproducir el comando cat Unix en Python
- 18. Comunicación Fast IPC/Socket en Java/Python
- 19. ¿Qué causa el error de socket Python?
- 20. Python equivalente de la función cksum UNIX
- 21. Parámetro que pasa con initWithNibName:
- 22. OOP - Mensaje que pasa en C#
- 23. mensaje distribuido que pasa en D?
- 24. objeto que pasa en rpyc falla
- 25. Argumento que pasa en los scripts .sh
- 26. ¿Utiliza Python xmlrpclib con conectores de dominio Unix?
- 27. Programación de socket C unix, connect() colgando en el nombre de host no válido
- 28. ¿Pasa cada elemento de una lista a una función que toma múltiples argumentos en Python?
- 29. cProfile and Python: Encontrar el número de línea específico que el código pasa más tiempo en
- 30. objeto python socket accept time out
No creo que puedan cambiar. En este caso, todas las aplicaciones existentes tendrían que ser recompiladas ... Pero podrían ser diferentes entre varios SO o varias plataformas. – glglgl
Te quería +1, pero por un lado, esto no es en realidad el pase de credencial. 'SO_PASSCRED' permite recibir (no enviar) credenciales, pero esas se envían usando el mensaje' sendmsg' y ancillarry 'SCM_CREDENTIALS'. está leyendo 'SO_PEERCRED' que no depende de esto, solo que el socket es un socket de dominio unix o fue creado por' socketpair'. y solo obtiene las credenciales actuales (root puede enviar mensajes de credenciales que coincidan con otros usuarios) – Hasturkun
Creo que SO_PEERCRED y SO_PASSCRED están en el módulo de socket en este momento (al menos en 3.3). No se encontró cuando se agregaron. Recuerdo que no estaban allí cuando encontré esta publicación por primera vez hace un año ... – yuyichao