2010-03-08 30 views
10

Tôi có một ứng dụng giao diện người dùng (sử dụng GTK) cho Linux yêu cầu phải chạy dưới dạng root (nó đọc và ghi/dev/sd *).Xác thực ứng dụng GTK để chạy với quyền root

Thay vì yêu cầu người dùng mở vỏ gốc hoặc sử dụng "sudo" theo cách thủ công mỗi khi khởi chạy ứng dụng của tôi, tôi tự hỏi liệu ứng dụng có thể sử dụng một số API do OS cung cấp để có quyền root hay không. (Lưu ý: gtk của ứng dụng không thể sử dụng chế độ "setuid", do đó, đó không phải là một tùy chọn ở đây.)

Lợi thế ở đây sẽ là một quy trình dễ dàng hơn: Người dùng có thể, từ tài khoản người dùng mặc định của mình, nhấp đúp vào ứng dụng của tôi từ máy tính để bàn thay vì phải mở một thiết bị đầu cuối gốc và khởi chạy nó từ đó. Tôi yêu cầu điều này vì OS X cung cấp chính xác điều này: Một ứng dụng có thể yêu cầu hệ điều hành khởi chạy một tệp thực thi với quyền root - HĐH (chứ không phải ứng dụng) sau đó yêu cầu người dùng nhập thông tin xác thực của họ, xác minh chúng mục tiêu như mong muốn.

Tôi tự hỏi nếu có điều gì đó tương tự cho Linux (Ubuntu, ví dụ)

Làm rõ:

Vì vậy, sau khi gợi ý tại PolicyKit Tôi tự hỏi nếu tôi có thể sử dụng để có được r/w truy cập vào các thiết bị chặn "/ dev/sd ...". Tôi tìm thấy tài liệu khá khó hiểu, vì vậy tôi nghĩ trước tiên tôi sẽ hỏi liệu điều này có thể xảy ra trước khi tôi dành hàng giờ để cố gắng hiểu nó một cách vô ích.

Cập nhật:

Ứng dụng là một công cụ sửa chữa đĩa hoạt động từ xa cho người dùng Linux unsavvy, và những noobs Linux sẽ không có nhiều hiểu biết về sử dụng sudo hoặc thậm chí thay đổi thành viên nhóm của người dùng của họ, đặc biệt là khi đĩa của họ mới bắt đầu diễn xuất và họ đang hoảng sợ. Đó là lý do tại sao tôi tìm kiếm một giải pháp tránh các kỹ thuật như thế này.

+0

Chắc chắn có thể thiết lập mọi thứ như vậy - ví dụ, trình quản lý gói Synaptic thường được thiết lập theo cách đó. – caf

+0

Tôi không chắc bạn có thực sự muốn chạy dưới dạng root hay không. Nếu bạn chỉ cần truy cập vào đĩa, tốt hơn là thêm người dùng vào nhóm "đĩa". –

+0

Milan - Ứng dụng của tôi hoạt động như một công cụ sửa chữa đĩa một lần. Tôi không nghĩ rằng bất cứ ai muốn sử dụng nó sẵn sàng thay đổi cài đặt toàn hệ thống của mình cho điều này, gần như vĩnh viễn. –

Trả lời

3

Cách cũ, đơn giản nhưng hiện đang bị loại bỏ, là GKSu. Here là cuộc thảo luận về tương lai của GKSu.

Cách mới là sử dụng PolicyKit. Tôi không hoàn toàn chắc chắn cách thức này hoạt động nhưng tôi nghĩ bạn cần khởi chạy ứng dụng của mình bằng cách sử dụng lệnh pkexec.

UPDATE:

Nhìn vào mã ví dụ trên http://hal.freedesktop.org/docs/polkit/polkit-apps.html, có vẻ như bạn có thể sử dụng PolicyKit để có được ủy quyền cho một số hành động được mô tả bởi .policy file trong /usr/share/polkit-1/actions. Hành động thực thi chương trình với tư cách người dùng khác là org.freedesktop.policykit.exec. Tôi không thể tìm thấy một hành động để truy cập trực tiếp vào các thiết bị khối, nhưng tôi phải thừa nhận, tài liệu PolicyKit cũng phá vỡ bộ não của tôi. Vì vậy, có lẽ hành động đơn giản nhất cho bạn là tách mã xâu đĩa yêu cầu đặc quyền thành tiện ích dòng lệnh và chạy nó từ ứng dụng GUI của bạn bằng cách sử dụng g_spawn_[a]sync() với pkexec. Bằng cách đó bạn sẽ không phải bận tâm với yêu cầu hành động và loại điều đó. Nó có lẽ là thực hành xấu anyway để chạy toàn bộ ứng dụng GUI của bạn như là người chủ.

Một đề xuất khác là hỏi tác giả của PolicyKit (David Zeuthen) trực tiếp.Hoặc thử đăng câu hỏi của bạn lên danh sách gtk-app-devel.

+0

Tôi đã thử pkexec - thật không may, nó không hoạt động trong trường hợp của tôi khi tôi nhận được thông báo lỗi sau: "Gtk-WARNING **: không thể mở hiển thị:" - "man pkexec" giải thích lý do: “Môi trường mà CHƯƠNG TRÌNH sẽ chạy nó, sẽ được đặt ở mức tối thiểu môi trường đã biết và an toàn để tránh việc tiêm mã thông qua LD_LIBRARY_PATH hoặc các cơ chế tương tự. Ngoài ra, biến môi trường PKEXEC_UID được đặt thành id người dùng của quá trình gọi pkexec. Do đó, pkexec sẽ không cho phép bạn chạy ví dụ: X11 ứng dụng với tư cách người dùng khác vì biến môi trường $ DISPLAY là chưa được đặt. ” Darn. –

+1

Hmm, tôi nghĩ API PolicyKit cho phép bạn đạt được điều tương tự, nhưng từ bên trong chương trình của bạn. Tôi không chắc chắn. – ptomato

+0

SO đã không gửi thư cho tôi về bản cập nhật của bạn, vì vậy tôi chỉ nhìn thấy nó ngay bây giờ. Cảm ơn vì đã nỗ lực thêm, tôi nghĩ với thông tin đó tôi có thể tiến lên. –

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