web-dev-qa-db-ja.com

別の(非root)ユーザーとしてのGUIアプリケーションの実行

2つのユーザーアカウントuser1user2があるとします。 user1としてログインし、suを使用してuser2に切り替えると、コマンドラインプログラムを実行できますが、GUIプログラムが失敗します。

例:

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

では、どうすればGUIアプリケーションを実行できますか?

36
sashoalm

su vs. su-

別のユーザーになるときは、通常、su - user2を使用します。ダッシュは、user2の.bash_profileを強制的に調達します。

xhost

さらに、ディスプレイへのアクセスをユーザーに許可する必要があります。これはXによって制御されます。コマンドxhost +を使用して、他のユーザーにGUIをuser1のデスクトップに表示する許可を与えることができます。

注:xhost +を実行するときは、user1に属するシェル内でこれを実行する必要があります。

$ DISPLAY

User2になると、環境変数$DISPLAYの設定が必要になる場合があります。

$ export DISPLAY=:0.0
43
slm

ser1から認証トークンを共有する必要があります(~ser1)のホームです:

cat ~/.Xauthority | Sudo -u user2 -i tee .Xauthority > /dev/null
10
user4674453

X11転送を使用できます。

ssh -XY otheruser@localhost your-gui-program-name-here
10
Michael Franzl

別のユーザーからアプリを起動できます。ユーザー1でログイン(GUI)しているときに、user2からgimpアプリを起動します。

$ xhost +
$ Sudo su user2

(パスを入力してください)

$ gimp

楽しい :)

6
Antoni Stavrev

あなたはsuxコマンドを試すことができます:

sux user2

suxは$ DISPLAYのものを処理します。あなたはそれをインストールする必要があるかもしれません:

Sudo apt-get install sux

debian/Ubuntuの下。

4
phil

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. _$DISPLAY_を介してguestユーザーに現在のユーザーへの__xhost +SI:localuser:guest_アクセス権を付与します
  2. セキュリティポリシーで問題ないと判断した場合、_ssh-askpass_を使用してグラフィカルにパスワードを要求します(もちろん、sudoers(5) _NOPASSWD:_を使用してこれを回避できます。または、他のaskpassプログラム、またはそれらを構成ファイルで指定します(_--askpass_の詳細については、Sudo(8)を参照してください)
  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が終了した後でも(マシンをシャットダウンしていないか、ディスプレイからログアウトしていない限り-スクリーンセーバー、休止状態などは魔法のクッキーを変更しませんでした)。

ローカルユーザー1人のみがディスプレイにアクセスでき、コマンドが実行されている間のみ(コマンドが終了すると、_$AUTHUSER_はディスプレイにアクセスできなくなります)。

別の安全な代替策は_ssh -X_です(_-Y_を使用しないと安全性が低下します。詳細はssh_config(5)の_ForwardX11Trusted_を参照してください)。それをスクリプト化しますが、追加のオーバーヘッドを引き起こし(たとえば、遅い)、一部のプログラムはnsafe _-Y_なしでは正しく機能しない可能性があります。

0
Matija Nalis