
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 .Xauthority
arquivo (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"
¹ $HOME
aqui é 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 sleep
loop após o while.