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 glxgears
partir da conta do usuário. É só depois que eu faço sudo -i
que 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.
Respostas:
O acesso ao servidor X requer duas coisas:
$DISPLAY
variável que aponta para a exibição correta (geralmente:0
)As informações de autenticação podem ser especificadas explicitamente via
$XAUTHORITY
e o padrão é o~/.Xauthority
contrário.Se
$DISPLAY
e$XAUTHORITY
estiver definido para o usuário, tambémsudo
será 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,
$XAUTHORITY
geralmente não é definido explicitamente. Basta adicionarao seu
.bashrc
ou diga explicitamenteXAUTHORITY=~/.Xauthority sudo ...
e tudo deve funcionar.Você também pode usar
xauth list
para verificar se as informações de autenticação adequadas estão disponíveis.fonte
xauth info
caminho shows para arquivo de autoridadexhost +
Corrigido o meu problemaxhost +
desativa completamente autenticação e permite que todos acesso de todos os aplicativos na tela ...sudo -i
vez desudo su -
.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:
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.
E foi isso, então eu pude iniciar o Firefox (e outro aplicativo X) usando
sudo
e 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. Asi
indica que a regra é do lado do servidor e autorizar o usuário localfoo
para aplicações de display. O X Window é muito poderoso nesse sentido e você pode exibir aplicativos remotos localmente jogando com aDISPLAY
variável de ambiente exhost
(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).
fonte
foo
foiroot
, ou seja, eu tive que rodarxhost si:localuser:root
no Ubuntu 17.10.xhost si:localhost<user>
comando? Se nenhum usuário estiver conectado, ninguém terá um servidor X disponível para permissão.ParaView
, um programa construídovtk
, geralmente na própria estação de trabalho.ParaView
també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 executarxhost
, não posso utilizar a GPU. Isso significa que não consigo reiniciar a máquina remotamente e ainda tenho acesso à GPU.-X
ou (melhor?)-Y
No 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.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,
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 +
fonte
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 abaixosudo su
.Dado que você está no Debian, a solução simples e suportada é organizar para
sudo
copiar suas credenciais de autorização X11.pam_xauth
está incluído nolibpam-modules
pacote exatamente para esse fim; para usá-lo, você só precisa adicionarpara o seu
/etc/pam.d/sudo
arquivo. Você também pode optar por adicioná-losu
também. Para informações completas, consulte apam_xauth
página do manual, é claro.fonte
O que me ajudou:
xauth generate :0 . trusted
douser
lado, o que irá gerar um novoMIT-MAGIC-COOKIE-1
Verifique se a chave recém-criada, com a variável xAuthority da raiz do
xauth list' as
usuário, está apontando para o mesmo arquivo.and
(they should be the same if your
Voila,
root
acessará qualquer umX-App
do terminal, mas apenas temporariamente.Para torná-lo permanente, consulte a resposta de @Huygens!
fonte
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
Para fins de teste, podemos simplesmente executar than command sob o usuário atual e reiniciar o script raiz / job / service / ...
fonte
O
sudo
comando possui uma opção para preservar variáveis de ambiente.Para que você possa executar o comando com a opção -E. Exemplo:
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
eXAUTHORITY
já estiver definido corretamente .fonte
use este comando e funcionará
fonte
cp: cannot stat ‘/home/user/.Xauthority’: No such file or directory
a qualquer uma das mais de 10 máquinas baseadas em Debian às quais tenho acesso.