XDG_RUNTIME_DIR은 무엇입니까? Evince 를 열려고했지만 오류가 발생했습니다. neo@Muhammad:~$ sudo

커맨드 라인에서 Evince 를 열려고했지만 오류가 발생했습니다.

neo@Muhammad:~$ sudo evince

No protocol specified

** (evince:4164): WARNING **: Could not open X display
No protocol specified
error: XDG_RUNTIME_DIR not set in the environment.
Cannot parse arguments: Cannot open display:

이 문제를 해결하는 방법은 무엇입니까?



답변

가장 먼저해야 할 일 : XDG_RUNTIME_DIR

첫 번째 질문 인 “XDG_RUNTIME_DIR은 무엇입니까?” 이는 로그인 할 때 자동으로 설정되는 환경 변수입니다. 실행중인 프로그램에 작은 임시 파일을 저장할 수있는 사용자 별 디렉토리를 찾을 수있는 위치를 알려줍니다. 참고 XDG_RUNTIME_DIR로 설정 pam_systemd(8) 그래서 실제로 관련이없는, X 문제입니다 (그래픽 프로그램을 실행)는, 당신은있을 것 같다.

문제 해결 방법

두 번째 질문 인 “이 문제를 해결하는 방법?” 아주 좋은 것입니다. 즉 , 수정의 내용 뿐만 아니라 직접 해결 하는 방법 에 관심이 있습니다. 시작하려면 첫 번째 오류 메시지를 먼저보십시오. 특히, 검색 No protocol specified하거나 WARNING **: Could not open X display, 문제가 함께 있음을 보여 주어야 X (라고도 은 X 윈도우 화 시스템 화면에 표시되는 방법을 그래픽 프로그램입니다). 이를 알고 있으면 많은 문제 해결 질문이 떠오를 것입니다.

X 디스플레이

다음 질문은이 “X 디스플레이” 가 무엇입니까? “디스플레이”는 화면의 주소입니다. [*] 화면에 쓰려는 프로그램은 주소를 알아야합니다. DISPLAY 환경 변수를 확인하여 X 디스플레이가 무엇인지 확인할 수 있습니다.

echo $DISPLAY

다음 sudo을 입력하여 DISPLAY가 어떻게 생각 하는지 확인할 수 있습니다 .

sudo -s
echo $DISPLAY
exit

아무것도 표시되지 않으면 문제입니다. (아래 수정 참조).

XAUTHORITY

그러나 그것이 문제가 아니며에 DISPLAY올바르게 설정되어 sudo있다면 어떨까요? 그렇다면 X에 다른 사용자가 내 디스플레이에 글을 쓰지 못하게하는 일종의 권한이 있습니까? 당신이 생각하는 경우, 당신이 바로 것, X는 두 가지 인증 방법을 가지고 xauthxhost. 오늘날 가장 일반적으로 사용되는 것은 xauth(1)XAUTHORITY 환경 변수 를 사용하는 것입니다. 다시 한 번 제대로 설정되어 있는지 확인하십시오 sudo.

echo $XAUTHORITY
sudo -s
echo $XAUTHORITY
exit

경우 XAUTHORITY당신을 위해 홈 디렉토리에있는 파일을 가리키고 있지만 실행 그것의 빈은 sudo, 다음 문제의 그.

FIX : 환경 변수 저장

그래서 수정은 무엇입니까? 어느 경우 DISPLAYXAUTHORITY환경 변수가시 저장되지 않아요 sudo, 당신은 말할 수있다 sudo(8) 사용하여 환경을 보존하기 위해 -E과 같이, 옵션 :

sudo -E evince

더 좋은 방법 : env_keep

잠깐만, -E모든 것이 마술처럼 작동한다면 왜 이것이 기본이 sudo아닌가? 그 대답은 잠재적 인 보안 위험이라는 것입니다. 환경 변수는 프로그램 작동 방식에 영향을 미치며 사용자 계정에서 루트로 모두 내보내지는 것을 원하지 않습니다. 이를위한 “올바른”방법은 (8)을 사용하여 ( 5) 파일에 행 Defaults env_keep += "DISPLAY XAUTHORITY"을 추가하는 것입니다 . 다음을 실행하여 sudo가 유지하는 환경 변수를 확인할 수 있습니다.sudoersvisudo

sudo sudo -V

(예, sudo두 번 입력하십시오 ). 줄을 기본 sudoers 파일 ( /etc/sudoers)이 아니라 시스템을 업그레이드 할 때 덮어 쓰지 않는 로컬 파일에 넣는 것이 좋습니다 . 당신은 그렇게 할 수 있습니다 :

sudo visudo -f /etc/sudoers.d/local

그러나 위의 어느 것도 작동하지 않으면 어떻게 될까요?

나는 이것이 상당히 철저한 대답이라고 생각하지만 여전히 문제가있는 경우 다른 제안이 있습니다. xhost(1) 을 사용 하여 로컬 호스트 (시스템)의 특정 사용자에게 액세스 권한을 부여 할 수 있습니다 .

xhost si:localuser:root

이 경우 프로그램 rootsudo실행 하는 계정이므로 사용자 이름으로 지정 됩니다.


[*] : Q : 하나의 화면 만 있는데 X 디스플레이에 “주소”가 필요한 이유는 무엇입니까? A : X 는 컴퓨터뿐만 아니라 인터넷에서도 작동 할 수 있기 때문 입니다. X를 사용하면 컴퓨터에서 다른 인터넷 호스트에 표시되는 프로그램과 화면에 표시되는 다른 호스트에있는 프로그램을 쉽게 실행할 수 있습니다 (허가를받은 경우).


답변

XDG_RUNTIME_DIRX Windows 컨텍스트에 설정된 환경 변수이므로 프로그램에서 찾을 수 있습니다. 귀하 ( neo)가 그래픽 컨텍스트를 설정했습니다.

실행하려고하면 evince같은 root, 당신은 사용자가 (조건 입력 한 root) 다른 사용자의 (액세스하려고 neo) 디스플레이를. 이것은 나쁜 것으로 간주됩니다.

그래픽 편집기를 다음과 같이 실행해야한다면 root읽고 man gksudo
사용하십시오 gksudo.


답변