
我必須使用公司自製的工具,該工具需要“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/.Xauthority
1 放入 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 循環之後保留一個小值。