Executando o aplicativo GUI como outro usuário (não raiz)

34

Digamos que eu tenho 2 contas de usuário user1e user2. Quando efetuo login como user1e depois user2uso su, posso executar programas de linha de comando, mas os programas da GUI falham.

Exemplo:

user1@laptop:~$ su - user2
user2@laptop:~$ leafpad ~/somefile.txt
No protocol specified
leafpad: Cannot open display: 

Então, como posso executar um aplicativo GUI?

sashoalm
fonte
Um dos principais motivos, eu descobri, que isso falha é porque $XAUTHORITYainda está definido como user1's ~/.Xauthority, que o programa, eu acho, tentará ler, e falha porque esse arquivo normalmente tem o modo 0600 ( -rw-------), o que significa que não está disponível para leitura por qualquer pessoa do grupo "outro", que inclui o usuário2. Ou seja, se você chmod o+r ~/.Xauthority(como usuário1), você terá invadido esse problema. Eu escrevi um script que demonstra isso.
Braden Best

Respostas:

42

su vs. su -

Ao se tornar outro usuário, você geralmente deseja usar su - user2. O traço forçará o usuário2 .bash_profilea obter a origem.

xhost

Além disso, você precisará conceder aos usuários acesso ao seu monitor. Isso é controlado pelo X. Você pode usar o comando xhost +para permitir que outros usuários exibam GUIs na área de trabalho do usuário1.

NOTA: Ao executar, xhost +você deseja executá-lo ainda em um shell que pertence ao usuário1.

$ DISPLAY

Quando você se torna usuário2, pode ser necessário definir a variável de ambiente $DISPLAY.

$ export DISPLAY=:0.0
slm
fonte
1
xhost +user2ainda me dá esse erro - xhost: bad hostname "user2". Pesquisei alguns no Google e parece que preciso fazer xhost +user2@laptopou xhost +user2@localhostnão tenho certeza de qual. Então diz xhost +user2@localhost being added to access control list.
sashoalm
1
Mas mesmo depois de adicionar o usuário xhoste especificar export DISPLAY=:0.0, a execução leafpadainda me dá No protocol specified leafpad: Cannot open display:e falha na execução. Encontrei este link em linuxquestions.org/questions/linux-newbie-8/… , que diz que existem alguns cookies mágicos e xauth. Você já testou que essas coisas funcionam no seu computador? Talvez algo esteja diferente com a minha configuração? Estou no Debian + LXDE.
sashoalm
1
Obrigado, xhost +trabalhos e nada mais parece ser necessário (não é necessário definir $DISPLAY). Você pode atualizar sua resposta e eu a aceito?
sashoalm
5
Oh, encontrei algo. No Fedora 21, a execução xhostfornece uma lista no formato SI:localuser:USERNAME, portanto xhost SI:localuser:user2deve funcionar. Ah, e a exibição do usuário pode ser encontrada usando w.
21415 Wilf
7
xhost +permitirá que qualquer usuário em qualquer host que possa se conectar ao seu servidor x acesse sua tela. xhost +SI:localuser:user2funciona para mim no Debian.
robartsd
9

Você precisa compartilhar o token de autenticação do usuário1 (supondo que ~seja a casa do usuário1 ):

cat ~/.Xauthority | sudo -u user2 -i tee .Xauthority > /dev/null
user4674453
fonte
1
Esta é a única resposta que funcionou para mim (Ubuntu 14).
sudo
Essa solução funciona bem de dentro da máquina remota (= cliente X Win), enquanto as soluções xhost em outras respostas precisam ser executadas na máquina local (= servidor X Win).
Jpsy
Pode ser mais seguro usá-lo tee -apara evitar que ocorra qualquer informação existente no  .Xauthority.
Scott
7

Você pode usar o encaminhamento X11:

ssh -XY otheruser@localhost your-gui-program-name-here
Michael Franzl
fonte
Esta é uma solução brilhante. O mais simples que li até agora. Muito mais pessoas estão familiarizadas com o ssh do que com a configuração x11.
Alexis Panagiotopoulos
6

Você pode iniciar o aplicativo a partir de outro usuário. Iniciarei o aplicativo gimp a partir do usuário2, enquanto estiver conectado (GUI) com o usuário 1:

$ xhost +
$ sudo su user2

(insira o passe)

$ gimp

Aproveitar :)

Antoni Stavrev
fonte
4
É o mesmo que a resposta aceita com quatro anos de idade.
G-Man diz 'Reinstate Monica'
você pode dizer uma maneira rápida e melhor?
Antoni Stavrev 01/01
Eu sempre usei esse método, mas não está mais funcionando comigo no Debian e no Xfce. ( Correção : ela não funciona, mas eu tenho que export DISPLAYprimeiro, como a resposta aceita diz)
giusti
depois que você terminar sua sessão, será bom desativá-lo por$ xhost -
Antoni Stavrev
4

Você pode tentar o comando sux:

sux user2

O sux manipulará o material $ DISPLAY para você. Pode ser necessário instalá-lo com:

sudo apt-get install sux

sob Debian / Ubuntu.

phil
fonte
4
suxnão é mais enviado pelo Debian ou Ubuntu. A melhor alternativa que eu poderia encontrar é a adição xhost SI:localuser:root(ou qualquer usuário) para ~/.xprofilepermitir-lo permanentemente ou para usorunuser
stefanct
Até e incluindo o Debian Stretch, havia gksu/ gksudoalternativa que funcionava bem. Enquanto ainda está no Sid, ele é removido no Buster por problemas de segurança.
Matija Nalis 7/09
0

Como alternativa sux, para executar com segurança o comando gráfico ( firefox-esrno exemplo abaixo) como $AUTHUSER( guestno exemplo abaixo):

AUTHUSER=guest
AUTHSTRING=SI:localuser:${AUTHUSER}
xhost +${AUTHSTRING} > /dev/null
SUDO_ASKPASS=/usr/bin/ssh-askpass
export SUDO_ASKPASS
sudo -k --askpass -u ${AUTHUSER} /usr/bin/firefox-esr
xhost -${AUTHSTRING} > /dev/null
sudo -K

o código faz:

  1. dá ao guestusuário acesso ao seu usuário atual $DISPLAYviaxhost +SI:localuser:guest
  2. usa ssh-askpasspara solicitar graficamente sua senha (é claro, você pode sudoers(5) NOPASSWD:evitar isso, se sua política de segurança achar que está ok. Ou você pode usar outros askpassprogramas ou especificá-los nos arquivos de configuração (veja sudo(8)detalhes em --askpass)
  3. se a senha estiver correta (e você tiver permissões sudoers(5)), executa o comando /usr/bin/firefox-esrcomo outro usuário ( guest)
  4. após a conclusão do programa, as permissões para outro usuário ( guest) para acessar o seu $DISPLAYsão revogadas viaxhost -SI:localuser:guest
  5. finalmente, sudo -Kremove a senha em cache; portanto, a próxima chamada de ssh-askpasssolicitará a senha novamente (em vez de usar a senha em cache)

    Embora seja um pouco mais trabalhoso do que o que gksu(8)ou o que sux(8)foi feito, ele pode ser script e é muito mais seguro do que:

    • xhost + (qualquer usuário terá acesso à sua exibição gráfica enquanto estiver em vigor)
    • legível ~ / .xauth por outros usuários (acesso indefinido desse usuário ao seu monitor)
    • what gksu/ suxdid (cópia temporária de ~/.Xauthority, o que permitiu que o usuário especificado copiasse o seu MIT-MAGIC-COOKIE-1e continuasse usando o seu monitor mesmo após a conclusão do gksu / sux (desde que você não desligasse a máquina ou desconectasse o monitor - protetores de tela, hibernação etc. não alteraram a mágica biscoito).

pois permitirá apenas um usuário local acessar sua tela e somente enquanto o comando for executado (quando o comando for concluído, $AUTHUSERnão será mais possível acessar sua tela de nenhuma maneira).

Outra alternativa segura é ssh -X(sem -Yque realmente o torna menos seguro! Ver ForwardX11Trustedem ssh_config(5)para mais detalhes), como é mais fácil de usar se você não está scripting, mas induz sobrecarga additinal (por exemplo., É mais lento) e alguns programas podem não funcionar corretamente sem inseguro -Y .

Matija Nalis
fonte
-1

Você precisa carregar a interface do usuário de instalação como user2 .

Tente seguir o seguinte:

Faça o login como root :

sudo su

Teste o servidor x:

xclock

Se você pode ver um relógio funcionando, está pronto, tente executar o seguinte:

xhost

O resultado deve ser assim:

xhost SI:localuser:tri
# tri is my user name

Agora deixe o user2 acessar o xhost

xhost +SI:localuser:user2

Agora tente entrar novamente no user2 e tente abrir qualquer programa da GUI.

Colheita 1018
fonte
(1) Não há nada nesta pergunta que exija executar como root ou onde a execução como root seja benéfica. (1b) Se houver algo, rodar como root pode apenas confundir as coisas. (2) Raramente (se alguma vez) existe algum motivo para usar sudo su. Use  sudoou  su; escolha um. (3) A questão está escrita em termos de  user1e  user2. Por favor, escreva sua resposta em termos de  user1e  user2. (Faça ou não; não há  tri.) (4) Sua resposta seria melhor se incluísse uma explicação de  SI:localuser. …………………… Por favor, não responda nos comentários; edite  sua resposta para torná-la mais clara e completa.
Scott