Локальный X-сервер

Локальный X-сервер

В своей компании мне приходится использовать самодельный инструмент, требующий прав root.

Хуже того, это приложение с графическим интерфейсом. Обычно я бы не стал выполнять такие вещи, но у меня нет особого выбора.

В настоящее время я использую

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

для выполнения приложения. Однако это означает, что на время работы Java контроль доступа к X-Server отключен.

Конечно, это, возможно, не самая большая проблема безопасности, но она все равно заставила меня задуматься, нет ли более эффективного метода, который выполнялся бы xhost -сразу после того, как приложение открыло свое X-соединение.

TL;DR: Как выполнить команду сразу после открытия окна графического интерфейса?

решение1

Локальный X-сервер

Если ваш X-сервер локальный (т.е. соединение через сокет Unix, а не TCP), вы можете действовать более тонко и разрешить доступ только этому конкретному локальному пользователю:

xhost +SI:localuser:root

X через SSH

Если нет, вы можете рассмотреть возможность разрешения прямого SSH-подключения к root (используя аутентификацию с открытым ключом) с пересылкой X по этому защищенному соединению и использования этого в качестве замены вызова sudo:

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

.Xauthority и sudo

Если предположить, что root может прочитать ваш .Xauthorityфайл (вероятно, если только ваш домашний каталог не находится на NFS), то вы можете обнаружить, что простое указание XAUTHORITY=$HOME/.Xauthority¹ в окружении команды, запущенной в sudo, позволит ей подключиться:

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

Если sudo настроено так, чтобы не разрешать передачу XAUTHORITY, вы можете явно экспортировать токен:

.Xauthority и xauth

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

¹ $HOMEздесь находится домашний каталог пользователя, а не root.

решение2

Я поместил следующее в свой ~/.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 -
    }

решение3

Если у вас установлен pgrep, вы можете сделать его более детерминированным, например:

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

... в зависимости от того, каким будет окончательное имя процесса. Если он срабатывает слишком быстро, вы всегда можете оставить small sleepпосле цикла while.

Связанный контент