
В своей компании мне приходится использовать самодельный инструмент, требующий прав 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.