Поиски в Интернете по этой теме дали на удивление мало результатов.Я подумал, что опубликую вопрос и ответ здесь для тех, кто интересуется этой темой.
Следующие клиентские и серверные приложения демонстрируют, как это сделать в 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, поэтому их необходимо вводить вручную.Хотя эти значения вряд ли изменятся, это возможно.Это следует учитывать любым приложениям, использующим этот подход.