Por que não consigo executar aplicativos GUI a partir de 'root': “Nenhum protocolo especificado”?


39

Instalei o debian na minha máquina ontem à noite. Agora, não entendo por que não consigo executar aplicativos GUI de um terminal ao executar como root.

Por exemplo:

sudo -i
glxgears

Gera a seguinte saída:

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

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


11
stackoverflow.com/a/20612084 isso funcionou perfeitamente para mim.

Respostas:


39

O acesso ao servidor X requer duas coisas:

  • A $DISPLAYvariável que aponta para a exibição correta (geralmente :0)
  • Informações de autenticação adequadas

As informações de autenticação podem ser especificadas explicitamente via $XAUTHORITYe o padrão é o ~/.Xauthoritycontrário.

Se $DISPLAYe $XAUTHORITYestiver definido para o usuário, também sudoserá definido para o novo shell, e tudo deve funcionar bem.

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

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

export XAUTHORITY=~/.Xauthority

ao seu .bashrcou diga explicitamente XAUTHORITY=~/.Xauthority sudo ...e tudo deve funcionar.

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


11
xauth infocaminho shows para arquivo de autoridade
— Tomas Tomecek

11
xhost +Corrigido o meu problema
— danger89

3
Esteja ciente de que xhost +desativa completamente autenticação e permite que todos acesso de todos os aplicativos na tela ...
— Michas

11
para debian, digito a exportação XAUTHORITY como raiz? porque não está funcionando no deb10? Eu entro com sudo su
— marinara

@marinara use em sudo -ivez de sudo su -.
— michas 26/03

24

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 barra:

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

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

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 pude iniciar o Firefox (e outro aplicativo X) usando sudoe o usuário foo.

Antecedentes : Na janela X, há uma arquitetura cliente / servidor. Ao iniciar um aplicativo, você solicita a autorização do servidor X para exibi-lo. Por padrão, depois de abrir uma sessão (você loga 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. A siindica que a regra é do lado do servidor e autorizar o usuário local foopara aplicações de display. O X Window é muito poderoso nesse sentido e você pode exibir aplicativos remotos localmente jogando com a DISPLAYvariável de ambiente e xhost(mas não se limitando a eles). Antigamente, quando as pessoas digitavamxhost + e implicitamente permitiu que todos usassem sua sessão X, era possível exibir aplicativos em suas telas para brincadeiras ;-) não tanto hoje em dia quanto as pessoas usam cada vez menos a arquitetura cliente / servidor do X Window (pelo menos pelo que observo no últimos 10 anos).

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


11
No meu caso foofoi root, ou seja, eu tive que rodar xhost si:localuser:rootno Ubuntu 17.10.
— Karl Richter

Onde você adiciona o xhost si:localhost<user>comando? Se nenhum usuário estiver conectado, ninguém terá um servidor X disponível para permissão.
— Cbcoutinho 12/0318

@cbcoutinho O caso de uso acima é quando alguém está conectado e deseja executar um aplicativo XWindow como alguém no mesmo host. Se você explicar seu caso de uso (qual é o problema que você gostaria de resolver), eu posso ajudá-lo.
— Huygens

@Huygens Eu tenho uma estação de trabalho para simular fluidos que também é equipada com uma GPU. Eu renderizo as visualizações com ParaView, um programa construído vtk, geralmente na própria estação de trabalho. ParaViewtambém fornece um modelo de renderização de cliente / servidor sem cabeça seguro através do ssh, que eu gostaria de tirar vantagem do controle remoto em vez de usar o VNC. Sem fazer login na estação de trabalho e executar xhost, não posso utilizar a GPU. Isso significa que não consigo reiniciar a máquina remotamente e ainda tenho acesso à GPU.
— Cbcoutinho 13/03/19

11
@cbcoutinho X Window é uma arquitetura de servidor cliente. Quando você se conecta via ssh, sua estação de trabalho local se torna o X Window do cliente. Você pode usar o xhost com protocolos não seguros, como o rlogin, mas não o ssh. Você precisa instruir o ssh para fazer isso por você. Use o sinalizador -Xou (melhor?) -YNo ssh, ele fará o redirecionamento adequado. Claro que você precisa de um servidor C local. No entanto, com GPU e OpenGL, não tenho certeza de onde a renderização / computação acontece, talvez seja no lado do cliente, não no servidor. Pode ser complicado.
— Huygens

10

Você também pode

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

ou

Configure a variável de ambiente no script de login da raiz (um dos arquivos .bashrc, .profile, .bash_profile ...).

export DISPLAY=:0.0

Você pode verificar se está definido,

$ env |grep DISPLAY
DISPLAY=:0.0

Para abrir sua exibição para todos os usuários de todos os hosts como seu usuário normal, você pode fazer isso com:

xhost +


11
xhost + funciona como uma medida temporária antes de ir como sudo
— Octopus

11
xhost +funcionou para mim também, apenas que eles esqueceram de mencionar que deveríamos executá-lo no terminal do usuário autorizador, e não no terminal abaixo sudo su.
— precisa saber é

11
trabalho perfeito como boom
— Adiii 26/03/18

3

Dado que você está no Debian, a solução simples e suportada é organizar para sudocopiar suas credenciais de autorização X11. pam_xauthestá incluído no libpam-modulespacote exatamente para esse fim; para usá-lo, você só precisa adicionar

session  optional  pam_xauth.so

para o seu /etc/pam.d/sudoarquivo. Você também pode optar por adicioná-lo sutambém. Para informações completas, consulte a pam_xauthpágina do manual, é claro.


2

O que me ajudou:

  1. Você pode xauth generate :0 . trusteddo userlado, o que irá gerar um novoMIT-MAGIC-COOKIE-1
  2. Verifique se a chave recém-criada, com a variável xAuthority da raiz do xauth list' asusuário, está apontando para o mesmo arquivo.and(they should be the same if your

  3. Voila, rootacessará qualquer um X-Appdo terminal, mas apenas temporariamente.

Para torná-lo permanente, consulte a resposta de @Huygens!


1

Solução alternativa :

Serviços como o cron em execução no root não têm acesso para exibição se o usuário x atual não for root.

Nós só precisamos adicionar o usuário root ao x, você pode fazê-lo no momento do login com um script de inicialização

xhost local:root

Para fins de teste, podemos simplesmente executar than command sob o usuário atual e reiniciar o script raiz / job / service / ...


Apenas curioso, por que você estaria executando um aplicativo GUI através de um cron?
— Oct

na minha distro, eu tenho um trabalho raiz do cron (ms) que verifica a integridade da segurança do sistema e faz um relatório ... então, em vez de ir para os logs para verificar esse relatório, prefiro ter uma GUI pop-up com o relatório quando esse trabalho é executado
— intika

Isso funcionou para mim
— Marcus Vinicius Pompeu

0

O sudocomando possui uma opção para preservar variáveis ​​de ambiente.

 -E, --preserve-env            preserve user environment when running command

Para que você possa executar o comando com a opção -E. Exemplo:

sudo -E wireshark

Se você não precisar executar aplicativos críticos de privacidade, como navegadores da web, será melhor adicionar a opção -E ao sudo. Não podemos executar o Chrome ou o Firefox apenas adicionando a opção -E . Porque muitos navegadores implementaram proteção contra violações do espaço do usuário. A resposta de @ huygens pode ter informações sobre esse assunto.

Nota: A adição da opção -E não ajudará se o ambiente do usuário NÃO tiver DISPLAY e XAUTHORITY já estiver definido corretamente .


-1

use este comando e funcionará

sudo cp /home/user/.Xauthority .Xauthority

2
Isso dará cp: cannot stat ‘/home/user/.Xauthority’: No such file or directorya qualquer uma das mais de 10 máquinas baseadas em Debian às quais tenho acesso.
— Anthon

Isso fornece um pouco de contexto (por exemplo, você espera silenciosamente algum diretório atual) e não menciona efeitos colaterais como problemas ao fazê-lo em várias instâncias do X11. Eu acho que dessa maneira é um pouco hacky.
— V6ak
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.