
私の会社では、root 権限を必要とする自作ツールを使用する必要があります。
さらに悪いことに、これは GUI アプリケーションです。通常、このようなことは実行しませんが、選択肢はあまりありません。
現在、私は
xhost + && sudo java -jar servermanager.jar && xhost -
アプリケーションを実行します。ただし、これは、Java の実行中は X サーバーへのアクセス制御が無効になることを意味します。
確かに、これは最悪のセキュリティ問題ではないかもしれませんが、それでも、xhost -
アプリケーションが X 接続を開いた直後に実行する、より適切なタイミングの方法があるのではないかと考えさせられました。
TL;DR: GUI ウィンドウが開いた直後にコマンドを実行するにはどうすればよいですか?
答え1
ローカル X サーバー
X サーバーがローカルの場合 (つまり、TCP ではなく Unix ソケット接続の場合)、より細かく設定して、特定のローカル ユーザーのみを許可することができます。
xhost +SI:localuser:root
SSH経由のX
そうでない場合は、ルートへの直接 SSH (公開鍵認証を使用) を許可し、このセキュリティで保護された接続を介して 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
ここでは、ルートのディレクトリではなく、ユーザーのホーム ディレクトリです。
答え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 ループの後に小さなループを残すことができます。