本地 X 服务器

本地 X 服务器

我必须使用公司自制的工具,该工具需要“root”权限。

更糟糕的是,它是一个 GUI 应用程序。一般情况下,我不会做这样的事情,但我也没有太多选择。

目前,我正在使用

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

执行应用程序。但这意味着,在 java 运行时,对 X-Server 的访问控制被禁用。

诚然,这可能不是最严重的安全问题,但它仍然让我想知道是否有更好的定时方法可以xhost -在应用程序打开其 X 连接后立即执行。

TL;DR:如何在 GUI 窗口打开后立即执行命令?

答案1

本地 X 服务器

如果你的 X 服务器是本地的(即 Unix 套接字连接而不是 TCP),你可以更细粒度,并且只允许特定的本地用户:

xhost +SI:localuser:root

通过 SSH 进行 X

如果没有,您可能会考虑允许直接 SSH 访问 root(使用公钥身份验证),并通过此安全连接转发 X,并使用它来替代 sudo 调用:

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

.Xauthority 和 sudo

假设 root 可以读取您的.Xauthority文件(可能,除非您的主目录位于 NFS 上),那么您可能会发现只需将XAUTHORITY=$HOME/.Xauthority1 放入 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 -
}

...取决于最终的进程名称。如果事实证明它触发得太快,你总是可以sleep在 while 循环之后保留一个小值。

相关内容