Tại sao tôi không thể chạy các ứng dụng GUI từ 'root': Không có giao thức nào được chỉ định


38

Tôi đã cài đặt debian vào máy tối qua. Bây giờ, tôi không hiểu tại sao tôi không thể chạy các ứng dụng GUI từ thiết bị đầu cuối khi chạy bằng root.

Ví dụ:

sudo -i
glxgears

Tạo đầu ra sau:

No protocol specified
Error: couldn't open display :0

Nhưng khi tôi mở terminal lần đầu tiên, tôi có thể chạy glxgearstừ tài khoản người dùng. Chỉ sau khi tôi làm điều sudo -iđó vấn đề tăng lên. Điều này xảy ra với bất kỳ ứng dụng GUI nào mà tôi cố chạy. Tôi nghĩ rằng nó có thể liên quan đến X11, nhưng tôi không chắc chắn.


1
stackoverflow.com/a/20612084 điều này làm việc hoàn hảo cho tôi.

Câu trả lời:


39

Truy cập máy chủ X yêu cầu hai điều:

  • Các $DISPLAYbiến trỏ đến màn hình hiển thị chính xác (thường :0)
  • Thông tin xác thực đúng

Thông tin xác thực có thể được chỉ định rõ ràng thông qua $XAUTHORITYvà mặc định là ~/.Xauthoritykhác.

Nếu $DISPLAY$XAUTHORITYđược đặt cho người dùng của bạn, sudocũng sẽ đặt chúng cho trình bao mới và mọi thứ sẽ hoạt động tốt.

Nếu chúng không được đặt, chúng có thể sẽ mặc định là các giá trị sai và bạn không thể khởi động và ứng dụng X.

Trong Debian $XAUTHORITYthường không được đặt rõ ràng. Chỉ cần thêm

export XAUTHORITY=~/.Xauthority

để .bashrcnói hoặc nói rõ ràng XAUTHORITY=~/.Xauthority sudo ...và mọi thứ nên hoạt động.

Bạn cũng có thể sử dụng xauth listđể kiểm tra xem thông tin xác thực có sẵn hay không.


1
xauth infohiển thị đường dẫn đến tập tin thẩm quyền
Tomas Tomecek

1
xhost +đã khắc phục sự cố của tôi
nguy hiểm89

3
Xin lưu ý rằng việc xhost +tắt hoàn toàn xác thực và cho phép mọi người truy cập tất cả ứng dụng trên màn hình của bạn ...
michas

1
đối với debian, tôi có nhập xuất XAUTHORITY làm root không? bởi vì nó không hoạt động trên deb10? Tôi đăng nhập bằng sudo su
marinara

@marinara sử dụng sudo -ithay thế sudo su -.
michas

23

Tôi đã có cùng một câu hỏi như bạn nhưng đối với một người dùng bình thường. Giả sử tôi muốn bắt đầu firefox bằng tài khoản người dùng foo. Tôi đang đăng nhập dưới dạng thanh:

[bar@localhost ~]$ sudo -u foo -H firefox

Đáng buồn là lệnh đó không thành công với cùng một lỗi như trong câu hỏi (nghĩa là không có giao thức nào được chỉ định & không thể mở hiển thị)

Giải pháp của tôi chỉ đơn giản là thêm người dùng foo vào danh sách quyền truy cập được ủy quyền vào máy chủ X.

xhost si:localuser:foo

Và thế là xong, tôi đã có thể khởi chạy Firefox (và ứng dụng X khác) bằng cách sử dụng sudovà người dùng foo.

Bối cảnh : Trên X Window, có kiến ​​trúc máy khách / máy chủ. Khi bạn khởi chạy một ứng dụng, bạn yêu cầu ủy quyền máy chủ X hiển thị nó. Theo mặc định, khi bạn mở một phiên (bạn đăng nhập bằng đồ họa), bạn (người dùng của bạn) rõ ràng được phép giao tiếp với máy chủ và hiển thị các ứng dụng. Những người dùng khác không có quyền này trừ khi bạn chỉ định nó. xhostlà một công cụ để thao tác danh sách các quyền. Các sichỉ ra rằng sự cai trị là phía máy chủ và nó cho phép người dùng địa phương foođể ứng dụng hiển thị. X Window rất mạnh về vấn đề này và bạn có thể hiển thị các ứng dụng từ xa cục bộ bằng cách chơi với DISPLAYbiến môi trường và xhost(nhưng không giới hạn ở chúng). Thời xưa, khi người ta gõxhost + và hoàn toàn cho phép mọi người sử dụng phiên X của họ, có thể hiển thị ứng dụng trên màn hình của họ để chơi khăm ;-) ngày nay không nhiều vì mọi người ngày càng ít sử dụng kiến ​​trúc máy khách / máy chủ X Window (ít nhất là cho những gì tôi quan sát được 10 năm qua).

Tái bút: Tôi đã làm điều này để khởi chạy Firefox theo kiểu "tù" (để tránh lỗ hổng như pdf.js trong tương lai). Nhưng tôi nhanh chóng phát hiện ra rằng việc gọi Firefox qua sudo sẽ không cho phép nó truy cập âm thanh cũng như phần cứng video. Nhưng có một anh chàng giải thích rõ ràng cách kích hoạt tăng tốc phần cứng và âm thanh video khi gọi Firefox qua sudo . YMMV với các hướng dẫn này, ví dụ: tôi vẫn có quyền bị từ chối với âm thanh nhưng video vẫn ổn (đã được thử nghiệm trên Fedora 22 với SELinux ON).


1
Trong trường hợp của tôi fooroot, tức là tôi phải chạy xhost si:localuser:roottrên Ubuntu 17.10.
Karl Richter

Nơi nào bạn thêm xhost si:localhost<user>lệnh? Nếu không có người dùng nào đăng nhập, thì không ai có sẵn máy chủ X để cấp quyền.
cbcoutinho

@cbcoutinho Trường hợp sử dụng ở trên là khi ai đó đăng nhập và muốn chạy ứng dụng XWindow với tư cách là người khác trên cùng một máy chủ. Nếu bạn giải thích trường hợp sử dụng của bạn (vấn đề bạn muốn giải quyết là gì) thì tôi có thể giúp bạn.
Huygens

@Huygens Tôi có một máy trạm để mô phỏng chất lỏng cũng được trang bị GPU. Tôi kết xuất các trực quan hóa với ParaView, một chương trình được xây dựng trên vtk, thường là trên chính máy trạm. ParaViewcũng cung cấp một mô hình kết xuất máy khách / máy chủ không đầu an toàn thông qua ssh, mà tôi muốn tận dụng lợi thế của điều khiển từ xa thay vì sử dụng VNC. Không đăng nhập vào máy trạm và thực thi xhost, tôi không thể sử dụng GPU. Điều đó có nghĩa là tôi không thể khởi động lại máy từ xa mà vẫn có quyền truy cập vào GPU.
cbcoutinho

1
@cbcoutinho X Window là một kiến ​​trúc máy chủ của khách hàng. Khi bạn kết nối qua ssh, máy trạm cục bộ của bạn sẽ trở thành máy khách X Window. Bạn có thể sử dụng xhost với các giao thức không an toàn như rlogin nhưng không phải ssh. Bạn cần hướng dẫn ssh làm điều đó cho bạn. Hoặc sử dụng cờ -Xhoặc (tốt hơn?) -YTrên ssh, nó sẽ thực hiện chuyển hướng thích hợp. Tất nhiên sau đó bạn cần một máy chủ C cục bộ. Tuy nhiên, với GPU và OpenGL, tôi không chắc việc kết xuất / tính toán xảy ra ở đâu có lẽ là ở phía máy khách chứ không phải máy chủ. Có thể là khó khăn.
Huygens

10

Bạn có thể

Chỉ định màn hình được sử dụng trên dòng lệnh, bằng cách thêm -display :0.0

hoặc là

Thiết lập biến môi trường trong tập lệnh đăng nhập của root (một trong .bashrc, .profile, .bash_profile ...).

export DISPLAY=:0.0

Bạn có thể kiểm tra xem nó đã được đặt chưa,

$ env |grep DISPLAY
DISPLAY=:0.0

Để mở màn hình của bạn cho tất cả người dùng từ tất cả các máy chủ như người dùng bình thường của bạn, bạn có thể làm điều này với:

xhost +


1
xhost + hoạt động như một biện pháp tạm thời trước khi đi vào sudo
Octopus

1
xhost +làm việc cho tôi cũng vậy, chỉ có điều họ quên đề cập đến việc chúng ta nên chạy nó từ thiết bị đầu cuối ủy quyền của người dùng, không phải từ thiết bị đầu cuối bên dưới sudo su.
nyxee

1
công việc hoàn hảo như bùng nổ
Adiii

3

Cho rằng bạn đang sử dụng Debian, giải pháp đơn giản và được hỗ trợ là sắp xếp sudođể sao chép thông tin xác thực ủy quyền X11 của bạn. pam_xauthđược bao gồm trong libpam-modulesgói cho chính xác mục đích này; để sử dụng nó, bạn chỉ cần thêm

session  optional  pam_xauth.so

vào /etc/pam.d/sudotập tin của bạn . Bạn cũng có thể chọn thêm nó vào su. Để biết thông tin đầy đủ, tất nhiên tham khảo pam_xauthtrang người đàn ông.


2

Điều gì đã giúp tôi:

  1. Bạn có thể xauth generate :0 . trusteduserbên, sẽ tạo ra một cái mớiMIT-MAGIC-COOKIE-1
  2. Kiểm tra Khóa vừa tạo với biến xAuthority` gốc của xauth list' asngười dùng đang trỏ đến cùng một tệp.and(they should be the same if your

  3. Voila, rootsẽ truy cập bất kỳ X-Apptừ thiết bị đầu cuối, nhưng chỉ tạm thời.

Để làm cho nó vĩnh viễn, hãy xem câu trả lời của @Huygens!


1

Giải pháp thay thế :

Các dịch vụ như cron chạy dưới root không có quyền truy cập để hiển thị nếu người dùng x hiện tại không phải là root.

Chúng tôi chỉ cần thêm người dùng root vào x, bạn có thể làm điều đó khi đăng nhập bằng tập lệnh khởi động

xhost local:root

Đối với mục đích thử nghiệm, chúng tôi chỉ có thể chạy hơn lệnh theo người dùng hiện tại và khởi chạy lại tập lệnh gốc / công việc / dịch vụ / ...


Chỉ tò mò, tại sao bạn sẽ chạy một ứng dụng gui thông qua một cron?
Bạch tuộc

trong bản phân phối của tôi, tôi có một công việc cron gốc (msec) để kiểm tra sức khỏe bảo mật hệ thống và lập báo cáo ... vì vậy thay vì đăng nhập để kiểm tra báo cáo đó, tôi thích có một thông báo bật lên với báo cáo khi công việc đó được chạy
intika

NÀY làm việc cho tôi
Marcus Vinicius Pompeu

0

Các sudolệnh có một công tắc để bảo tồn các biến môi trường.

 -E, --preserve-env            preserve user environment when running command

Vì vậy, bạn có thể chạy lệnh với chuyển đổi -E. Thí dụ:

sudo -E wireshark

Nếu bạn không cần chạy các ứng dụng quan trọng về quyền riêng tư như trình duyệt web, bạn sẽ tốt hơn khi thêm -E switch bằng sudo. Chúng tôi không thể chạy Chrome hoặc Firefox chỉ bằng cách thêm -E switch. Bởi vì nhiều trình duyệt đã thực hiện bảo vệ chống lại vi phạm không gian người dùng. Câu trả lời của @ huygens có thể có cái nhìn sâu sắc về chủ đề này.

Lưu ý: Thêm công tắc -E sẽ không giúp ích nếu môi trường người dùng của bạn KHÔNG có DISPLAY XAUTHORITY đã được đặt chính xác .


-1

sử dụng lệnh này và nó sẽ hoạt động

sudo cp /home/user/.Xauthority .Xauthority

2
Điều này sẽ cung cấp cho cp: cannot stat ‘/home/user/.Xauthority’: No such file or directorybất kỳ trong số hơn 10 máy dựa trên Debian mà tôi có quyền truy cập.
Anthon

Điều này cung cấp một bối cảnh nhỏ (ví dụ: bạn âm thầm mong đợi một số thư mục hiện tại) và bạn không đề cập đến các tác dụng phụ như rắc rối khi làm như vậy trong nhiều trường hợp X11. Tôi nghĩ rằng cách này là một chút hacky.
v6ak
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.