別の(非ルート)ユーザーとして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アプリケーションをどのように実行できますか?


これが失敗する主な理由の1つは、プログラム$XAUTHORITYがまだuser1's ~/.Xauthorityに設定されているためです。プログラムはこれを読み取ろうとしますが、そのファイルは通常モード0600(-rw-------)、つまり利用できないため失敗しますuser2を含む「other」グループの誰でも読むことができます。あなたがchmod o+r ~/.Xauthority(user1として)あなたがこの問題を回避する方法をハックしたという意味です。これを示すスクリプトを書きました。
ブレーデンベスト

回答:


42

su vs. su-

別のユーザーになるときは、一般的に使用したいですsu - user2。ダッシュはuser2の.bash_profileソースを強制します。

xhost

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

注:実行している場合は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 14年

1
しかし、でユーザーを追加しxhost、指定した後でもexport DISPLAY=:0.0、実行するとleafpadまだが表示され、実行にNo protocol specified leafpad: Cannot open display:失敗します。このリンクはlinuxquestions.org/questions/linux-newbie-8/…で見つけました。これには、魔法のCookieとがありxauthます。これらの機能がコンピューター上で機能することをテストしましたか?たぶん私の構成と何か違うのでしょうか?私はDebian + LXDEを使用しています。
sashoalm 14年

1
ありがとう、xhost +動作し、他に何も必要ないようです(設定する必要はありません$DISPLAY)。回答を更新してもらえますか、それを受け入れますか?
sashoalm 14年

5
ああ、何かを見つけました。Fedora 21では、実行xhostするとリストがの形式SI:localuser:USERNAMEで表示されるため、動作するxhost SI:localuser:user2はずです。ああ、ユーザーの表示はを使用して見つけることができますw
ウィルフ

7
xhost +x-serverに接続できるすべてのホストのユーザーが画面にアクセスできるようにします。xhost +SI:localuser:user2Debianで動作します。
robartsd

9

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

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

1
これは私のために働いた唯一の答えです(Ubuntu 14)。
須藤

このソリューションは、リモートマシン(= X Winクライアント)からうまく機能しますが、他の回答のxhostソリューションはローカルマシン(= X Winサーバー)で実行する必要があります。
Jpsy

tee -a既存の情報を破壊することを避けるために使用する方  が安全かもしれません.Xauthority
スコット

7

X11転送を使用できます。

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

これは素晴らしいソリューションです。これまで読んだ中で最も簡単なもの。x11構成よりもはるかに多くの人がsshに精通しています。
アレクシス

6

別のユーザーからアプリを起動できます。ユーザー1でログイン(GUI)しながら、ユーザー2からgimpアプリを起動します。

$ xhost +
$ sudo su user2

(パスを入力)

$ gimp

楽しい :)


4
これは、4年前に受け入れられた回答と同じです。
G-Manが「Reinstate Monica」と言う

より迅速な方法を教えてもらえますか?
アントニスタヴレフ

私は常にこの方法を使用していましたが、DebianとXfceを使用することはもうできません。(訂正:それは作業を行いますが、私が持ってexport DISPLAY受け入れ答えが言うように、最初の)
ジュスティ

セッションを終了した後、それを無効にすることをお勧めします$ xhost -
Antoni Stavrev

4

suxコマンドを試すことができます:

sux user2

suxが$ DISPLAYを処理します。以下を使用してインストールする必要がある場合があります。

sudo apt-get install sux

Debian / Ubuntuの下。


4
suxDebianまたはUbuntuによって出荷されなくなりました。私が見つけることができる最良の代替案は、永続的に許可するか使用するためにxhost SI:localuser:root(または任意のユーザー)を追加することです~/.xprofilerunuser
-stefanct

Debian Stretchまでは、うまく機能するgksu/ gksudo代替がありました。Sidのままですが、セキュリティ上の問題のためBusterで削除されます。
マティヤナリス

0

の代わりにsux、(firefox-esr以下の例の)グラフィカルコマンドを安全に実行するには$AUTHUSERguest次の例のように):

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終わった後でも、お使いのディスプレイを使用し続けますクッキー)。

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

別の安全な代替手段はssh -X(それなし-Yでは実際に安全性 が低下します!詳細を確認ForwardX11Trustedssh_config(5)てください)、スクリプトを作成していない場合は使いやすいですが、追加のオーバーヘッドを引き起こし(たとえば低速)、一部のプログラムが正しく動作しない可能性がありますなし安全ではありません -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)この質問には、rootとして実行する必要があるもの、またはrootとして実行することが有益なものはありません。(1b)どちらかといえば、rootで実行すると問題が混乱する可能性があります。(2)使用する理由はほとんどありません(もしあれば)sudo susudoまたはを  使用し  suます。一つを選ぶ。(3)質問はuser1およびの観点から書かれ  てい  user2ます。面であなたの答えを書いてください  user1と  user2。(するかしない。ない  tri。)(4)の説明が含まれていれば、あなたの答えはより良いだろう  SI:localuser。…………………コメントに返信しないでください。 回答を編集して、より明確で完全なものにします。
スコット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.