루트가 아닌 다른 사용자로 GUI 응용 프로그램 실행


34

하자 내가 2 개 사용자 계정을 갖고 있다고 user1하고 user2. 로 로그인 user1한 다음를 user2사용으로 전환하면 su명령 줄 프로그램을 실행할 수 있지만 GUI 프로그램은 실패합니다.

예:

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

그렇다면 어떻게 GUI 응용 프로그램을 실행할 수 있습니까?


내가 발견 한 주된 이유 중 하나는 이것이 실패한다는 $XAUTHORITY것이 여전히 user1 's로 설정되어 있기 때문에 ~/.Xauthority프로그램이 읽으려고 시도하고 파일이 일반적으로 모드 0600 ( -rw-------) 이기 때문에 실패 한다는 것입니다. user2를 포함하여 "other"그룹의 모든 사용자가 읽습니다. 당신이 chmod o+r ~/.Xauthority(user1로서), 당신은이 문제를 해결하기 위해 해킹했을 것입니다. 나는 이것을 보여주는 스크립트 를 썼다 .
Braden Best

답변:


42

수 대 수-

다른 사용자가되면 일반적으로 사용하려고합니다 su - user2. 대시는 user2 .bash_profile가 소스를 얻 도록 강제합니다 .

xhost

또한 사용자에게 디스플레이에 대한 액세스 권한을 부여해야합니다. 이것은 X에 의해 제어됩니다.이 명령 xhost +을 사용하여 다른 사용자에게 GUI를 user1의 데스크탑에 표시 할 수있는 권한을 부여 할 수 있습니다.

참고 : 실행할 때 xhost +당신이 USER1에 속하는 쉘에서 여전히 동안을 실행 할 수 있습니다.

$ DISPLAY

user2가되면 환경 변수를 설정해야합니다 $DISPLAY.

$ export DISPLAY=:0.0

1
xhost +user2여전히 나 에게이 오류가 발생 xhost: bad hostname "user2"합니다. 나는 일부를 봤는데, xhost +user2@laptop또는 할 필요가있는 것 같습니다 xhost +user2@localhost. 그런 다음 말합니다 xhost +user2@localhost being added to access control list.
sashoalm

1
그러나도에 사용자를 추가 한 후 xhost, 및 지정 export DISPLAY=:0.0, 실행 leafpad여전히 나를를 제공 No protocol specified leafpad: Cannot open display:하고, 실행하는 데 실패합니다. linuxquestions.org/questions/linux-newbie-8/… 에서이 링크를 찾았습니다 . 여기에는 몇 가지 매직 쿠키가 xauth있습니다. 이러한 것들이 컴퓨터에서 작동하는지 테스트 했습니까? 어쩌면 구성과 다른 점이 있습니까? 데비안 + LXDE에 있습니다.
sashoalm

1
고마워하고 xhost +작동하며 다른 것은 필요하지 않은 것 같습니다 (설정하지 않아도 됨 $DISPLAY). 답변을 업데이트 할 수 있습니까? 동의합니다.
sashoalm

5
아, 뭔가 찾았 어 Fedora 21에서 running xhost은 형식의 목록을 제공 SI:localuser:USERNAME하므로 xhost SI:localuser:user2작동합니다. 아 그리고 사용자의 디스플레이는를 사용하여 찾을 수 있습니다 w.
Wilf

7
xhost +x-server에 연결할 수있는 모든 호스트의 모든 사용자가 화면에 액세스 할 수 있습니다. xhost +SI:localuser:user2데비안에서 나를 위해 일합니다.
robartd

9

user1 에서 인증 토큰을 공유해야합니다 (가정 ~user1의 홈 이라고 가정 ).

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

1
이것은 나를 위해 일한 유일한 대답입니다 (Ubuntu 14).
sudo

이 솔루션은 원격 시스템 (= X Win 클라이언트) 내에서 잘 작동하지만 다른 답변의 xhost 솔루션은 로컬 시스템 (= X Win 서버)에서 실행해야합니다.
Jpsy

tee -a기존 정보가 방해받지 않도록 사용 하는  것이 더 안전 할 수 있습니다 .Xauthority.
스콧

7

X11 전달을 사용할 수 있습니다.

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

이것은 훌륭한 솔루션입니다. 내가 지금까지 읽은 가장 간단한. x11 구성보다 ssh에 훨씬 더 많은 사람들이 익숙합니다.
알렉시스 Panagiotootopoulos

6

다른 사용자로부터 앱을 시작할 수 있습니다. 사용자 1로 로그인 (GUI) 한 상태에서 user2에서 gimp 앱을 시작하겠습니다.

$ xhost +
$ sudo su user2

(패스)

$ gimp

즐겨 :)


4
이것은 네 살짜리 대답과 같습니다.
G-남자 '는 분석 재개 모니카'말한다

더 나은 방법을 알려줄 수 있습니까?
Antoni Stavrev

나는 항상이 방법을 사용했지만 데비안과 Xfce에서는 더 이상 작동하지 않습니다. ( 수정 : 그것은 작동하지만 export DISPLAY받아 들인 대답이 말한대로 먼저 해야합니다 )
giusti

세션을 종료 한 후 다음을 수행하여 세션을 비활성화하는 것이 좋습니다.$ xhost -
Antoni Stavrev

4

sux 명령을 시도 할 수 있습니다.

sux user2

sux가 $ DISPLAY를 처리 할 것입니다. 다음과 같이 설치해야 할 수도 있습니다.

sudo apt-get install sux

데비안 / 우분투에서.


4
sux더 이상 데비안 또는 우분투에서 배송되지 않습니다. 내가 찾을 수있는 최선의 대안은 영구적으로 사용하거나 사용할 수 있도록 xhost SI:localuser:root(또는 어떤 사용자라도) 추가 ~/.xprofile하는 것입니다runuser
stefanct

위로 데비안 스트레치 등을하고 있었다 gksu/ gksudo가공 한 미세 그 대안. 여전히 Sid에있는 동안 보안 문제로 Buster에서 제거됩니다.
Matija Nalis

0

대안에 관해서는 sux, 안전하게 (그래픽 명령을 실행하기 위해 firefox-esr아래의 예에서와) 같은 $AUTHUSER( guest아래 예제) :

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

코드는 다음을 수행합니다.

  1. 제공 guest현재 사용자에 대한 사용자 액세스 $DISPLAY를 통해를xhost +SI:localuser:guest
  2. ssh-askpass그래픽으로 암호를 묻는 데 사용 합니다. (물론 sudoers(5) NOPASSWD:보안 정책에 문제가 있다고 생각되면 이것을 피할 수 있습니다 . 또는 다른 askpass프로그램을 사용 하거나 구성 파일에 지정할 수 있습니다 (자세한 내용 sudo(8)은 참조 --askpass)
  3. 비밀번호가 괜찮고 (및 권한이있는 경우 sudoers(5)) /usr/bin/firefox-esr다른 사용자 ( guest) 로 명령 을 실행합니다.
  4. 프로그램이 완료된 후 다른 사용자 ( guest)에게 액세스 권한은 다음 $DISPLAY을 통해 취소됩니다.xhost -SI:localuser:guest
  5. 마지막으로 sudo -K캐시 된 암호를 제거하므로 다음에 호출하면 캐시 된 암호 ssh-askpass를 사용하는 대신 암호를 다시 묻습니다.

    그것보다 조금 더 많은 작업을하는 동안 gksu(8)또는 sux(8)한을, 그것은 스크립트, 그리고 훨씬 더 안전보다 될 수있다 :

    • xhost + (모든 사용자는 효력이있는 한 그래픽 디스플레이에 액세스 할 수 있습니다)
    • 다른 사용자가 읽을 수있는 ~ / .xauth (해당 사용자가 디스플레이에 무제한 액세스)
    • 어떤 gksu/ sux의 (임시 복사본 한 ~/.Xauthority당신을 복사 할 사용자를 지정 허용 MIT-MAGIC-COOKIE-1디스플레이를 사용하여 계속을 후에도 gksu / SUX 당신이 종료 기계하지 않았다 나 디스플레이의 로그 아웃만큼 (완료 - 스크린 세이버, 최대 절전 모드 등이 마법을 변경하지 않은 쿠키).

단 하나의 로컬 사용자 만 디스플레이에 액세스 할 수 있으며 명령이 실행되는 동안 만 (명령이 완료 $AUTHUSER되면 더 이상 어떤 방식 으로든 디스플레이에 액세스 할 수 없음).

또 다른 안전한 대안이다 ssh -X(없이 -Y볼! 어떤 실제로 당신이 덜 안전한 수 ForwardX11Trustedssh_config(5)로 당신이 그것을 스크립팅하지 않으면 사용하기가 쉽습니다 세부 사항)하지만 additinal 오버 헤드 유도 (예를.이 느립니다) 및 일부 프로그램이 제대로 작동하지 않을 수 있습니다 안전 하지 않은-Y .


-1

설치 UI를 user2 로로드해야합니다 .

이것을 따르십시오 :

루트로그인 :

sudo su

x 서버를 테스트하십시오.

xclock

시계가 작동하는 것을 볼 수 있다면 좋습니다. 이제 다음을 실행하십시오.

xhost

결과는 다음과 같아야합니다.

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

이제 user2가 xhost에 액세스 하도록하십시오

xhost +SI:localuser:user2

이제 user2에 다시 로그인 하여 GUI 프로그램을 열어보십시오.


(1)이 질문에서 루트로 실행해야하거나 루트로 실행하는 것이 유리한 부분은 없습니다. (1b) 루트로 실행하면 문제를 혼란스럽게 할 수 있습니다. (2) 사용할 이유가 거의 없습니다 sudo su. 사용  sudo또는  su; 하나를 선택. (3) 질문은  user1및로 표시  user2됩니다. user1및로  답변을 작성하십시오  user2. (하지 마십시오 tri. 없음  ) (4)에 대한 설명이 포함되어 있으면 대답이 더 나을 것입니다  SI:localuser. ……………… 의견에 응답하지 마십시오.  명확하고 완전하게 답변을 편집 하십시오.
스콧
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.