Ngay lập tức bị lỗi vì kết nối X11 bị từ chối vì xác thực sai


53

Là root, tôi đang kết nối với một máy chủ từ xa để thực thi một lệnh. Chỉ "người dùng chuẩn" có tệp id thích hợp và .ssh / config chính xác, vì vậy tôi sẽ chuyển người dùng trước:

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

Lệnh hoạt động tốt, nhưng mặc dù thực tế là tôi đã sử dụng "-x" (tắt X11-Forwarding) và tắt X11Forwards /etc/ssh/ssh_config, tôi vẫn nhận được thông báo lỗi:

X11 connection rejected because of wrong authentication.

Tôi không nhận được thông báo lỗi khi tôi đăng nhập với tư cách là "người dùng chuẩn".

Điều này khá khó chịu vì tôi muốn tích hợp lệnh trong tệp công việc định kỳ. Tôi hiểu rằng thông báo lỗi đề cập đến xác thực sai của tệp .XAuth của root, nhưng tôi thậm chí không cố gắng kết nối qua X11.

Tại sao "ssh -x" không tắt kết nối X11 và ném thông báo lỗi?

CẬP NHẬT : Thông báo chỉ hiển thị khi tôi đăng nhập trong màn hình, khi sử dụng lệnh được nêu ở trên trên chính máy cục bộ (không có màn hình), tôi không nhận được thông báo lỗi, vì vậy điều này cũng tốt với cron .

Tôi cũng đã bắt đầu lệnh tương tự với -vvà thật bất ngờ khi nhận được thông báo lỗi FIRST, ngay cả trước thông tin trạng thái từ 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

Điều này dẫn tôi đến vấn đề, nó KHÔNG phải sshlà thông báo lỗi, đó là su:

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

Tại sao tôi chỉ nhận được lỗi này trong screen? Làm thế nào tôi có thể vô hiệu hóa thông báo lỗi này?


Chạy lại lệnh và thêm -vvào các tùy chọn ssh, sau đó dán đầu ra vào câu hỏi của bạn.
Jenny D

Câu trả lời:


80

Có vẻ như gốc của bạn thiếu một số X11 Cookie kỳ diệu trong .Xauthority, mà bạn standardusercó. Dưới đây là cách khắc phục điều này.

PHIÊN BẢN NGẮN HẠN (nhờ @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`

Chú ý: kiểm tra backticks! Họ không thể được thay thế bằng dấu ngoặc kép! Bạn cần sudocài đặt để tiếp tục lệnh thứ hai!

PHIÊN BẢN DÀI HẠN

Để khắc phục sự cố, trước tiên hãy phát hiện số hiển thị nào standardusersử dụng:

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

Trong trường hợp này là nó 21.0. Thứ hai, hiển thị standarduserdanh sách các 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 cho 21.0màn hình là thứ hai trong danh sách và kết thúc bằng 104f.

Điều cuối cùng cần làm là thêm cookie đặc biệt này vào thư mục gốc .Xauthority. Đăng nhập bằng root và làm như sau:

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

Đây là cách bạn có thể giảm thiểu X11 connection rejected because of wrong authenticationlỗi khi bạn chạy sunhư một người dùng khác trong tập lệnh Bash hoặc screen.

Cảm ơn anh chàng này cho cảm hứng.


Hấp dẫn. Tôi đã thử điều đó, nhưng điều đó cũng không hiệu quả với tôi. Trong trường hợp cụ thể của tôi, tôi có thể khởi chạy hầu hết mọi thứ (một xterm khác, VirtualBox), nhưng tôi không thể khởi chạy gedit (tôi gặp lỗi tương tự). Tuy nhiên, nếu tôi thay đổi sang root, thì tôi có thể khởi chạy gedit. Tôi làm theo hướng dẫn của bức thư nhưng không có gì. Một cái gì đó phải không ổn.
luis.espinal

@ luis.espinal hy vọng ai đó đề xuất một giải pháp cho vấn đề cụ thể của bạn.
mờ

1
Phiên bản dài hoạt động như một bùa mê, nhưng phiên bản ngắn bị lỗi trên centos với "xauth: (argv): 1: xấu" thêm "dòng lệnh"
Sam

1
phiên bản ngắn làm việc cho tôi trên centos 7
tdc

1
trên Ubuntu 18.04.1 phiên bản ngắn hoạt động tốt.
Simakis Panagiotis

38

Một giải pháp dễ dàng hơn:

1.- ssh user@host

2.- $ sudo su

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

Đó là tất cả

Tất nhiên $DISPLAYbiến phải được đặt.


1
Điều này nghe có vẻ hứa hẹn nhưng một chút không đầy đủ. Bạn có muốn thêm thông tin về cách chính xác để đặt $DISPLAYbiến không? Tôi tin rằng sự bổ sung nhỏ này sẽ tạo ra tiếng nói bổ sung cho câu trả lời của bạn.
translucentCloud

Điều này làm việc cho tôi, trong khi câu trả lời của @ TranslucentCloud thì không. Ban đầu tôi gặp phải sự cố trong khi cố gắng chạy trình quản lý SDK Android dưới quyền root từ dòng lệnh FYI.
scottyseus

2
Điều này đã không làm việc ra khỏi hộp đối với tôi kể từxauth: file /root/.Xauthority does not exist
tdc

2
tdc, đó chỉ là một cảnh báo, không phải là lỗi, xauth sẽ tạo tệp - nếu bạn chạy lệnh lần thứ hai bạn sẽ không thấy nó.
Vladimir Panteleev

1
Ai cần học bất cứ điều gì khi bạn chỉ có thể sao chép và dán! Cảm ơn! Cách dễ dàng hơn.
Còi báo

7

Nhu cầu của tôi hơi khác một chút nên tôi đã đưa ra một giải pháp hơi khác. Tôi cần khả năng chạy ứng dụng X11 với tư cách người dùng khác (người chưa root). Chạy CentOS, vì vậy tôi không có công cụ gksudo ngọt ngào, những chú chó may mắn với ubfox có phép thuật Xauth.

Tôi thực sự không muốn thoát ra một số tập lệnh tùy chỉnh chỉ để đăng nhập, chuyển đổi người dùng và chạy một ứng dụng; điều đó có vẻ hơi thừa đối với tôi

Bước một:

Cho phép $ XAUTHORITY được thực hiện qua các phiên sudo.

Thêm dòng này dưới phần còn lại của câu lệnh env_keep trong / etc / sudoers:

Defaults    env_keep += "DISPLAY XAUTHORIZATION XAUTHORITY"

Bước hai:

Cho phép người dùng mục tiêu của bạn khả năng đọc .Xmasterity của bạn (vâng tôi biết, hét lên AN NINH! Tất cả những gì bạn muốn). Đối với những người chỉ muốn khả năng chạy các lệnh như root, điều này có thể được bỏ qua.

Người dùng mục tiêu chia sẻ cùng nhóm với tôi vì vậy tôi chỉ bật quyền đọc của nhóm:

$ chmod g+r user ~/.Xauthority

Bước thứ ba:

Theo mặc định, CentOS không điền vào giá trị $ XAUTHORITY. Thêm một dòng vào hồ sơ của bạn (của tôi là ~ / .bash_profile):

export XAUTHORITY=$HOME/.Xauthority

Đó là nó. Không còn điều chỉnh. Không có văn bản .XML để làm cho Chính sách hoạt động. Không có kịch bản chạy cho mỗi lần đăng nhập. Không phải sudo hai lần để sao chép xauth. Từ đây trở đi, bạn có thể chỉ cần:

$ sudo -u user xcalc

Hoạt động tuyệt vời với MobaXTerm.


Đây chỉ là những gì tôi cần để giải quyết vấn đề mà tôi gặp phải khi có bảng điều khiển VM trên CentOS 7. Tôi thực sự chỉ cần thực hiện Bước ba cho mục đích của mình (và tất nhiên, đảm bảo rằng X11Forwarding được đặt thành có trong / etc / ssh / sshd_config). Cảm ơn.
bóng tối

Tuyệt vời! Đây là câu trả lời! Cảm ơn @W Smith
tmow

1

Bạn nên chuyển hoàn toàn sang người dùng đích, tức là sử dụng " -" với su( su - standarduser ...). Nếu không, công cụ X của root sẽ bị kéo xung quanh trong môi trường.


0

Bởi vì tôi thường xuyên root trên một chia sẻ tập tin mạng bị root, không có giải pháp nào ở trên làm việc cho tôi. (xubfox 14.04). Tôi tập hợp các đoạn script sau, hoạt động trên hệ thống của tôi. Nó có thể làm việc trên của bạn. Sau đó, một lần nữa, nó có thể không, nhưng nó miễn phí để thử ...

Giả định là tôi đã sử dụng tùy chọn -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 $*

Dòng cookie=$(xauth list|grep $h.*$port)có thể khớp nhiều hơn dự định nếu $ port xảy ra là một phần của giá trị cookie. An toàn hơn là: cookie=$(xauth list) cookie=${c%% *}hoặc cookie=$(xauth list |grep $h[^ ]*$port).
PePa

0

Trong trường hợp của tôi, khi tôi gặp phải lỗi đó, tôi đã có một thư mục người dùng được mã hóa. Sau khi gọi ecrypt-mount-private, nó đã thoát khỏi lỗi và cho phép tôi tiếp tục chuyển tiếp X11.

Để xác định xem thư mục nhà của bạn có được mã hóa hay không, bạn có thể thử điều này (theo câu trả lời này ) : ls -A /home. Nếu bạn thấy một .ecryptfsthư mục, thì thư mục chính của bạn có thể được mã hóa, trong trường hợp đó bạn có thể thử thực hiện lệnh tôi đặt vào đầu câu trả lời.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.