2011-11-02 29 views

Trả lời

17

Tìm kiếm trên Internet về chủ đề này đã đưa ra một số kết quả đáng ngạc nhiên. Tôi nghĩ tôi sẽ đăng câu hỏi và trả lời ở đây cho những người khác quan tâm đến chủ đề này.

Các ứng dụng khách và máy chủ sau đây trình bày cách thực hiện điều này trên Linux với trình thông dịch chuẩn python. Không có phần mở rộng được yêu cầu nhưng, do việc sử dụng các hằng số được nhúng, mã này là dành riêng cho 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) 

Chủ đầu tư:

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

Thật không may, hằng SO_PEERCRED và SO_PASSCRED chưa được xuất khẩu bởi module ổ cắm python vì vậy họ phải được nhập bằng tay. Mặc dù những giá trị này không có khả năng thay đổi nó là có thể. Điều này cần được xem xét bởi bất kỳ ứng dụng nào sử dụng phương pháp này.

+0

Tôi không nghĩ rằng họ có thể thay đổi. Trong trường hợp này, tất cả các ứng dụng hiện có sẽ phải được biên dịch lại ... Nhưng chúng có thể khác nhau giữa một số hệ điều hành hoặc một vài nền tảng. – glglgl

+2

Tôi muốn +1 bạn nhưng một điều, đây thực sự không phải là thông tin xác thực. 'SO_PASSCRED' cho phép nhận (không gửi) thông tin đăng nhập, nhưng chúng được gửi bằng cách sử dụng' sendmsg' và một thông báo an toàn 'SCM_CREDENTIALS'. bạn đang đọc 'SO_PEERCRED' mà không phụ thuộc vào điều này, chỉ có ổ cắm là một ổ cắm miền unix hoặc được tạo bởi' socketpair'. và chỉ nhận được thông tin đăng nhập hiện tại (root có thể gửi thông báo xác thực phù hợp với người dùng khác) – Hasturkun

+2

Tôi nghĩ SO_PEERCRED và SO_PASSCRED nằm trong mô-đun ổ cắm ngay bây giờ (ít nhất là trong 3.3). Không tìm thấy khi chúng được thêm vào. Tôi nhớ là họ không ở đó khi lần đầu tiên tôi tìm thấy bài đăng này một năm trước ... – yuyichao

Các vấn đề liên quan