terça-feira, 21 de outubro de 2008

Como Rodar Aplicações Root em Modo Gráfico (famoso "cannot open display" ou "can't open display")

Certamente já aconteceu contigo o seguinte: você instalou o Kurumin, Debian, Ubuntu, SuSE, etc. e tal. Durante a instalação, ele pede para você criar um usuário normal (ou seja, com permissão restrita), além do root. Termina a instalação com sucesso. Daí você reinicia a máquina e entra no modo gráfico, utilizando seu brilhante usuário com permissões restritas.
Tudo vai bem, até que você precisa abrir um terminar e digitar:

su [para entrar como superusuário]
[digite a senha do root]
firefox & [ou qualquer outra aplicação gráfica]

Então seu sistema responde algo como:

Gtk-WARNING **: cannot open display:
blá blá blá firefox: Permission denied
Xlib: connection to ":0.0" refused by server
Xlib: No protocol specified

ou, em algumas distros, a mensagem bem similar:

blá blá blá X11 error: Can't open display: :0.0
Set DISPLAY environment variable, use -display option
or check permissions of your X-Server
(See "man X" resp. "man xhost" for details)

Daí sobe aquele frio, sua garganta gela, sua pele seca... e você lembra que precisa executar um tal programa importantíssimo que é em modo gráfico, mas sabe que seu gerenciador de login (GDM ou KDM, talvez?) não permite que o root (administrador) faça login graficamente, alegando segurança... então lhe falta ar, você transpira, sinto o bafo gélido da morte.... nossa, o que fazer????
Caaalmmaaa... O Pajézinho tá aqui pra ajudar!!


  • Explicando o que aconteceu.
Isto acontece muitas vezes quando criamos um novo usuário diretamente pelo adduser, além de outras situações específicas, ou decorrente de uma má instalação do seu linux. Significa tão-somente que o usuário em questão não está autorizado pelo sistema a executar aplicativos gráficos do root. Sim, é preciso de autorização para isto, e essa autorização fica numa listinha do usuário chamado pelo "su".
Quer dizer mais ou menos o seguinte: o root tem uma lista de usuário em quem confia o acesso ao X. Se você entrou como root a partir do usuário A, mas A não está na lista do root, então não adianta forçar, você não tem autorização para o X e não vai poder rodar nada gráfico...

  • Como consertar?
Esta dita-cuja (a lista de usuários autorizados) fica num arquivo chamado .Xauthority, no home do seu usuário (e no home de qualquer usuário, inclusive do root). Para resolver a questão, basta copiar o .Xauthority de seu usuário para o do root (sim, no seu .Xauthority, você se concede permissão de executar aplicativos usando modo gráfico!!):

su
cp /home/eu/.Xauthority /root/

Agora, o root tem você na lista dele e, assim, pode te autorizar a rodar o X...

  • Solução para os preguiçosos
Bom, eu poderia ter terminado logo aí acima, mas sei que tem gente que talvez não tenha acertado, ou talvez não tenha tido paciência de ler direito tudo que escrevi... neste caso, use a solução não elegante: ao invés de logar com o comando "su", tente logar com o comando "sux", para ganhar automaticamente permissão de modo gráfico:

sux
[digite a senha do root]
firefox & [ou qualquer outra aplicação gráfica]

  • Solução Braçal
Não poderia faltar, pois os escovadores de bits também têm coração... esta solução funciona na maioria das vezes. Basta seguir os passos:

1- digite o comando "xauth list" como usuário comum. Deve vir ao terminal a lista de acessos, num formato algo parecido com:

10.0.0.1:0 MIT-MAGIC-COOKIE-1 fe5100ab8ef0dd5e139b096ca7568719
[fe80::211:d8ff:feb1:42e5]:0 MIT-MAGIC-COOKIE-1 fe5100ab8ef0dd5e139b096ca7568719
viola/unix:10 MIT-MAGIC-COOKIE-1 b0a4039a0924ad6f064f3b45bfdbb5bb
viola/unix:0 MIT-MAGIC-COOKIE-1 fe5100ab8ef0dd5e139b096ca7568719

(10.0.0.1 é meu IP na rede e "viola" é o nome da máquina. Sim, minha rede tem várias máquinas com nomes de instrumentos musicais).

2- agora, entre como root e adicione a autorização que você necessita (se não souber qual, vá adicionando as da lista e testando):

xauth add 10.0.0.1:0 . fe5100ab8ef0dd5e139b096ca7568719 [cuidado para não esquecer o "."]

Isto deve funcionar, e você poderá ter uma boa e tranquila noite de sono hoje!!

4 comentários:

Ricardo Rodrigues disse...

Grande Pajé, eu procurava uma solução para esse problema faz alguns meses e nada que encontrava nos foruns funcionava. Ontem encontrei sua página e sua dica solucionou meu problema. Muito obrigado.

O Pajé disse...

Beleza, Ricardo!!

Você não sabe como fico feliz em ler suas palavras!! Eu já tive este problema há alguns anos, pesquisei muito e consegui resolver, na época. Recentemente me ocorreu de escrever sobre ele apresentando todas as dicas que eu podia, já que é um problema razoavelmente comum e muito mal documentado. Assim, imaginei facilitar a vida de todos que tivessem esse mesmo problema, para que não experimentassem a dificuldade que tive ao buscar a solução. Lendo sua mensagem, vi que consegui o que queria! O Pajé está contribuindo para a comunidade!!
Valeu e boa sorte!!

Anônimo disse...

vlw Pajé, de tanto procurar via Google, achei a única solução aqui no seu blog, Brigadão Pajé, por compartilhar seus conhecimentos, show de bola !!! Meu
problema era que eu apenas conseguia rodar o wireshark como root no modo gráfico, nem a pau, nem por console.

Vlw mesmo, obrigado

Abs
Ejota

O Pajé disse...

Disponha, Ejota!!

Obrigado pela mensagem!! Fico muito feliz em poder ajudar!! No mundo open source, o conhecimento também tem que ser igualmente livre e compartilhado!!
Outras pessoas me reportaram problemas rodando o Firestarter no modo gráfico, que, por ser um firewall, roda sempre como root. Felizmente, este artigo as ajudou a resolver o problema!! :-)