루트가 아닌 다른 사용자로 GUI 응용 프로그램 실행 있다고 user1하고 user2. 로

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

예:

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

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



답변

수 대 수-

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

xhost

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

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

$ DISPLAY

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

$ export DISPLAY=:0.0

답변

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

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

답변

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

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

답변

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

$ xhost +
$ sudo su user2

(패스)

$ gimp

즐겨 🙂


답변

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

sux user2

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

sudo apt-get install sux

데비안 / 우분투에서.


답변

대안에 관해서는 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 .


답변

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

이것을 따르십시오 :

루트로그인 :

sudo su

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

xclock

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

xhost

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

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

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

xhost +SI:localuser:user2

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