Por que não consigo executar aplicativos GUI a partir de 'root': “No protocol specified”?

32

Eu instalei o debian na minha máquina ontem à noite. Agora, não entendo por que não consigo executar aplicativos GUI de um terminal quando estou executando como root.

Por exemplo:

sudo -i
glxgears

Gera a seguinte saída:

No protocol specified
Error: couldn't open display :0

Mas quando abro o terminal pela primeira vez, posso executar glxgears da conta do usuário. É só depois que eu faço sudo -i que o problema surge. Isso acontece com qualquer aplicativo de GUI que eu tente executar. Eu acho que provavelmente está relacionado ao X11, mas não tenho certeza.

    
por Octopus 09.03.2014 / 08:31

7 respostas

31

Acessar o servidor X requer duas coisas:

  • A variável $DISPLAY apontando para a exibição correta (geralmente :0 )
  • Informações de autenticação adequadas

As informações de autenticação podem ser explicitamente especificadas via $XAUTHORITY e o padrão é ~/.Xauthority .

Se $DISPLAY e $XAUTHORITY for definido para seu usuário, sudo os definirá para o novo shell também e tudo deverá funcionar bem.

Se eles não estiverem configurados, eles provavelmente usarão os valores incorretos e você não poderá iniciar e aplicativos X.

No Debian, $XAUTHORITY geralmente não é definido explicitamente. Basta adicionar

export XAUTHORITY=~/.Xauthority

para o seu .bashrc ou diga explicitamente XAUTHORITY=~/.Xauthority sudo ... e tudo deve funcionar.

Você também pode usar xauth list para verificar se as informações corretas de autenticação estão disponíveis.

    
por 09.03.2014 / 10:17
18

Talvez isso possa ajudar outra pessoa. Eu tive a mesma pergunta que você, mas para um usuário normal. Digamos que eu queira iniciar o firefox usando a conta de usuário foo. Estou logado como bar:

[bar@localhost ~]$ sudo -u foo -H firefox

Infelizmente, esse comando falhou com o mesmo erro da pergunta (ou seja, nenhum protocolo especificado & não pode abrir a exibição)

Minha solução foi simplesmente adicionar o usuário foo à lista de acesso autorizado ao servidor X.

xhost si:localuser:foo

E foi isso, então eu fui capaz de lançar o Firefox (e outro aplicativo X) usando sudo e o usuário foo.

Antecedentes : No X Window, existe uma arquitetura cliente / servidor. Quando você inicia um aplicativo, você solicita a autorização do servidor X para exibi-lo. Por padrão, uma vez que você abre uma sessão (faz login graficamente), você (seu usuário) obviamente tem permissão para se comunicar com o servidor e exibir aplicativos. Outros usuários não têm essa permissão, a menos que você a especifique. xhost é uma ferramenta para manipular a lista de permissões. O si indica que a regra é do lado do servidor e autoriza o usuário local foo a exibir aplicativos. X Window é muito poderoso nesse aspecto e você pode exibir aplicações remotas localmente jogando com a variável de ambiente DISPLAY e xhost (mas não se limitando a elas). Em épocas mais antigas, quando as pessoas digitavam xhost + e implicitamente permitiam que todos usassem sua sessão X, era possível exibir o aplicativo em sua tela para brincadeiras ;-) não tanto hoje em dia quanto as pessoas estão cada vez menos usando o X Window client / server arquitetura (pelo menos pelo que eu observei nos últimos 10 anos).

Espero que isso ajude os outros.

PS: Eu fiz isso para lançar o Firefox em uma espécie de "prisão" (para evitar um vulnerabilidade como para pdf.js no futuro). Mas eu rapidamente descobri que ligar para o Firefox via sudo não permite que ele acesse o áudio nem o hardware de vídeo. Mas há um cara que explica claramente como ativar o hardware de vídeo aceleração e áudio ao chamar o Firefox via sudo . YMMV com estas instruções, e. Eu ainda tenho uma permissão negada com áudio, mas o vídeo está bem (testado no Fedora 22 com o SELinux ON).

    
por 18.08.2015 / 14:49
7

Você pode

Especifique a exibição a ser usada na linha de comando, adicionando -display :0.0

ou

Configure a variável de ambiente no script de login do root (um dos seguintes: .bashrc, .profile, .bash_profile ...).

export DISPLAY=:0.0

Você pode verificar se está definido,

$ env |grep DISPLAY
DISPLAY=:0.0

Para abrir seu display para todos os usuários de todos os hosts como usuário normal, você pode fazer isso com:

xhost +

    
por 09.03.2014 / 10:14
3

Dado que você está no Debian, a solução simples e suportada é organizar o sudo para copiar suas credenciais de autorização do X11. pam_xauth está incluído no pacote libpam-modules exatamente para este propósito; para usá-lo, você só precisa adicionar

session  optional  pam_xauth.so

ao seu arquivo /etc/pam.d/sudo . Você também pode optar por adicioná-lo a su também. Para informações completas, consulte a página pam_xauth man, é claro.

    
por 31.08.2016 / 18:42
1

O que me ajudou:

  1. Você pode xauth generate :0 . trusted no lado user , o que gerará um novo MIT-MAGIC-COOKIE-1
  2. Verifique se a variável recém-criada Chave com xauth list' as user and raiz (they should be the same if your xAuthority 'está apontando para o mesmo arquivo.

  3. Voila, root acessará qualquer X-App do terminal, mas apenas temporariamente.

Para torná-lo permanente, veja a resposta do @Huygens!

    
por 12.03.2018 / 21:35
1

Solução alternativa:

Serviços como o cron rodando sob root não tem acesso para mostrar se o atual usuário x não é root.

Precisamos apenas adicionar usuário root a x, você pode fazer isso no momento do login com um script de inicialização

xhost local:root

Para fins de teste, podemos apenas executar o comando sob o usuário atual e relançar o script raiz / job / service /...

    
por 18.08.2018 / 13:04
-1

use este comando e ele funcionará

sudo cp /home/user/.Xauthority .Xauthority
    
por 31.08.2016 / 15:55

Tags