別のユーザーとしてログインした後、GUIプログラムを実行するにはどうすればよいですか?
thufir@doge:~$
thufir@doge:~$ Sudo -u hawat -i
hawat@doge:~$
hawat@doge:~$ whoami
hawat
hawat@doge:~$
hawat@doge:~$ pwd
/home/hawat
hawat@doge:~$
hawat@doge:~$ echo $HOME
/home/hawat
hawat@doge:~$
hawat@doge:~$ firefox
No protocol specified
Failed to connect to Mir: Failed to connect to server socket: No such file or directory
Unable to init server: Could not connect: Connection refused
Error: cannot open display: :0
hawat@doge:~$
export DISPLAY=:0
は私のために働いた。接続しているシステムではなく、接続しているシステムでコマンドを実行してください!
この回答は、私のUbuntu 16.04とMirで動作します(わずかな適応があります):
xauth を使用して別のユーザーとしてxコマンドを実行します
便宜上、 ラッパーbashスクリプトを作成しました 、/usr/local/bin/xsudo
にダウンロードして実行可能(chmod +x /usr/local/bin/xsudo
)にマークする場合があります。
次に、単に実行します
xsudo hawat firefox
pam_xauth
(s。 この答え )を調べることもできますが、これは何らかの理由で機能しません。 (Firefoxが:0でディスプレイに接続できないというエラーが引き続き表示されます)xhost +local:
または類似のコマンドが表示される場合があります。このコマンドは、willgksudo -u hawat firefox
をラッパースクリプトなしで機能させます。 ただし、これにより、セキュリティの抜け穴が開くことに注意してください:ローカルホストはキーボード、マウス、画面などにアクセスできます。これにあまりにも多くの時間を費やした後、Ubuntu 16.04のGnomeで正しい値がDISPLAY=:1
であり、昔からのDISPLAY=:0
ではないことを発見しました。
export DISPLAY =:は正常に機能しますが、ターミナルを開くたびにこれを入力する必要があるため、これは一時的な解決策です。
永続的な解決策:問題は/ etc/sudoersのenv_keep変数が原因である可能性があります。 geditまたはSudo visudoを使用して、/ etc/sudoersの最後に次の行を追加します
デフォルトenv_keep + = "DISPLAY"
注: env_keepに追加するときは、常に"+ ="を使用することに注意してください。 "="で他のenv_keepがある場合、"=" =を使用すると他の値が上書きされるため、それらを"+ ="に変更します。