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.