ローカル X サーバー

ローカル X サーバー

私の会社では、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/.Xauthoritysudo 内で実行されるコマンドの環境に ¹ を入力するだけで接続できるようになる場合があります。

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 -
}

... 最終的なプロセス名がどうなるかによって異なります。 起動が速すぎる場合は、sleepwhile ループの後に小さなループを残すことができます。

関連情報