"Su" com o erro "Conexão X11 rejeitada devido a autenticação incorreta"

53

Como root, estou me conectando a um host remoto para executar um comando. Somente "standarduser" possui o arquivo de identificação apropriado e o arquivo .ssh / config correto, portanto, troco o usuário primeiro:

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

O comando funciona bem, mas, apesar de eu ter usado "-x" (desativar o X11-Forwarding) e ter o X11Forwards desativado /etc/ssh/ssh_config, ainda recebo a mensagem de erro:

X11 connection rejected because of wrong authentication.

Não estou recebendo a mensagem de erro quando estou logado como "usuário padrão".

Isso é muito chato, pois eu gostaria de integrar o comando em um arquivo de tarefa cron. Entendo que a mensagem de erro se refere à autenticação incorreta do arquivo .XAuth da raiz, mas nem estou tentando conectar-me via X11.

Por que "ssh -x" não está desativando a conexão X11 e está lançando a mensagem de erro?

ATUALIZAÇÃO : A mensagem é exibida apenas quando estou logado em uma tela. Ao usar o comando indicado acima na máquina local (sem tela), não recebo uma mensagem de erro, portanto, isso também deve funcionar com o cron. .

Também iniciei o mesmo comando -ve, surpreendentemente, recebi a mensagem de erro PRIMEIRO, mesmo antes das informações de status do 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

Isso me levou ao problema em si, NÃO é o sshque está lançando a mensagem de erro, é su:

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

Por que só recebo esse erro dentro screen? Como posso desativar esta mensagem de erro?

Stefan M
fonte
Execute o comando novamente e adicione -vàs opções ssh e cole a saída na sua pergunta.
Jenny D

Respostas:

80

Parece que sua raiz não possui um cookie mágico X11 no .Xauthority, que você standarduserpossui. Aqui está como corrigir isso.

VERSÃO CURTA (graças a @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`

Atenção: verifique os backticks! Eles não podem ser substituídos por aspas! Você precisa estar sudoinstalado para continuar o segundo comando!

VERSÃO LONGA ORIGINAL

Para consertar as coisas, primeiro detecte qual número de exibição standarduserusa:

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

Nesse caso é 21.0. Em segundo lugar, standardusera lista de cookies da tela :

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

O cookie para a 21.0exibição é o segundo da lista e termina com 104f.

A última coisa a fazer é adicionar esse cookie específico à raiz .Xauthority. Efetue login como root e faça o seguinte:

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

É assim que você pode atenuar o X11 connection rejected because of wrong authenticationerro ao executar sucomo um usuário diferente no script Bash ou screen.

Obrigado a esse cara pela inspiração.

TranslucentCloud
fonte
Interessante. Eu tentei isso, mas isso não funcionou para mim também. No meu caso particular, posso iniciar quase qualquer coisa (outro xterm, VirtualBox), mas não consigo iniciar o gedit (recebo o mesmo erro). No entanto, se eu mudar para root, posso iniciar o gedit. Eu segui as instruções da carta, mas nada. Algo mais deve estar errado.
Luis.espinal
@ luis.espinal espero que alguém sugira uma solução para o seu problema específico.
TranslucentCloud
11
A versão longa funcionou como um encanto, mas a versão curta causou um erro no centos com "xauth: (argv): 1: bad" add "command line"
Sam
11
versão curta funcionou para mim em centos 7
tdc 13/10/2015
11
no Ubuntu 18.04.1 versão curta funciona bem.
Simakis Panagiotis
38

Uma solução mais fácil:

1.- ssh user@host

2.- $ sudo su

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

Isso é tudo

É claro que a $DISPLAYvariável deve ser definida.

Juan
fonte
11
Isso parece promissor, mas um pouco incompleto. Você gostaria de adicionar informações sobre como exatamente definir a $DISPLAYvariável? Acredito que este pequeno acréscimo trará vozes adicionais à sua resposta.
TranslucentCloud
Isso funcionou para mim, enquanto a resposta do @ TranslucentCloud não. Originalmente, encontrei o problema ao tentar executar o gerenciador do SDK do Android como root na linha de comando FYI.
scottyseus
2
Isso não funcionou para mim desde entãoxauth: file /root/.Xauthority does not exist
tdc 13/10/2015
2
tdc, isso é apenas um aviso, não um erro, o xauth criará o arquivo - se você executar o comando pela segunda vez, não o verá.
precisa saber é o seguinte
11
Quem precisa aprender alguma coisa quando você pode simplesmente copiar e colar! Obrigado! Muito mais fácil.
Sirenes
7

Minhas necessidades eram um pouco diferentes, então eu vim com uma solução um pouco diferente. Eu precisava da capacidade de executar um aplicativo X11 como outro usuário (que não é root). Rodando o CentOS, não tenho a ferramenta gksudo que os cães sortudos do ubuntu têm, o que faz a mágica do Xauth.

Eu realmente não queria quebrar alguns scripts personalizados apenas para fazer login, alternar entre usuários e executar um aplicativo; isso parece um pouco supérfluo para mim.

Passo um:

Permita que $ XAUTHORITY seja carregado entre sessões sudo.

Inclua esta linha no restante das instruções env_keep em / etc / sudoers:

Defaults    env_keep += "DISPLAY XAUTHORIZATION XAUTHORITY"

Passo dois:

Permita ao usuário alvo a capacidade de ler sua .Xauthority (sim, eu sei, grite SEGURANÇA! Tudo o que você quiser). Para aqueles que querem apenas a capacidade de executar comandos como root, isso pode ser ignorado.

O usuário de destino compartilha o mesmo grupo que eu, para ativar as permissões de leitura do grupo:

$ chmod g+r user ~/.Xauthority

Passo três:

O CentOS não preenche o valor de $ XAUTHORITY por padrão. Adicione uma linha ao seu perfil (o meu é ~ / .bash_profile):

export XAUTHORITY=$HOME/.Xauthority

É isso aí. Não há mais ajustes. Não é necessário escrever .XML para que o PolicyKit funcione. Não há scripts em execução para cada login. Não é necessário sudo duas vezes para copiar o xauth. Daqui em diante, você pode simplesmente:

$ sudo -u user xcalc

Funciona muito bem com o MobaXTerm.

W Smith
fonte
Era exatamente isso que eu precisava para resolver o problema que eu estava tendo ao obter o console da VM no CentOS 7. Na verdade, eu só precisava executar a Etapa três para o meu propósito (e, é claro, garantir que o X11Forwarding estivesse definido como yes em / etc / ssh / sshd_config). Obrigado.
darklion
Impressionante! Esta é a resposta! Obrigado @W Smith
tmow
1

Você deve mudar completamente para o usuário de destino, ou seja, use " -" com su( su - standarduser ...). Caso contrário, o material X da raiz será arrastado pelo ambiente.

Jerry Epas
fonte
0

Como frequentemente faço root em um compartilhamento de arquivos de rede compactado com raiz, nenhuma das soluções acima funcionou para mim. (xubuntu 14.04). Eu montei o seguinte script, que funciona no meu sistema. Pode funcionar no seu. Então, novamente, pode não, mas é livre para tentar ...

Suposição é que eu usei a opção -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
fonte
A linha cookie=$(xauth list|grep $h.*$port)pode corresponder mais do que o pretendido se $ port fizer parte do valor do cookie. Mais seguro é: cookie=$(xauth list) cookie=${c%% *}ou cookie=$(xauth list |grep $h[^ ]*$port).
PePa 7/03
0

No meu caso, quando encontrei esse erro, eu tinha um diretório de usuário criptografado. Depois de ligar ecrypt-mount-private, ele se livrou do erro e me permitiu continuar o encaminhamento do X11.

Para determinar se sua pasta é criptografada, você pode tentar isso (como por esta resposta ): ls -A /home. Se você vir uma .ecryptfspasta, seu diretório pessoal provavelmente está criptografado. Nesse caso, você pode tentar executar o comando que eu coloquei no início da resposta.

Henry
fonte