Execute o comando após o início da aplicação da GUI

0

Eu tenho que usar uma ferramenta caseira na minha empresa, que requer privilégios de 'root'.

Para piorar as coisas, é um aplicativo GUI. Normalmente, eu não executaria essas coisas, mas não tenho muita escolha.

Atualmente, estou usando

xhost + && sudo java -jar servermanager.jar && xhost -

para executar o aplicativo. Isso significa que, para o tempo em que o java está sendo executado, o controle de acesso ao X-Server está desativado.

Com certeza, isso pode não ser o pior dos problemas de segurança, mas ainda me pergunto se existe um método cronometrado melhor para executar xhost - imediatamente após o aplicativo ter aberto sua conexão X.

TL; DR: Como posso executar um comando logo após a abertura de uma janela da GUI?

    
por tannerli 18.02.2016 / 11:27

3 respostas

1

Servidor X local

Se o seu servidor X for local (isto é, conexão de soquete Unix ao invés de TCP), você poderá ser mais refinado e permitir somente esse usuário local específico:

xhost +SI:localuser:root

X sobre SSH

Se não, você pode considerar permitir que o SSH direto faça root (usando a autenticação de chave pública), com o X encaminhado através desta conexão segura, e usando isto como um substituto para sua invocação do sudo:

ssh -X -f root@localhost java -jar servermanager.jar

.Xauthority e sudo

Assumindo que root possa ler seu arquivo .Xauthority (provavelmente, a menos que seu diretório home esteja no NFS), você pode achar que simplesmente colocar XAUTHORITY=$HOME/.Xauthority ¹ no ambiente do comando executado dentro do sudo permitirá a conexão:

XAUTHORITY="${XAUTHORITY-$HOME/.Xauthority}" \
  sudo -E java -jar servermanager.jar

Se o sudo estiver configurado para não permitir a passagem de XAUTHORITY , você poderá exportar explicitamente o token:

.Xauthority e xauth

xauth extract - $DISPLAY | sudo bash -c \
  "xauth merge - && java -jar servermanager.jar"

¹ $HOME aqui é o diretório inicial do usuário, não o do root.

    
por 18.02.2016 / 15:02
0

Eu coloquei o seguinte em meu ~ / .bash_aliases

   smg(){
     xhost + 
     sudo echo "Starting servermanager" #To get sudo prompt in fg
     sudo java -jar ~/downloads/servermanager.jar 2>/dev/null &
     sleep 5
     xhost -
    }
    
por 18.02.2016 / 13:40
0

Se você instalou o pgrep, pode torná-lo mais determinista com algo como:

smg(){
  xhost + 
  sudo echo "Starting servermanager" #To get sudo prompt in fg
  sudo java -jar ~/downloads/servermanager.jar 2>/dev/null &
  while  ! pgrep -l servermanager.jar > /dev/null ; do :; done
  xhost -
}

... dependendo do nome do processo final. Se ocorrer um disparo muito rápido, você sempre poderá manter um pequeno sleep após o loop while.

    
por 18.02.2016 / 14:39

Tags