"Su" dengan kesalahan "Koneksi X11 ditolak karena otentikasi salah"

53

Sebagai root, saya terhubung ke host jarak jauh untuk menjalankan perintah. Hanya "standarduser" yang memiliki file id yang sesuai dan .ssh / config yang benar, jadi saya beralih pengguna terlebih dahulu:

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

Perintah berfungsi dengan baik, tetapi meskipun saya menggunakan "-x" (menonaktifkan X11-Forwarding) dan menonaktifkan X11Forwards /etc/ssh/ssh_config, saya masih mendapatkan pesan kesalahan:

X11 connection rejected because of wrong authentication.

Saya tidak mendapatkan pesan kesalahan saat saya masuk sebagai "pengguna standar".

Ini cukup menjengkelkan karena saya ingin mengintegrasikan perintah dalam file tugas cron. Saya mengerti bahwa pesan kesalahan merujuk ke otentikasi salah dari file .XAuth root, tapi saya bahkan tidak mencoba untuk terhubung melalui X11.

Mengapa "ssh -x" tidak menonaktifkan koneksi X11 dan melempar pesan kesalahan?

UPDATE : Pesan hanya menunjukkan ketika saya login di dalam layar, ketika menggunakan perintah yang dinyatakan di atas pada mesin lokal itu sendiri (tanpa layar), saya tidak mendapatkan pesan kesalahan, jadi ini harus baik-baik saja dengan cron, juga .

Saya juga memulai perintah yang sama dengan -vdan secara mengejutkan mendapat pesan kesalahan PERTAMA, bahkan sebelum informasi status dari 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

Ini membawa saya ke masalah itu sendiri, BUKAN sshyang melempar pesan kesalahan, itu su:

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

Mengapa saya hanya mendapatkan kesalahan ini di dalam screen? Bagaimana saya bisa menonaktifkan pesan kesalahan ini?

Stefan M
sumber
Jalankan perintah lagi dan tambahkan -vke opsi ssh, lalu tempel output ke pertanyaan Anda.
Jenny D

Jawaban:

80

Sepertinya root Anda tidak memiliki beberapa cookie ajaib X11 di .Xauthority, yang Anda standardusermiliki. Inilah cara untuk memperbaikinya.

SHORT VERSION (terima kasih kepada @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`

Perhatian: periksa backticks! Mereka tidak dapat diganti dengan kutipan! Anda perlu sudomenginstal untuk melanjutkan perintah kedua!

VERSI PANJANG ASLI

Untuk memperbaiki masalah, pertama-tama deteksi nomor layar mana yang standarduserdigunakan:

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

Dalam hal ini 21.0. Kedua, tampilkan standarduserdaftar cookie:

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

Cookie untuk 21.0tampilan adalah yang kedua dalam daftar dan diakhiri dengan 104f.

Hal terakhir yang harus dilakukan adalah menambahkan cookie ini ke root .Xauthority. Masuk sebagai root dan lakukan hal berikut:

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

Ini adalah bagaimana Anda dapat mengurangi X11 connection rejected because of wrong authenticationkesalahan ketika Anda menjalankan susebagai pengguna yang berbeda di skrip Bash atau screen.

Terima kasih kepada orang ini untuk inspirasi.

TranslucentCloud
sumber
Menarik. Saya mencobanya, tetapi itu juga tidak berhasil bagi saya. Dalam kasus khusus saya, saya dapat meluncurkan hampir semua hal (xterm lain, VirtualBox), tetapi saya tidak dapat meluncurkan gedit (saya mendapatkan kesalahan yang sama). Namun, jika saya mengubah ke root, maka saya dapat meluncurkan gedit. Saya mengikuti instruksi ke surat itu tetapi tidak ada. Sesuatu yang lain pasti salah.
luis.espinal
@ luis.espinal harap seseorang menyarankan solusi untuk masalah khusus Anda.
TranslucentCloud
1
Versi panjangnya berfungsi seperti mantra, tetapi versi pendeknya salah pada centos dengan "xauth: (argv): 1: bad" add "command line"
Sam
1
versi pendek bekerja untuk saya di centos 7
tdc
1
pada Ubuntu 18.04.1 versi singkat berfungsi dengan baik.
Simakis Panagiotis
38

Solusi yang lebih mudah:

1.- ssh user@host

2.- $ sudo su

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

Itu saja

Tentu saja $DISPLAYvariabel harus diatur.

Juan
sumber
1
Ini kedengarannya menjanjikan tetapi sedikit tidak lengkap. Maukah Anda menambahkan info tentang bagaimana tepatnya mengatur $DISPLAYvariabel? Saya yakin penambahan kecil ini akan memberikan suara tambahan untuk jawaban Anda.
TranslucentCloud
Ini bekerja untuk saya, sedangkan jawaban @ TranslucentCloud tidak. Saya awalnya mengalami masalah saat mencoba menjalankan Android SDK manager sebagai root dari baris perintah FYI.
scottyseus
2
Ini tidak berhasil bagi saya sejakxauth: file /root/.Xauthority does not exist
tdc
2
tdc, itu hanya peringatan, bukan kesalahan, xauth akan membuat file - jika Anda menjalankan perintah untuk kedua kalinya Anda tidak akan melihatnya.
Vladimir Panteleev
1
Siapa yang perlu belajar apa saja ketika Anda bisa menyalin dan menempel! Terima kasih! Jauh lebih mudah.
Sirene
7

Kebutuhan saya sedikit berbeda sehingga saya menghasilkan solusi yang sedikit berbeda. Saya membutuhkan kemampuan untuk menjalankan aplikasi X11 sebagai pengguna lain (yang bukan root). Menjalankan CentOS, jadi saya tidak memiliki alat gksudo manis yang dimiliki anjing-anjing beruntung dengan ubuntu yang melakukan keajaiban Xauth.

Saya benar-benar tidak ingin membongkar beberapa skrip khusus hanya untuk masuk, beralih pengguna dan menjalankan aplikasi; yang tampaknya agak berlebihan bagi saya.

Langkah pertama:

Izinkan $ XAUTHORITY untuk dibawa melintasi sesi sudo.

Tambahkan baris ini di bawah pernyataan env_keep lainnya di / etc / sudoers:

Defaults    env_keep += "DISPLAY XAUTHORIZATION XAUTHORITY"

Langkah Dua:

Biarkan pengguna target Anda kemampuan untuk membaca .Xauthority Anda (ya saya tahu, berteriak KEAMANAN! Semua yang Anda inginkan). Bagi mereka yang hanya ingin menjalankan perintah sebagai root, ini bisa dilewati.

Pengguna target membagikan grup yang sama dengan saya, jadi saya aktifkan hak baca grup:

$ chmod g+r user ~/.Xauthority

Langkah ketiga:

CentOS tidak mengisi nilai $ XAUTHORITY secara default. Tambahkan baris ke profil Anda (milik saya ~ / .bash_profile):

export XAUTHORITY=$HOME/.Xauthority

Itu dia. Tidak ada lagi tweaker. Tidak ada tulisan .XML untuk menjalankan PolicyKit. Tidak ada skrip yang berjalan untuk setiap login. Tidak perlu sudo dua kali untuk menyalin xauth. Mulai sekarang, Anda cukup:

$ sudo -u user xcalc

Bekerja sangat baik dengan MobaXTerm.

W Smith
sumber
Ini hanya apa yang saya butuhkan untuk menyelesaikan masalah yang saya alami dengan mendapatkan konsol VM di CentOS 7. Saya sebenarnya hanya perlu melakukan Langkah Tiga untuk tujuan saya (dan, tentu saja, memastikan bahwa X11Forwarding diatur ke yes di / etc / ssh / sshd_config). Terima kasih.
darklion
Luar biasa! Ini jawabannya! Terima kasih @ W Smith
tmow
1

Anda harus sepenuhnya beralih ke pengguna target, yaitu gunakan " -" with su( su - standarduser ...). Jika tidak, X root akan diseret di lingkungan.

Jerry Epas
sumber
0

Karena saya sering melakukan root pada berbagi file jaringan root-squashing, tidak ada solusi di atas yang bekerja untuk saya. (xubuntu 14.04). Saya mengumpulkan skrip berikut, yang berfungsi pada sistem saya. Mungkin berhasil pada Anda. Kemudian lagi, mungkin tidak, tetapi gratis untuk mencoba ...

Asumsinya adalah saya sudah menggunakan opsi -Y.

#!/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
sumber
Baris cookie=$(xauth list|grep $h.*$port)bisa cocok lebih dari yang dimaksudkan jika $ port kebetulan menjadi bagian dari nilai cookie. Lebih aman adalah: cookie=$(xauth list) cookie=${c%% *}atau cookie=$(xauth list |grep $h[^ ]*$port).
PePa
0

Dalam kasus saya, ketika saya menemukan kesalahan itu, saya memiliki direktori pengguna terenkripsi. Setelah menelepon ecrypt-mount-private, itu menghilangkan kesalahan dan memungkinkan saya untuk melanjutkan penerusan X11.

Untuk menentukan apakah folder rumah Anda dienkripsi, Anda dapat mencoba ini (sesuai jawaban ini ): ls -A /home. Jika Anda melihat .ecryptfsfolder, maka direktori home Anda mungkin dienkripsi, dalam hal ini Anda dapat mencoba melakukan perintah yang saya masukkan di awal jawabannya.

Henry
sumber