'루트'에서 GUI 앱을 실행할 수없는 이유 :“프로토콜이 지정되지 않았습니다”?


38

어젯밤 데비안을 컴퓨터에 설치했습니다. 이제 루트로 실행할 때 터미널에서 GUI 앱을 실행할 수없는 이유를 이해할 수 없습니다.

예를 들면 다음과 같습니다.

sudo -i
glxgears

다음과 같은 출력을 생성합니다.

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

그러나 터미널을 처음 열면 glxgears사용자 계정에서 실행할 수 있습니다. 내가 sudo -i문제를 일으킨 후에야 . 이것은 내가 실행하려고하는 모든 GUI 응용 프로그램에서 발생합니다. 아마 X11과 관련이 있다고 생각하지만 확실하지 않습니다.


1
stackoverflow.com/a/20612084 이것은 나를 위해 완벽하게 작동했습니다.

답변:


39

X 서버에 액세스하려면 두 가지가 필요합니다.

  • $DISPLAY정확한 표시를 가리키는 변수 (보통 :0)
  • 적절한 인증 정보

인증 정보는을 통해 명시 적으로 지정할 수 있으며 $XAUTHORITY기본값은 ~/.Xauthority그렇지 않은 것입니다.

경우 $DISPLAY$XAUTHORITY사용자에 대한 설정, sudo너무, 새로운 쉘을 설정합니다, 모든 것이 잘 작동합니다.

설정하지 않으면 기본값이 잘못 설정되어 X 응용 프로그램을 시작할 수 없습니다.

데비안 $XAUTHORITY에서는 일반적으로 명시 적으로 설정되지 않습니다. 그냥 추가

export XAUTHORITY=~/.Xauthority

당신의 .bashrc또는 명시 적으로 말하고 XAUTHORITY=~/.Xauthority sudo ...모든 것이 작동해야합니다.

xauth list올바른 인증 정보가 있는지 확인할 수도 있습니다.


1
xauth info권한 파일 경로를 보여줍니다
Tomas Tomecek

1
xhost +내 문제 해결
danger89

3
xhost +인증 을 완전히 비활성화하고 모든 사람이 화면의 모든 응용 프로그램에 액세스 할 수 있도록합니다.
michas

1
데비안에서 XAUTHORITY 내보내기를 루트로 입력합니까? deb10에서 작동하지 않기 때문에?
marinara

sudo -i대신 @marinara를 사용하십시오 sudo su -.
michas

23

나는 당신과 같은 질문을했지만 일반 사용자를위한 것입니다. 사용자 계정 foo를 사용하여 firefox를 시작하고 싶다고 가정 해 봅시다. 바로 로그인했습니다 :

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

슬프게도 그 명령은 질문에서와 같은 오류로 실패했습니다 (즉, 프로토콜이 지정되지 않았으며 디스플레이를 열 수 없습니다)

내 해결책은 단순히 foo 사용자를 X 서버에 대한 인증 된 액세스 목록에 추가하는 것입니다.

xhost si:localuser:foo

그리고 그것은 sudofoo를 사용하여 Firefox (및 다른 X 응용 프로그램)를 시작할 수있었습니다 .

배경 : X Window에는 클라이언트 / 서버 아키텍처가 있습니다. 응용 프로그램을 시작할 때 X 서버 인증을 요청하여 응용 프로그램을 표시합니다. 기본적으로 세션을 열면 (그래픽으로 로그인) 사용자 (사용자)는 서버와 통신하고 응용 프로그램을 표시 할 수 있습니다. 다른 사용자는 사용자가 지정하지 않으면이 권한이 없습니다. xhost권한 목록을 조작하는 도구입니다. 는 si규칙이 서버 측임을 나타낸다하고 로컬 사용자 인증 foo디스플레이 응용에있다. X Window는 이와 관련하여 매우 강력하며 DISPLAY환경 변수를 사용하여 원격 응용 프로그램을 로컬로 표시 할 수 있습니다 xhost(단, 이에 한하지 않음). 예전에는 사람들이 입력했을 때xhost + 암시 적으로 모든 사람이 자신의 X 세션을 사용할 수 있도록 허용했습니다. 요즘은 사람들이 X Window 클라이언트 / 서버 아키텍처를 사용하여 점점 줄어들지 않기 때문에 화면에 장난으로 응용 프로그램을 표시 할 수있었습니다. 지난 10 년).

추신 : 나는 나중에 pdf.js와 같은 취약점 을 피하기 위해 일종의 "감옥"으로 Firefox를 시작하기 위해 이것을했습니다 . 그러나 sudo를 통해 Firefox를 호출하면 오디오 또는 비디오 하드웨어에 액세스 할 수 없다는 것을 빨리 알았습니다. 그러나 sudo를 통해 Firefox를 호출 할 때 비디오 하드웨어 가속 및 오디오를 활성화하는 방법을 명확하게 설명 하는 사람이 있습니다. 이 지침이 포함 된 YMMV, 예를 들어, 여전히 오디오에 대한 권한이 거부되었지만 비디오는 양호합니다 (SELinux가 켜진 Fedora 22에서 테스트 됨).


1
내 경우에는 foo이었다 root, 즉 내가 실행했다 xhost si:localuser:root우분투 17.10에.
Karl Richter

xhost si:localhost<user>명령을 어디에 추가 합니까? 로그온 한 사용자가 없으면 권한을 부여 할 수있는 X 서버가있는 사람이 없습니다.
cbcoutinho

@cbcoutinho 위의 사용 사례는 누군가가 로그온하여 같은 호스트에서 다른 사람으로 XWindow 응용 프로그램을 실행하려는 경우입니다. 유스 케이스를 설명하면 (해결하려는 문제가 무엇인지) 잠재적으로 도와 드릴 수 있습니다.
Huygens

@Huygens GPU가 장착 된 유체 시뮬레이션을위한 워크 스테이션이 있습니다. 나는 일반적으로 워크 스테이션 자체에 ParaView구축 된 프로그램을 사용하여 시각화를 렌더링합니다 vtk. ParaView또한 ssh를 통해 안전한 헤드리스 클라이언트 / 서버 렌더링 모델을 제공합니다. VNC 대신 원격을 이용하고 싶습니다. 워크 스테이션에 로그인하고을 실행 xhost하지 않으면 GPU를 사용할 수 없습니다. 즉, 컴퓨터를 원격으로 재부팅 할 수 없으며 여전히 GPU에 액세스 할 수 있습니다.
cbcoutinho

1
@cbcoutinho X Window는 클라이언트 서버 아키텍처입니다. ssh를 통해 연결하면 로컬 워크 스테이션이 클라이언트 X Window가됩니다. xhost를 rlogin과 같은 안전하지 않은 프로토콜과 함께 사용할 수 있지만 ssh는 사용할 수 없습니다. ssh에게 지시해야합니다. ssh 에서 -X또는 (better?) -Y플래그를 사용하면 올바른 리디렉션이 수행됩니다. 물론 로컬 C 서버가 필요합니다. 그러나 GPU와 OpenGL을 사용하면 렌더링 / 계산이 발생하는 위치가 서버가 아닌 클라이언트 측에 있는지 확실하지 않습니다. 까다로울 수 있습니다.
Huygens

10

당신은 할 수 있습니다

다음을 추가하여 명령 행에서 사용할 디스플레이를 지정하십시오. -display :0.0

또는

루트의 로그인 스크립트에서 환경 변수를 설정하십시오 (.bashrc, .profile, .bash_profile 중 하나).

export DISPLAY=:0.0

설정되어 있는지 확인할 수 있습니다.

$ env |grep DISPLAY
DISPLAY=:0.0

모든 호스트의 모든 사용자에 대한 디스플레이를 일반 사용자로 열려면 다음을 수행하십시오.

xhost +


1
xhost +는 sudo로 들어가기 전에 임시 조치로 작동합니다
Octopus

1
xhost +아래의 터미널이 아닌 권한 부여 사용자의 터미널에서 실행해야한다는 것을 잊어 버렸다는 것을 잊어 버렸습니다 sudo su.
nyxee

1
붐과 같은 완벽한 작업
Adiii

3

데비안을 사용하는 경우 간단하고 지원되는 솔루션은 sudoX11 인증 자격 증명을 복사하는 것입니다. 이 목적을 위해 패키지에 pam_xauth포함되어 libpam-modules있습니다. 그것을 사용하려면, 당신은 추가해야합니다

session  optional  pam_xauth.so

당신에 /etc/pam.d/sudo파일. 에 추가 할 수도 있습니다 su. 자세한 내용은 pam_xauth매뉴얼 페이지를 참조하십시오 .


2

나에게 도움이 된 것 :

  1. 당신은 할 수 있습니다 xauth generate :0 . trusteduser면, 이는 새로운를 생성합니다MIT-MAGIC-COOKIE-1
  2. xauth list' as사용자 and루트 (they should be the same if yourxAuthority 변수 를 사용 하여 새로 작성된 키가 동일한 파일을 가리키는 지 확인하십시오.

  3. Voila 는 터미널에서 root액세스 X-App하지만 일시적으로 만 액세스합니다 .

영구적으로 만들려면 @Huygens의 답변을 참조하십시오!


1

대체 솔루션 :

현재 x 사용자가 루트가 아닌 경우 루트에서 실행중인 cron과 같은 서비스는 표시 할 액세스 권한이 없습니다.

우리는 루트 사용자를 x에 추가하면됩니다. 시작시 스크립트를 사용하여 로그인 할 때 할 수 있습니다

xhost local:root

테스트 목적으로 우리는 현재 사용자에서 명령보다 명령을 실행하고 루트 스크립트 / 작업 / 서비스 /를 다시 시작할 수 있습니다 ...


궁금한 점이 있는데 왜 cron을 통해 GUI 앱을 실행하겠습니까?
Octopus

내 배포판에는 시스템 보안 상태를 확인하고 보고서를 만드는 루트 크론 작업 (msec)이 있습니다 ... 그러므로 보고서를 확인하기 위해 로그로 이동하는 대신 작업이 실행될 때 보고서에 팝업 GUI가있는 것을 선호합니다
intika

이것은 나를 위해 일했다
Marcus Vinicius Pompeu

0

sudo명령에는 환경 변수를 유지하기위한 스위치가 있습니다.

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

-E 스위치를 사용하여 명령을 실행할 수 있습니다. 예:

sudo -E wireshark

웹 브라우저와 같은 개인 정보 보호 응용 프로그램을 실행할 필요가 없다면 sudo와 함께 -E 스위치를 추가하는 것이 좋습니다. -E 스위치 만 추가하면 Chrome 또는 Firefox를 실행할 수 없습니다 . 많은 브라우저가 사용자 공간 위반에 대한 보호를 구현했기 때문에. @huygens의 답변 은이 주제에 대한 통찰력을 가질 수 있습니다.

주 : 추가 -E 스위치는 사용자의 환경이없는 것없는 도움 경우 DISPLAY XAUTHORITY 이미 올바르게 설정 .


-1

이 명령을 사용하면 작동합니다

sudo cp /home/user/.Xauthority .Xauthority

2
이것은 cp: cannot stat ‘/home/user/.Xauthority’: No such file or directory내가 액세스 할 수있는 10 개 이상의 데비안 기반 컴퓨터 중 하나를 제공합니다.
Anthon

이것은 약간의 맥락을 제공합니다 (예를 들어, 현재 디렉토리를 조용히 기대합니다). 그리고 여러 X11 인스턴스에서 그렇게 할 때 문제와 같은 부작용은 언급하지 않습니다. 나는이 방법이 약간 해키라고 생각합니다.
v6ak
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.