"Su" mit dem Fehler "X11-Verbindung wegen falscher Authentifizierung abgelehnt"

52

Als Root verbinde ich mich mit einem Remote-Host, um einen Befehl auszuführen. Nur "Standardbenutzer" hat die entsprechende ID-Datei und die korrekte .ssh / config-Datei. Daher wechsle ich zuerst den Benutzer:

su standarduser -c 'ssh -x remotehost ./remotecommand'

Der Befehl funktioniert einwandfrei, aber trotz der Tatsache, dass ich "-x" verwendet habe (X11-Forwarding deaktivieren) und X11Forwards deaktiviert habe /etc/ssh/ssh_config, bekomme ich immer noch die Fehlermeldung:

X11 connection rejected because of wrong authentication.

Ich erhalte keine Fehlermeldung, wenn ich als "Standardbenutzer" angemeldet bin.

Das ist ziemlich ärgerlich, da ich den Befehl in eine Cron-Job-Datei integrieren möchte. Ich verstehe, dass sich die Fehlermeldung auf die falsche Authentifizierung der .XAuth-Datei von root bezieht, aber ich versuche nicht einmal, eine Verbindung über X11 herzustellen.

Warum deaktiviert "ssh -x" die X11-Verbindung nicht und gibt eine Fehlermeldung aus?

UPDATE : Die Meldung wird nur angezeigt, wenn ich innerhalb eines Bildschirms angemeldet bin. Wenn ich den oben angegebenen Befehl auf dem lokalen Computer selbst (ohne Bildschirm) verwende, wird keine Fehlermeldung angezeigt. Dies sollte also auch für cron in Ordnung sein .

Ich habe den gleichen Befehl auch mit gestartet -vund überraschenderweise die Fehlermeldung FIRST erhalten, noch bevor die Statusinformationen von SSH:

root@localhost:~# su standarduser -c 'ssh -x remotehost ./remotecommand'
X11 connection rejected because of wrong authentication.
OpenSSH_6.2p2 Ubuntu-6ubuntu0.1, OpenSSL 1.0.1e 11 Feb 2013

Dies führte mich zum Problem selbst, es ist NICHT das, sshwas die Fehlermeldung auslöst, es ist su:

root@localhost:~# su standarduser -c 'echo Hi'
X11 connection rejected because of wrong authentication.
Hi

Warum erhalte ich diesen Fehler nur innerhalb von screen? Wie kann ich diese Fehlermeldung deaktivieren?

Stefan M
quelle
Führen Sie den Befehl erneut aus und fügen Sie ihn -vzu den ssh-Optionen hinzu. Fügen Sie dann die Ausgabe in Ihre Frage ein.
Jenny D

Antworten:

79

Scheint , wie Ihre Wurzel einig X11 fehlt Magic Cookie in denen .Xauthority, die Sie standarduserhat. Hier erfahren Sie, wie Sie dies beheben können.

KURZE VERSION (danke an @bmaupin )

standarduser@localhost:~$ xauth list | grep unix`echo $DISPLAY | cut -c10-12` > /tmp/xauth
standarduser@localhost:~$ sudo su
root@localhost:~$ xauth add `cat /tmp/xauth`

Achtung: Backticks überprüfen! Sie können nicht durch Anführungszeichen ersetzt werden! Sie müssen sudoinstalliert sein, um mit dem zweiten Befehl fortzufahren!

ORIGINAL LANGE VERSION

Um das Problem zu beheben, ermitteln Sie zunächst, welche Anzeigenummer standarduserverwendet wird:

standarduser@localhost:~$ echo $DISPLAY
localhost:21.0

In diesem Fall ist es 21.0. Zweitens wird standarduserdie Liste der Cookies angezeigt :

standarduser@localhost:~$ xauth list
localhost/unix:1  MIT-MAGIC-COOKIE-1  51a3801fd7776704575752f09015c61d
localhost/unix:21  MIT-MAGIC-COOKIE-1  0ba2913f8d9df0ee9eda295cad7b104f
localhost/unix:22  MIT-MAGIC-COOKIE-1  22ba6595c270f20f6315c53e27958dfe
localhost/unix:20  MIT-MAGIC-COOKIE-1  267f68b51726a8a381cfc10c91783a13

Der Cookie für die 21.0Anzeige ist der zweite in der Liste und endet mit 104f.

Das letzte, was zu tun ist, ist das Hinzufügen dieses speziellen Cookies zum Root .Xauthority. Melden Sie sich als root an und gehen Sie folgendermaßen vor:

root@localhost:~$ xauth add localhost/unix:21  MIT-MAGIC-COOKIE-1  0ba2913f8d9df0ee9eda295cad7b104f

Auf diese Weise können Sie den X11 connection rejected because of wrong authenticationFehler mindern , wenn Sie suals anderer Benutzer im Bash-Skript oder ausgeführt werden screen.

Vielen Dank an diesen Kerl für die Inspiration.

TranslucentCloud
quelle
Interessant. Ich habe das versucht, aber das hat auch bei mir nicht funktioniert. In meinem speziellen Fall kann ich fast alles starten (ein anderes xterm, VirtualBox), aber ich kann gedit nicht starten (ich bekomme den gleichen Fehler). Wenn ich jedoch zu root wechsle, kann ich gedit starten. Ich folgte den Anweisungen auf den Brief, aber nichts. Etwas anderes muss falsch sein.
Luis.espinal
@ luis.espinal hoffe jemand schlägt eine Lösung für dein spezielles Problem vor.
TranslucentCloud
1
Die lange Version funktionierte wie ein Zauber, aber die kurze Version war auf Centos mit "xauth: (argv): 1: bad" add "command line" fehlerhaft
Sam
1
Kurzversion arbeitete für mich auf Centos 7
tdc
1
Unter Ubuntu 18.04.1 funktioniert die Kurzversion einwandfrei.
Simakis Panagiotis
38

Eine einfachere Lösung:

1.- ssh user@host

2.- $ sudo su

3.- # xauth merge /home/user/.Xauthority

Das ist alles

Natürlich $DISPLAYmuss die Variable gesetzt werden.

Juan
quelle
1
Das klingt vielversprechend, ist aber etwas unvollständig. Würde es Ihnen etwas ausmachen, Informationen darüber hinzuzufügen, wie genau die $DISPLAYVariable eingestellt werden soll? Ich glaube, dass dieser kleine Zusatz Ihrer Antwort zusätzliche Stimmen verleihen wird.
TranslucentCloud
Dies funktionierte für mich, während @ TranslucentClouds Antwort dies nicht tat. Ich bin ursprünglich auf das Problem gestoßen, als ich versuchte, den Android SDK-Manager als Root über die Befehlszeile auszuführen.
Scottyseus
2
Das ist nicht für mich aus dem Feld arbeiten , daxauth: file /root/.Xauthority does not exist
oT
2
tdc, das ist nur eine Warnung, kein Fehler. xauth erstellt die Datei. Wenn Sie den Befehl ein zweites Mal ausführen, wird er nicht angezeigt.
Vladimir Panteleev
1
Wer braucht etwas zu lernen, wenn Sie nur kopieren und einfügen können! Vielen Dank! Viel einfacher.
Sirenen
7

Meine Bedürfnisse waren etwas anders, deshalb habe ich eine etwas andere Lösung gefunden. Ich brauchte die Fähigkeit, eine X11-App als ein anderer Benutzer (der nicht root ist) auszuführen. Unter CentOS habe ich also nicht das süße Gksudo-Tool, das die glücklichen Hunde mit Ubuntu haben, das die Xauth-Magie vollbringt.

Ich wollte wirklich keine benutzerdefinierten Skripte erstellen, nur um mich anzumelden, den Benutzer zu wechseln und eine App auszuführen. das erscheint mir ein bisschen überflüssig.

Schritt eins:

Erlauben Sie $ XAUTHORITY, über Sudo-Sitzungen hinweg übertragen zu werden.

Fügen Sie diese Zeile unter den restlichen env_keep-Anweisungen in / etc / sudoers hinzu:

Defaults    env_keep += "DISPLAY XAUTHORIZATION XAUTHORITY"

Schritt zwei:

Erlauben Sie Ihrem Zielbenutzer, Ihre .Xauthority zu lesen (ja, ich weiß, schreien Sie SICHERHEIT! Alles, was Sie wollen). Für diejenigen, die nur Befehle als root ausführen möchten, kann dies übersprungen werden.

Der Zielbenutzer hat dieselbe Gruppe wie ich, sodass ich nur die Gruppenleseberechtigungen einschalte:

$ chmod g+r user ~/.Xauthority

Schritt drei:

CentOS füllt standardmäßig nicht den Wert von $ XAUTHORITY. Füge deinem Profil eine Zeile hinzu (meine ist ~ / .bash_profile):

export XAUTHORITY=$HOME/.Xauthority

Das ist es. Nie mehr zwicken. Kein Schreiben von XML, um PolicyKit zum Laufen zu bringen. Keine laufenden Skripte für jede Anmeldung. Sie müssen nicht zweimal sudo, um das xauth zu kopieren. Von hier aus können Sie einfach:

$ sudo -u user xcalc

Funktioniert hervorragend mit MobaXTerm.

W Smith
quelle
Dies war genau das, was ich brauchte, um das Problem zu lösen, das ich beim Abrufen der VM-Konsole unter CentOS 7 hatte. Eigentlich musste ich nur Schritt drei für meinen Zweck ausführen (und natürlich sicherstellen, dass X11Forwarding in / etc / auf yes gesetzt war. ssh / sshd_config). Vielen Dank.
Darklion
Genial! Das ist die Antwort! Thanks @W Smith
tmow
1

Sie sollten vollständig zum Zielbenutzer wechseln, dh " -" mit su( su - standarduser ...) verwenden. Wenn nicht, wird das X-Zeug von root in die Umgebung gezogen.

Jerry Epas
quelle
0

Da ich häufig auf einer Root-Squashed-Netzwerk-Dateifreigabe root bin, hat keine der oben genannten Lösungen für mich funktioniert. (xubuntu 14.04). Ich habe das folgende Skript zusammengestellt, das auf meinem System funktioniert. Es kann bei Ihnen funktionieren. Andererseits kann es nicht, aber es ist kostenlos zu versuchen ...

Die Annahme ist, dass ich die Option -Y verwendet habe.

#!/bin/bash  
if [[ $DISPLAY =~ localhost(:[[:digit:]]+) ]] ;then
    port=${BASH_REMATCH[1]}
else
    echo "Unexpected DISPLAY $DISPLAY"
    exit 1
fi
h=$(hostname)
cookie=$(xauth list|grep $h.*$port)
sudo -i xauth -i add $cookie
sudo -i $*
Gerard
quelle
Die Zeile cookie=$(xauth list|grep $h.*$port)könnte mehr als beabsichtigt übereinstimmen, wenn $ port zufällig Teil des Cookie-Werts ist. Sicherer ist: cookie=$(xauth list) cookie=${c%% *}oder cookie=$(xauth list |grep $h[^ ]*$port).
7.
0

In meinem Fall hatte ich, als ich auf diesen Fehler stieß, ein verschlüsseltes Benutzerverzeichnis. Nachdem ecrypt-mount-privateich angerufen hatte , wurde der Fehler behoben und ich konnte die X11-Weiterleitung fortsetzen.

Um festzustellen , ob Ihr Home - Ordner verschlüsselt ist, können Sie versuchen , diese (nach dieser Antwort ): ls -A /home. Wenn Sie einen .ecryptfsOrdner sehen, ist Ihr Home-Verzeichnis wahrscheinlich verschlüsselt. In diesem Fall können Sie versuchen, den Befehl auszuführen, den ich am Anfang der Antwort angegeben habe.

Henry
quelle