O que é XDG_RUNTIME_DIR?

13

Enquanto eu tentava abrir o Evince na linha de comando, isso estava 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 solucionar esse problema?

Muhammad Iliyas
fonte
1
Conte-nos mais sobre o seu sistema operacional.
DK Bose

Respostas:

27

Primeiras coisas primeiro: XDG_RUNTIME_DIR

Para responder à sua primeira pergunta, "O que é XDG_RUNTIME_DIR?" , é uma variável de ambiente que é definida automaticamente quando você faz login. Diz a qualquer programa que você executa onde encontra um diretório específico do usuário no qual pode armazenar pequenos arquivos temporários. Observe que XDG_RUNTIME_DIRé definido por pam_systemd(8) , portanto, não está realmente relacionado ao X (executando programas graficamente), que é o problema que você parece estar tendo.

Como solucionar problemas

Sua segunda pergunta, "Como solucionar esse problema?" é muito bom. Isso significa que você está interessado não apenas no que é a correção, mas também em como descobrir isso sozinho. Para começar, observe primeiro as primeiras mensagens de erro. Em particular, procurar No protocol specifiedou WARNING **: Could not open X displaydeve mostrar que o problema está no X (também chamado de Sistema de Janelas X ), que mostra como os programas gráficos são exibidos na tela. Saber isso deve gerar muitas perguntas para a solução de problemas em sua mente.

X DISPLAY

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

echo $DISPLAY

E você pode verificar o que sudoacha que seu DISPLAY é 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 DISPLAYestiver definido corretamente sudo? Então você pode se perguntar: o X tem algum tipo de permissão que impede que outros usuários escrevam no meu monitor? Se você achou isso correto, o X tem dois métodos principais de autorização: xauthe xhost. O mais usado hoje é xauth(1), que usa a XAUTHORITYvariável de ambiente. Mais uma vez, vamos verificar se está configurado corretamente sudo:

echo $XAUTHORITY
sudo -s
echo $XAUTHORITY
exit

Se XAUTHORITYestiver apontando para um arquivo no diretório inicial para você, mas estiver em branco quando você executar sudo, esse é o problema.

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

Então, qual é o problema? Se as variáveis ​​de ambiente DISPLAYou XAUTHORITYnão estiverem sendo salvas sudo, você pode dizer sudo(8) para preservar o ambiente usando a -Eopção:

sudo -E evince

Uma maneira melhor: env_keep

Você pode perguntar, espere, se -Efaz tudo funcionar magicamente, por que não é o padrão sudo? A resposta é que é um risco potencial à segurança. As variáveis ​​de ambiente afetam a maneira como os programas funcionam e você não deseja 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 arquivo sudoers(5) usando visudo(8) . Você pode verificar quais variáveis ​​de ambiente o sudo preserva executando:

sudo sudo -V

(Sim, você digita sudoduas vezes). Eu recomendo colocar a linha não no arquivo sudoers padrão ( /etc/sudoers), mas em um arquivo local que não será substituído quando você atualizar seu sistema. Você pode fazer o seguinte:

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

Mas espere, e se nenhuma das opções acima funcionar?

Acho que essa é uma resposta bastante completa, mas se você ainda está tendo problemas, há 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) dessa forma,

xhost si:localuser:root

Nesse caso, especificamos rootcomo o nome de usuário, pois essa é a conta que sudoexecuta os programas como.


[*] : P: Eu tenho apenas uma tela, então por que um monitor X precisa de um "endereço"? R: É porque o X pode funcionar não apenas na sua máquina, mas na Internet. Com o 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ê permita a eles).

hackerb9
fonte
Obrigado pela resposta elaborada. Tenho certeza de que há pelo menos algo novo em sua resposta para cada usuário. (Para me: como conceder acesso ao X a um usuário específico, que é melhor do que a emissão xhost +para permitir o acesso universal.)
drumfire
3

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 evincecomo root, você inseriu a condição em que um usuário ( root) está tentando acessar a neoexibição de outro usuário ( ). Isso é considerado uma coisa ruim.

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

waltinator
fonte
comentário interessante. Você sabe como eu poderia fazer algo assim? journalctl -b -p err | wl-copyrelata o Failed to connect to a Wayland serverque faz sentido, mas parece idiota do POV do usuário.
Mh-cbon 28/05/19