suユーザーの「プロトコル指定なし」を解決する方法


15

代替ユーザー(非管理者)を使用して、システムでグラフィカルソフトウェアを実行しようとしています。この代替ユーザーには名前が付けられ、同じ名前のリモートシステムユーザーに一致するUIDとGIDが与えられています。UIDは500なので、ユーザーは「非ログイン」ユーザーになります。

メインアカウントにログインしたUbuntuから開始して、ターミナルを開いsuて代替ユーザーにアクセスします。次に、コマンドを実行してアプリケーションを起動し、「プロトコルが指定されていません」を受け取ります。

これは、UIDが<1000であるsuか、ユーザーの非管理者であるか、またはユーザーの非管理者であるためですか?このユーザーにGUIでアプリケーションを実行させるにはどうすればよいですか?

回答:


15

ユーザーのUIDが原因で問題は発生していません。500はUIDとしては問題ありません。そのUIDは、いくつかのディスプレイマネージャーのデフォルト設定を除いて、「非ログイン」ユーザーにはなりません。

プロトコルが指定されていません」というエラーメッセージは、アプリケーション固有のエラーメッセージのように聞こえますが、役に立たないもののように聞こえますが、エラーは、X11ディスプレイにアクセスする権限がないためにアプリケーションがX11ディスプレイに接続できないことであると推測します別のユーザーとして実行されているためです。X11サーバーと通信するには、アプリケーションが「マジックCookie」(秘密トークン)を必要とするため、他のユーザーの下で実行されているシステム上の他のプロセスがディスプレイに侵入したり、ウィンドウを作成したり、キーストロークをスヌープしたりすることはできません。他のシステムユーザーは、このマジックCookieにアクセスできません。これは、デスクトップ環境を開始したユーザーのみがアクセスできるようにアクセス許可が設定されているためです(本来どおり)。

元のユーザーとして実行して、X11 Cookieを他のアカウントにコピーしてください:

su - <otheruser> -c "unset XAUTHORITY; xauth add $(xauth list)"

その後、アプリケーションを実行します。またXAUTHORITY、そのシェルでも設定を解除する必要がある場合があります。このコマンドxauth listは、メインユーザーからマジッククッキー()を抽出しxauth add、他のユーザーが取得できる場所に追加します()。


奇妙なことに、引用されたコマンドを使用すると、「su:端末から実行する必要があります」と表示されます。しかし、それはある ...ターミナルに
J・コリンズ

@JCollins xauth list >/tmp/xa.$$; su - <otheruser> -c "unset XAUTHORITY; xargs xauth add </tmp/xa.$$"; rm -f /tmp/xa.$$は、そこに恐ろしい競合状態があることに注意してください。
ロアイマ

@JCollinsは、ええ、suパスワードを要求したい場合には問題になります。この新しいコマンドを試してください。
セラダ

@Celada、金は御treat走をしました。そのコマンドが何をどのように行っているかを詳しく説明していただけますか?そして、おそらく元の転生がしなかった理由を説明しますか?
Jコリンズ

1
@JCollinsでは、毎回新しいマジックCookieが生成されるため、ログアウトしてからログインするたびにやり直す必要があります。それは正常であり、セキュリティモデルの一部です。
セラダ

6

私の場合、新しいディスプレイサーバーwaylandが問題でした。

そうするだけでxhost + local:、他のユーザー(ルートなど)がセッションでProgrammsを実行できますが、ネットワーク接続は許可されません。

任意のホストからのクライアントを許可する場合はxhost +、ホストをまったく指定せずに使用できます。ただしこれは安全ではありません。セッションへのアクセスを許可するホストを指定することをお勧めします。


1
私の場合、xhost +十分でした
danger89

1
@ danger89これは機能しますが、リモートアクセスを防止するファイアウォールルールがない場合、すべてのホストがセッションに接続できます(すべてのディストリビューションがすべての着信要求を拒否するファイアウォールルールを持っているわけではありません。たとえば、ubuntuにはサーバーへのアクセスを防ぐための事前設定されたルールがありませんユーザーがインストールする可能性のあるsambaまたはapache)。したがって、新しいLinuxユーザーの場合、これが問題になる可能性があります。個人的には、保存側だけにアクセスを制限します
-MADforFUNandHappy

3

総当たりでXとの接続を取得するとします...

既にサーバー(Xが実行されている場所)でコマンドを実行していると仮定します。そうでない場合は、最初にそれを動作させ、その後クライアントから 'ssh -X user @ server)を使用します;)

xauthコマンドを実行する方法はいくつかあります。たとえば、「sudo」を使用している場合でも、環境変数が失われるか、変更される可能性があります。次の環境変数を保持する必要があります:DISPLAYおよびXAUTHORITY。そうであるかどうかをテストするには、コマンドを実行するのと同じ方法で 'echo $ XAUTHORITY'を実行できますが、それらのコマンドを実行する前に環境変数を展開していないことを確認してください。たとえば、sudo bash -c 'echo "$ XAUTHORITY"'を試して、sudoを実行した後のXAUTHORITYの実際の状態を確認します(消えた場合は、sudoersファイルに何かを追加する必要がある場合があります。

最終的に、サーバー上で、アクセスしたいユーザーとして次のコマンドを実行します。

xauth info

これにより、使用される「Authority file」が表示されます(デフォルトでは/root/.Xauthority、rootの場合、または/home/theuser/.Xauthorityなど)。正しい.Xauthorityファイルが表示されていれば、実際にXAUTHORITY環境変数を心配する必要はありません(実際、そのファイルの非標準の場所を操作したい場合を除いて、実際にXAUTHORITY環境変数が表示されない場合はわかりません) )。

そのファイルを削除します(存在する場合):

rm /root/.Xauthority

/root/.Xauthorityケースに合った正しいXAUTHORITYファイルに置き換えます。

再作成しますが、空です(これは多くのコマンドに必要です):

touch /root/.Xauthority

この時点で、以前にInvalid MIT-MAGIC-COOKIE-1を取得した場合でも、No protocol specifiedエラーが表示されます。Xサーバーが現在使用しているオーソリティファイルを見つけます。

ps aux | grep Xorg

次のように表示されます。

root 1153 0.0 1.0 149560 44464 tty7 Ss+ dec02 0:00 /usr/lib/xorg/Xorg -nolisten tcp -auth /var/run/sddm/{ef18c483-7891-4e82-80ef-2c8f9bd79711} -background none -noreset -displayfd 17 vt7

後のファイル名-authは、次のコマンドで必要なものです。これをルートとして実行します:

sudo xauth -f '/var/run/sddm/{ef18c483-7891-4e82-80ef-2c8f9bd79711}' list

32桁の16進キーがリストされています。たとえば、出力は次のようになります。

hostname/unix:0 MIT-MAGIC-COOKIE-1 c0eaf749aa252101a0f57d5087089db7

それを使用して.Xauthorityファイルを生成します(再度ログインする必要があるユーザーとして):

xauth add $DISPLAY MIT-MAGIC-COOKIE-1 c0eaf749aa252101a0f57d5087089db7

「c0eaf749aa252101a0f57d5087089db7」をlistコマンドで返されたものに置き換えてください。これで、.Xauthorityのサイズは51バイトになり、Xサーバーに接続できるようになります(再び)。


何のスレッドがありませんが、これはQ&Aサイトではなく、フォーラムで
Anthonの

2

そのようなものを試してください

$ export LOGIN_USER="Math"
$ su - $LOGIN_USER
$ sudo xhost local:$LOGIN_USER &>/dev/null

ソース

PS:受け入れられた答えは私のために働いていません


1

upstartスクリプトからSelenium 3.3.1のインスタンスを起動し、SeleniumでChromeドライバーを使用したときに、このエラー「プロトコルが指定されていません」が発生しました。SeleniumはX11と同じユーザーとして実行され、DISPLAYシェル環境変数は正しく設定されました。興味深いのは、Firefoxドライバーを使用したときにこのエラーが発生しなかったことです。アクティブなX11ユーザーの$ XAUTHORITYの値を指すように、upstartスクリプト内でXAUTHORITYシェル環境変数を設定すると、Chromeドライバーのエラーが修正されました。

ちなみに、「プロトコルが指定されていません」というエラーは、Chrome / Chromeドライバーによって完全に埋められており、簡単に見つけることはできませんでした。Chromeはのパターンでディレクトリを作成し続けていました/tmp/.org.chromium.Chromium.*が、すぐに消えていました。chrome_debug.log「ディスプレイを開けません」というメッセージのあるファイルが含まれていることに気づきました。Seleniumプロセスに正しいDISPLAYがあることを確認し、Seleniumプロセスで/proc/$pid/environの出力をstraceより徹底的に調べた結果、「プロトコルが指定されていない」ことが最終的にこの質問につながったため、これはかなり奇妙だと思いました。

このエラーは、XAUTHORITYの設定を解除し、X11クライアントを実行しようとすることで再現できます。例えば:

$ XAUTHORITY= xeyes
No protocol specified
Error: Can't open display: :0.0


0

入力したxhost +SI:localuser:root後、端末にこれを入力してexport DISPLAY=:0.0、もう一度やり直してください


0

受け入れられた答えの手がかりを使用して、私は問題を異なる方法で解決することができました:

  1. 動作するアカウントでXauthファイルを見つけます(Xauth1)
  2. 存在しないアカウントでXauthファイルを見つけます(Xauth2)
  3. Xauth1をXauth2にコピーします
  4. Xauth2のアクセス許可を変更する

コード内:

root@45c4933a8f1a:~# xauth info
Authority file:       /headless/.Xauthority
<snip>
root@45c4933a8f1a:~# su OtherUser
OtherUser@45c4933a8f1a:/headless$ xauth info
Authority file:       /home/OtherUser/.Xauthority
<snip>
OtherUser@45c4933a8f1a:/headless$ exit
exit
root@45c4933a8f1a:~# cp /headless/.Xauthority /home/OtherUser/.Xauthority 
root@45c4933a8f1a:~# chown OtherUser:OtherUser /home/OtherUser/.Xauthority
root@45c4933a8f1a:~# su OtherUser

0

user2通常のユーザー)としてGUIにアクセスしようとすると、インストールUIをuser2としてロードする必要があります

これに従うようにしてください:

ルートとしてログイン:

sudo su

xサーバーをテストします。

xclock

時計が動いているのを見ることができたら、それは良いことです、今これを実行してみてください:

xhost

結果は次のようになります。

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

次に、user2が xhostにアクセスできるようにします

xhost +SI:localuser:user2

ここで、user2に再度ログインして、GUIプログラムのいずれかを開こうとします

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.