Передача учетных данных сокета Unix в Python - PullRequest
9 голосов
/ 02 ноября 2011

Как происходит передача учетных данных сокетов Unix в Python?

1 Ответ

19 голосов
/ 02 ноября 2011

Поиски в Интернете по этой теме дали на удивление мало результатов.Я подумал, что опубликую вопрос и ответ здесь для тех, кто интересуется этой темой.

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

...