本地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 循環之後保留一個小值。

相關內容