O que é XDG_RUNTIME_DIR?

7

Enquanto eu estava tentando abrir o Evince da linha de comando, está me dando um erro

neo@Muhammad:~$ sudo evince

No protocol specified

** (evince:4164): WARNING **: Could not open X display
No protocol specified
error: XDG_RUNTIME_DIR not set in the environment.
Cannot parse arguments: Cannot open display:

Como resolver este problema?

    
por Muhammad Iliyas 17.01.2017 / 07:07

2 respostas

11

Primeiras coisas primeiro: XDG_RUNTIME_DIR

Para responder sua primeira pergunta, "O que é XDG_RUNTIME_DIR?" , é uma variável de ambiente que é configurada automaticamente quando você efetua login. Diz a qualquer programa que você executar onde encontrar um usuário específico diretório no qual ele pode armazenar pequenos arquivos temporários. Observe que XDG_RUNTIME_DIR é definido por pam_systemd (8) , por isso não está realmente relacionado com X (executando programas graficamente), que é o problema que você parece ter.

Como solucionar problemas

Sua segunda pergunta, "Como solucionar esse problema?" é muito boa. Isso significa que você não está interessado apenas em qual é a correção, mas também em como descobrir por conta própria. Para começar, observe primeiro as primeiras mensagens de erro. Em particular, procurar por No protocol specified ou WARNING **: Could not open X display , deve mostrar que o problema é com X (também chamado The X Windowing System ), que é como programas gráficos são mostrados em sua tela. Sabendo que isso deve levantar muitas questões de solução de problemas em sua mente.

EXIBIÇÃO X

Sua próxima pergunta pode ser, o que é esse "display X" que o evince não pode abrir? Um "display" é o endereço da sua tela. [*] Qualquer programa que queira escrever em sua tela precisa saber o endereço. Você pode ver qual é a sua exibição X, verificando a variável de ambiente DISPLAY:

echo $DISPLAY

E você pode verificar o que o sudo acha que seu DISPLAY está digitando:

sudo -s
echo $DISPLAY
exit

Se não mostrar nada, então esse é o problema. (Veja a correção abaixo).

XAUTHORITY

Mas, e se esse não for o problema e o DISPLAY estiver definido corretamente em sudo ? Então você pode se perguntar: X tem algum tipo de permissão que impede que outros usuários escrevam no meu monitor? Se você pensou que estaria certo, X tem dois métodos principais de autorização: xauth e xhost . O mais comumente usado hoje é xauth (1) que usa o XAUTHORITY variável de ambiente. Novamente, vamos verificar se está definido corretamente em sudo :

echo $XAUTHORITY
sudo -s
echo $XAUTHORITY
exit

Se XAUTHORITY estiver apontando para um arquivo em seu diretório pessoal, mas estiver em branco quando você executar sudo , esse é o problema.

CORRECÇÃO: Salvar as variáveis de ambiente

Então, qual é a correção? Se as variáveis de ambiente DISPLAY ou XAUTHORITY não forem salvas no sudo , você poderá informar sudo (8) para preservar o ambiente usando a opção -E , da seguinte forma:

sudo -E evince

Uma maneira melhor: env_keep

Você pode perguntar: Espere, se -E fizer tudo funcionar magicamente, por que não é o padrão para sudo ? A resposta é que é um risco potencial à segurança. Variáveis de ambiente afetam a maneira como os programas funcionam e você não quer que todos sejam exportados de uma conta de usuário para a raiz. A maneira "correta" de fazer isso é adicionar a linha Defaults env_keep += "DISPLAY XAUTHORITY" ao sudoers (5) arquivo usando visudo (8) . Você pode verificar quais variáveis de ambiente o sudo preserva executando:

sudo sudo -V

(Sim, você digita sudo duas vezes). Eu recomendo colocar a linha não no arquivo sudoers padrão ( /etc/sudoers ), mas em um arquivo local que não será sobrescrito quando você atualizar seu sistema. Você pode fazer isso assim:

sudo visudo -f /etc/sudoers.d/local 

Mas espere, e se nenhum dos itens acima funcionar?

Eu acho que esta é uma resposta bastante completa, mas se você ainda está tendo problemas, há uma outra coisa que eu sugiro. Você pode usar xhost (1) para conceder acesso a um usuário específico no host local (sua máquina) assim,

xhost si:localuser:root

Nesse caso, estamos especificando root como o nome de usuário, já que essa é a conta com a qual sudo executa programas.

[*] : Q: Eu só tenho uma tela, então por que um display X precisa de um "endereço"? A: É porque o X pode funcionar não apenas na sua máquina, mas na Internet. Com X , é fácil executar programas em sua máquina que aparecem em outros hosts da Internet e programas em outros hosts que aparecem na tela (supondo que você tenha permissão).

    
por hackerb9 25.06.2017 / 12:10
0

XDG_RUNTIME_DIR é uma variável de ambiente definida no contexto do X Windows, para que os programas possam encontrar coisas. Você ( neo ) configurou o contexto gráfico.

Ao tentar executar evince como root , você inseriu a condição em que um usuário ( root ) está tentando acessar a exibição de outro usuário ( neo ). Isso é considerado uma Coisa Ruim.

Se você decidir que DEVE executar um editor gráfico como root , leia man gksudo e use gksudo .

    
por waltinator 17.01.2017 / 16:19