我必须使用公司自制的工具,该工具需要“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 循环之后保留一个小值。