2つのユーザーアカウントuser1
とuser2
があるとします。 user1
としてログインし、su
を使用してuser2
に切り替えると、コマンドラインプログラムを実行できますが、GUIプログラムが失敗します。
例:
user1@laptop:~$ su - user2
user2@laptop:~$ leafpad ~/somefile.txt
No protocol specified
leafpad: Cannot open display:
では、どうすればGUIアプリケーションを実行できますか?
別のユーザーになるときは、通常、su - user2
を使用します。ダッシュは、user2の.bash_profile
を強制的に調達します。
さらに、ディスプレイへのアクセスをユーザーに許可する必要があります。これはXによって制御されます。コマンドxhost +
を使用して、他のユーザーにGUIをuser1のデスクトップに表示する許可を与えることができます。
注:xhost +
を実行するときは、user1に属するシェル内でこれを実行する必要があります。
User2になると、環境変数$DISPLAY
の設定が必要になる場合があります。
$ export DISPLAY=:0.0
ser1から認証トークンを共有する必要があります(~
はser1)のホームです:
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
debian/Ubuntuの下。
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
_
コードは:
$DISPLAY
_を介してguest
ユーザーに現在のユーザーへの__xhost +SI:localuser:guest
_アクセス権を付与しますssh-askpass
_を使用してグラフィカルにパスワードを要求します(もちろん、sudoers(5)
_NOPASSWD:
_を使用してこれを回避できます。または、他のaskpass
プログラム、またはそれらを構成ファイルで指定します(_--askpass
_の詳細については、Sudo(8)
を参照してください)sudoers(5)
にアクセス権がある場合)、別のユーザーとしてコマンド_/usr/bin/firefox-esr
_を実行します(guest
)guest
)が_$DISPLAY
_にアクセスする権限は、_xhost -SI:localuser:guest
_を介して取り消されます最後に、_Sudo -K
_はキャッシュされたパスワードを削除するため、次回_ssh-askpass
_を呼び出すと、(キャッシュされたパスワードを使用する代わりに)パスワードを再度要求されます
gksu(8)
またはsux(8)
が行ったことより少し作業量が多くなりますが、スクリプトで記述でき、次の場合よりもはるかに安全です。
xhost +
_(有効である限り、すべてのユーザーがグラフィック表示にアクセスできます)gksu
/sux
が行ったこと(_~/.Xauthority
_の一時的なコピー。これにより、指定されたユーザーが_MIT-MAGIC-COOKIE-1
_をコピーし、gksu/suxが終了した後でも(マシンをシャットダウンしていないか、ディスプレイからログアウトしていない限り-スクリーンセーバー、休止状態などは魔法のクッキーを変更しませんでした)。ローカルユーザー1人のみがディスプレイにアクセスでき、コマンドが実行されている間のみ(コマンドが終了すると、_$AUTHUSER
_はディスプレイにアクセスできなくなります)。
別の安全な代替策は_ssh -X
_です(_-Y
_を使用しないと安全性が低下します。詳細はssh_config(5)
の_ForwardX11Trusted
_を参照してください)。それをスクリプト化しますが、追加のオーバーヘッドを引き起こし(たとえば、遅い)、一部のプログラムはnsafe _-Y
_なしでは正しく機能しない可能性があります。