Chạy ứng dụng GUI với tư cách người dùng khác (không phải root)


34

Giả sử tôi có 2 tài khoản người dùng user1user2. Khi tôi đăng nhập với tư cách user1, và sau đó chuyển sang user2sử dụng su, tôi có thể thực thi các chương trình dòng lệnh, nhưng các chương trình GUI không thành công.

Thí dụ:

user1@laptop:~$ su - user2
user2@laptop:~$ leafpad ~/somefile.txt
No protocol specified
leafpad: Cannot open display: 

Vậy làm thế nào tôi có thể chạy một ứng dụng GUI?


Một trong những lý do chính, tôi đã phát hiện ra rằng lỗi này là do $XAUTHORITYvẫn được đặt thành user1 ~/.Xauthority, mà tôi đoán là chương trình sẽ cố đọc và thất bại vì tệp đó thường có chế độ 0600 ( -rw-------), nghĩa là nó không khả dụng để đọc bởi bất kỳ ai trong nhóm "khác", bao gồm user2. Có nghĩa là nếu bạn chmod o+r ~/.Xauthority(như user1), bạn sẽ hack theo cách của bạn xung quanh vấn đề này. Tôi đã viết một kịch bản chứng minh điều này.
Braden hay nhất

Câu trả lời:


42

su so với su -

Khi trở thành người dùng khác, bạn thường muốn sử dụng su - user2. Dấu gạch ngang sẽ buộc user2's .bash_profilecó nguồn gốc.

xhost

Ngoài ra, bạn sẽ cần cấp cho người dùng quyền truy cập vào màn hình của bạn. Điều này được điều chỉnh bởi X. Bạn có thể sử dụng lệnh xhost +để cho phép người dùng khác hiển thị GUI cho máy tính để bàn của user1.

LƯU Ý: Khi chạy, xhost +bạn sẽ muốn chạy cái này trong khi vẫn ở trong vỏ thuộc về người dùng1.

$ HIỂN THỊ

Khi bạn trở thành user2, bạn có thể cần đặt biến môi trường $DISPLAY.

$ export DISPLAY=:0.0

1
xhost +user2vẫn cho tôi lỗi này - xhost: bad hostname "user2". Tôi đã googled một số, và có vẻ như tôi cần phải làm xhost +user2@laptophoặc xhost +user2@localhostkhông chắc chắn. Rồi nó nói xhost +user2@localhost being added to access control list.
sashoalm

1
Nhưng ngay cả sau khi thêm người dùng xhostvà chỉ định export DISPLAY=:0.0, việc chạy leafpadvẫn mang lại cho tôi No protocol specified leafpad: Cannot open display:và không chạy được. Tôi tìm thấy liên kết này tại linuxquestions.org/questions/linux-newbie-8/ , nói rằng có một số cookie ma thuật và xauth. Bạn đã kiểm tra rằng những thứ đó hoạt động trên máy tính của bạn btw? Có lẽ có gì đó khác với cấu hình của tôi? Tôi đang sử dụng Debian + LXDE.
sashoalm

1
Cảm ơn, xhost +làm việc, và dường như không có gì khác là cần thiết (không cần phải thiết lập $DISPLAY). Bạn có thể cập nhật câu trả lời của bạn, và tôi sẽ chấp nhận nó?
sashoalm

5
Ồ, tìm thấy một cái gì đó. Trên Fedora 21 chạy xhostcho một danh sách ở định dạng SI:localuser:USERNAME, vì vậy xhost SI:localuser:user2nên hoạt động. Oh và màn hình của người dùng có thể được tìm thấy bằng cách sử dụng w.
Wilf

7
xhost +sẽ cho phép bất kỳ người dùng nào trên bất kỳ máy chủ nào có thể kết nối với máy chủ x của bạn để truy cập màn hình của bạn. xhost +SI:localuser:user2làm việc cho tôi trên Debian.
robartsd 17/03/2017

9

Bạn cần chia sẻ mã xác thực từ user1 (giả sử ~là nhà của user1 ):

cat ~/.Xauthority | sudo -u user2 -i tee .Xauthority > /dev/null

1
Đây là câu trả lời duy nhất hiệu quả với tôi (Ubuntu 14).
sudo

Giải pháp này hoạt động độc đáo từ bên trong máy từ xa (= X Win client) trong khi các giải pháp xhost trong các câu trả lời khác phải được thực thi trên máy cục bộ (= máy chủ X Win).
Jpsy

Nó có thể an toàn hơn để sử dụng tee -ađể tránh ghi đè bất kỳ thông tin hiện có trong  .Xauthority.
Scott

7

Bạn có thể sử dụng chuyển tiếp X11:

ssh -XY otheruser@localhost your-gui-program-name-here

Đây là một giải pháp tuyệt vời. Đơn giản nhất tôi đã đọc cho đến nay. Nhiều người quen thuộc với ssh hơn là với cấu hình x11.
Alexis Panagiotopoulos

6

Bạn có thể bắt đầu ứng dụng từ một người dùng khác. Tôi sẽ khởi động ứng dụng gimp từ user2, trong khi đăng nhập (GUI) với người dùng 1:

$ xhost +
$ sudo su user2

(nhập thông qua)

$ gimp

Thưởng thức :)


4
Điều này giống như câu trả lời được chấp nhận bốn năm tuổi.
G-Man nói 'Phục hồi Monica'

bạn có thể nói một cách nhanh hơn tốt hơn?
Antoni Stavrev

Tôi đã luôn sử dụng phương pháp này, nhưng nó không còn hoạt động với tôi với Debian và Xfce. ( chỉnh sửa : nó hoạt động, nhưng export DISPLAYtrước tiên tôi phải trả lời, như câu trả lời được chấp nhận)
giusti

sau khi bạn kết thúc phiên của mình, sẽ rất tốt để vô hiệu hóa nó bằng cách$ xhost -
Antoni Stavrev

4

Bạn có thể thử lệnh sux:

sux user2

sux sẽ xử lý các công cụ $ HIỂN THỊ cho bạn. Bạn có thể cần phải cài đặt nó với:

sudo apt-get install sux

trong Debian / Ubuntu.


4
suxkhông còn được chuyển bởi Debian hoặc Ubuntu. Cách thay thế tốt nhất tôi có thể tìm thấy là thêm xhost SI:localuser:root(hoặc bất kỳ người dùng nào) ~/.xprofileđể cho phép sử dụng vĩnh viễn hoặc sử dụngrunuser
stefanct

Lên đến và bao gồm Debian Stretch, đã có gksu/ gksudothay thế hoạt động tốt. Khi vẫn ở Sid, nó bị xóa trong Buster vì các vấn đề bảo mật.
Matija Nalis

0

Thay thế cho sux, để chạy lệnh đồ họa một cách an toàn ( firefox-esrví dụ bên dưới) như $AUTHUSER( gueství dụ bên dưới):

AUTHUSER=guest
AUTHSTRING=SI:localuser:${AUTHUSER}
xhost +${AUTHSTRING} > /dev/null
SUDO_ASKPASS=/usr/bin/ssh-askpass
export SUDO_ASKPASS
sudo -k --askpass -u ${AUTHUSER} /usr/bin/firefox-esr
xhost -${AUTHSTRING} > /dev/null
sudo -K

mã này:

  1. cung cấp cho guestngười dùng quyền truy cập vào người dùng hiện tại của bạn $DISPLAYthông quaxhost +SI:localuser:guest
  2. sử dụng ssh-askpassđể đồ họa hỏi bạn mật khẩu (tất nhiên, bạn có thể sử dụng sudoers(5) NOPASSWD:để tránh điều này, nếu chính sách bảo mật của bạn cho rằng nó ổn. Hoặc bạn có thể sử dụng các askpasschương trình khác hoặc chỉ định chúng trong các tệp cấu hình (xem sudo(8)chi tiết về --askpass)
  3. nếu mật khẩu ổn (và bạn có quyền trong sudoers(5)) thì nó sẽ chạy lệnh /usr/bin/firefox-esrnhư một người dùng khác ( guest)
  4. sau khi chương trình hoàn tất, quyền cho người dùng khác ( guest) truy cập của bạn $DISPLAYbị thu hồi thông quaxhost -SI:localuser:guest
  5. cuối cùng, sudo -Kxóa mật khẩu đã lưu trong bộ nhớ cache, vì vậy lần gọi tiếp theo ssh-askpasssẽ yêu cầu bạn nhập lại mật khẩu (thay vì sử dụng mật khẩu đã lưu trong bộ nhớ cache)

    trong khi nó là công việc ít hơn những gì gksu(8)hoặc sux(8)đã làm, nó có thể được kịch bản, và nó là an toàn hơn:

    • xhost + (bất kỳ người dùng nào cũng sẽ có quyền truy cập vào màn hình đồ họa của bạn miễn là nó có hiệu lực)
    • người dùng khác có thể đọc được ~ / .xauth (người dùng đó truy cập không xác định vào màn hình của bạn)
    • what gksu/ suxdid (bản sao tạm thời ~/.Xauthority, cho phép người dùng được chỉ định sao chép MIT-MAGIC-COOKIE-1và tiếp tục sử dụng màn hình của bạn ngay cả khi gksu / sux kết thúc (miễn là bạn không tắt máy hoặc đăng xuất khỏi màn hình - trình bảo vệ màn hình, ngủ đông, v.v. bánh quy).

vì nó sẽ chỉ cho phép một người dùng cục bộ truy cập vào màn hình của bạn, và sau đó chỉ khi lệnh chạy (khi lệnh kết thúc, $AUTHUSERsẽ không còn có thể truy cập vào màn hình của bạn theo bất kỳ cách nào).

Một sự thay thế an toàn là ssh -X(không có -Ymà thực sự làm cho bạn kém an toàn! Thấy ForwardX11Trustedssh_config(5)để biết chi tiết), như là dễ dàng hơn để sử dụng nếu bạn không kịch bản nó, nhưng nó gây ra overhead additinal (ví dụ. Nó là chậm hơn) và một số chương trình có thể không hoạt động chính xác mà không an toàn -Y .


-1

Bạn cần tải UI cài đặt là user2 .

Hãy thử làm theo điều này:

Đăng nhập bằng root :

sudo su

Kiểm tra máy chủ x:

xclock

Nếu bạn có thể thấy đồng hồ đang chạy, thật tuyệt, hãy thử chạy cái này:

xhost

Kết quả sẽ như thế này:

xhost SI:localuser:tri
# tri is my user name

Bây giờ hãy để user2 truy cập xhost

xhost +SI:localuser:user2

Bây giờ hãy thử đăng nhập lại vào user2 và thử mở bất kỳ chương trình GUI nào.


(1) Không có gì trong câu hỏi này yêu cầu chạy bằng root, hoặc chạy bằng root là có lợi. (1b) Nếu bất cứ điều gì, chạy bằng root có thể chỉ gây nhầm lẫn vấn đề. (2) Hiếm khi (nếu có) bất kỳ lý do để sử dụng sudo su. Sử dụng  sudohoặc  su; chọn một. (3) Câu hỏi được viết dưới dạng  user1và  user2. Hãy viết câu trả lời của bạn dưới dạng  user1và  user2. (Làm hoặc không; không có  tri.) (4) Câu trả lời của bạn sẽ tốt hơn nếu nó bao gồm một lời giải thích  SI:localuser. Xin vui lòng không phản hồi trong bình luận; chỉnh sửa  câu trả lời của bạn để làm cho nó rõ ràng và đầy đủ hơn.
Scott
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.