Como resolver 'Nenhum protocolo especificado' para o usuário su

15

Estou tentando usar um usuário alternativo (não administrador) para executar software gráfico no meu sistema. Esse usuário alternativo foi nomeado e recebeu um UID e GID para corresponder a um usuário do sistema remoto com o mesmo nome. O UID é 500, por isso acredito que faz do usuário um usuário que não faz login.

A partir do Ubuntu conectado à minha conta principal, abro um terminal e supara o usuário alternativo. Em seguida, tento executar o comando para iniciar o aplicativo e receber 'Nenhum protocolo especificado'.

Isso é devido ao UID <1000, devido suou não ao administrador do usuário? Como faço para que esse usuário execute o aplicativo com uma GUI?

J Collins
fonte

Respostas:

15

O problema não está ocorrendo devido ao UID do usuário. O 500 é excelente como um UID, e esse UID não o torna um usuário que não faz login, exceto aos olhos das configurações padrão de alguns poucos gerenciadores de tela.

A mensagem de erro Nenhum protocolo especificado soa como uma mensagem de erro específica do aplicativo e não é útil, mas acho que o erro é que o aplicativo não pode entrar em contato com o monitor X11 porque não tem permissão para fazer isso. por isso está sendo executado como um usuário diferente. Os aplicativos precisam de um "cookie mágico" (token secreto) para conversar com o servidor X11 para que outros processos no sistema em execução sob outros usuários não possam invadir sua tela, criar janelas e espionar suas teclas. O outro usuário do sistema não tem acesso a esse cookie mágico porque as permissões são definidas para que sejam acessíveis apenas ao usuário que iniciou o ambiente da área de trabalho (que é como deveria ser).

Tente isso, executando como seu usuário original, para copiar o cookie X11 para a outra conta:

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

em seguida, execute seu aplicativo. Você também pode precisar desmarcar XAUTHORITYesse shell também. Esse comando extrai o cookie mágico ( xauth list) do seu usuário principal e o adiciona ( xauth add) para onde o outro usuário pode obtê-lo.

Celada
fonte
Estranhamente, o uso do comando citado fornece 'su: deve ser executado a partir de um terminal'. Mas é em um terminal ...
J Collins
@JCollins tenta, xauth list >/tmp/xa.$$; su - <otheruser> -c "unset XAUTHORITY; xargs xauth add </tmp/xa.$$"; rm -f /tmp/xa.$$mas esteja ciente de que há uma condição de corrida horrível lá.
roaima
@JCollins opa, sim, isso seria um problema se você suquiser pedir uma senha. Experimente este novo comando.
Celada
@Celada, ouro, trabalhou um prazer. Você poderia detalhar o que esse comando está fazendo e como? E talvez explicando por que a encarnação original não aconteceu?
J Collins
1
@JCollins, você precisará refazê-lo sempre que sair e efetuar login, pois um cookie mágico novo será gerado a cada vez. Isso é normal, faz parte do modelo de segurança.
Celada
6

No meu caso, o novo servidor de exibição waylandfoi o problema,

basta fazer com xhost + local:que outros usuários (por exemplo, root) tenham permissão para executar programas em sua sessão; no entanto, as conexões de rede não serão permitidas.

Se você deseja permitir clientes de qualquer host , é possível usá-lo xhost +sem especificar nenhum host. No entanto , isso é inseguro ; seria melhor especificar apenas os hosts para os quais você deseja conceder acesso à sua sessão.

MADforFUNandHappy
fonte
1
No meu caso, xhost +foi suficiente
danger89:
1
@ danger89 enquanto isso funciona, permite que qualquer host se conecte à sua sessão se você não tiver regras de firewall para impedir o acesso remoto (nem toda distribuição possui regras de firewall que negam todas as solicitações de entrada, por exemplo, o ubuntu não possui regras pré-configuradas para impedir o acesso a servidores como samba ou apache que o usuário pode querer instalar); portanto, para novos usuários Linux, isso pode se tornar um problema. Pessoalmente, eu limitaria o acesso apenas para estar no lado salvo
MADforFUNandHappy
3

Suponha que você queira que a força bruta faça uma conexão com X ...

Vamos supor que você já esteja executando seus comandos no servidor (onde o X é executado); caso contrário, faça com que funcione primeiro e depois use o 'ssh -X user @ server) do cliente depois;).

Pode haver várias maneiras de executar os comandos xauth, por exemplo, você pode estar usando 'sudo', mas isso pode perder ou alterar variáveis ​​de ambiente. As seguintes variáveis ​​de ambiente precisam ser preservadas: DISPLAY e XAUTHORITY. Para testar se esse é o caso, você pode executar 'echo $ XAUTHORITY' da mesma maneira que executa seus comandos, mas certifique-se de não expandir as variáveis ​​de ambiente antes de executar esses comandos. Por exemplo, tente: sudo bash -c 'echo "$ XAUTHORITY"' para ver o que realmente é XAUTHORITY depois de executar o seu sudo (se ele desaparecer, talvez seja necessário adicionar algo ao seu arquivo sudoers, consulte outro local).

Eventualmente, execute o seguinte comando como o usuário com o qual você deseja acessar, no servidor:

xauth info

Isso mostrará o 'arquivo de autoridade' que será usado (/root/.Xauthority por padrão, para root ou algo como /home/theuser/.Xauthority). Se ele mostrar o arquivo .Xauthority correto, não será necessário se preocupar com a variável de ambiente XAUTHORITY (na verdade, eu não saberia quando não apareceria, exceto se você quiser manipular um local não padrão desse arquivo )

Remova esse arquivo (se ele existir):

rm /root/.Xauthority

Substitua /root/.Xauthoritypelo arquivo XAUTHORITY correto para o seu caso.

Recrie-o, mas vazio (isso é necessário para muitos comandos):

touch /root/.Xauthority

Nesse ponto, você receberá o erro No protocol especificado , mesmo se você tiver MIT-MAGIC-COOKIE-1 inválido antes. Encontre o arquivo de autoridade que o servidor X está usando no momento:

ps aux | grep Xorg

Isso deve mostrar algo como:

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

O nome do arquivo depois -authé o que você precisa no próximo comando. Execute isso como root:

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

Isso lista uma chave hexadecimal de 32 dígitos. Por exemplo, a saída poderia ser:

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

Use isso para gerar seu arquivo .Xauthority (como usuário que precisa fazer login novamente):

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

substitua 'c0eaf749aa252101a0f57d5087089db7' pelo que foi retornado pelo comando list para você. Agora, a sua .Xauthority deve ter o tamanho de 51 bytes e você pode se conectar ao servidor X (novamente).

Carlo Wood
fonte
Não há tópicos, este é um site de perguntas e respostas, não um fórum
Anthon
2

Tente algo assim

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

fonte

Ps : a resposta aceita não funcionou para mim

deFreitas
fonte
1

Eu tive esse erro "Nenhum protocolo especificado" quando iniciei uma instância do Selenium 3.3.1 a partir de um script inicial e usei o driver Chrome no Selenium. O Selenium foi executado como o mesmo usuário do X11 e a variável de ambiente do shell DISPLAY foi definida corretamente. O interessante é que esse erro não ocorreu quando eu usei o driver do Firefox. A configuração da variável de ambiente do shell XAUTHORITY no script inicial para apontar para o valor de $ XAUTHORITY do usuário ativo do X11 corrigiu o erro do driver do Chrome.

Em uma nota lateral, o erro "Nenhum protocolo especificado" foi completamente ocultado pelo driver Chrome / Chrome e não foi de forma alguma fácil de encontrar. Percebi que o Chrome continuava criando diretórios no padrão de /tmp/.org.chromium.Chromium.*, mas eles estavam desaparecendo rapidamente. Consegui perceber que eles continham um arquivo chrome_debug.logcom a mensagem "Não é possível abrir a tela". Achei que isso era bastante estranho, pois verifiquei que o processo Selenium tinha o DISPLAY correto /proc/$pid/environe examinei a saída do straceprocesso Selenium mais detalhadamente, o que revelou "Nenhum protocolo especificado", levando-me a essa pergunta.

Este erro pode ser reproduzido desmarcando XAUTHORITY e tentando executar algum cliente X11. Por exemplo:

$ XAUTHORITY= xeyes
No protocol specified
Error: Can't open display: :0.0
Sasha Pachev
fonte
0

Isso foi simples. O problema ocorre quando você está no estado raiz e deseja usar o gksu Apenas saia do estado raiz e tente novamente

Seyed Hussein Mirzaki
fonte
0

Basta digitar isso no seu terminal e xhost +SI:localuser:rootdigitar export DISPLAY=:0.0e tentar novamente

kophygiddie
fonte
0

Usando dicas nas respostas aceitas, consegui resolver o problema de maneira diferente:

  1. Localize o arquivo Xauth na conta que funciona (Xauth1)
  2. Localize o arquivo Xauth na conta que não (Xauth2)
  3. Copiar Xauth1 para Xauth2
  4. Alterar as permissões do Xauth2

Em código:

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
tjb
fonte
0

Vamos dizer que você tenta acessar a GUI como usuário2 ( usuário normal ) e, em seguida, é necessário carregar a interface do usuário de instalação como usuário2 .

Tente seguir o seguinte:

Faça o login como root :

sudo su

Teste o servidor x:

xclock

Se você pode ver um relógio funcionando, está pronto, tente executar o seguinte:

xhost

O resultado deve ser assim:

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

Agora deixe o user2 acessar o xhost

xhost +SI:localuser:user2

Agora tente entrar novamente no user2 e tente abrir qualquer programa da GUI.

Colheita 1018
fonte