Servidor X local

Servidor X local

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, porém, que enquanto o java estiver em execução, o controle de acesso ao X-Server estará desabilitado.

É verdade que esse pode não ser o pior dos problemas de segurança, mas ainda me fez pensar se existe um método cronometrado melhor para executar xhost -imediatamente após o aplicativo abrir sua conexão X.

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

Responder1

Servidor X local

Se o seu servidor X for local (ou seja, conexão de soquete Unix em vez de TCP), você poderá ser mais refinado e permitir apenas aquele usuário local específico:

xhost +SI:localuser:root

X sobre SSH

Caso contrário, você pode considerar permitir o SSH direto para root (usando autenticação de chave pública), com o X encaminhado por esta conexão segura e usando isso como um substituto para sua invocação do sudo:

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

.Xauthority e sudo

Supondo que o root possa ler seu .Xauthorityarquivo (provavelmente, a menos que seu diretório inicial esteja no NFS), então você pode descobrir que simplesmente colocar XAUTHORITY=$HOME/.Xauthority¹ no ambiente do comando executado no sudo permitirá que ele se conecte:

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

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

.Xauthority e xauth

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

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

Responder2

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 -
    }

Responder3

Se você tiver o pgrep instalado, poderá torná-lo mais determinístico 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 de qual for o nome final do processo. Se acontecer de disparar muito rapidamente, você sempre poderá manter um pequeno sleeploop após o while.

informação relacionada