ローカルXサーバー

ローカルXサーバー

「ルート」アクセスを必要とする会社が作成したツールを使用する必要がありました。

さらに悪いことは、GUIアプリケーションであることです。普段ならこんなことはしないだろうけど選択の余地があまりなかったんです。

現在、私は使用しています

xhost + && sudo java -jar servermanager.jar && xhost -

アプリケーションを実行します。ただし、これは、Javaが実行されているときにX-Serverへのアクセス制御が無効になることを意味します。

xhost -もちろん、これは最も深刻なセキュリティ問題ではないかもしれませんが、アプリケーションがX接続を開くとすぐに問題が発生するように時間を測定するより良い方法があるかどうかはまだ疑問に思います。

重要な要約:GUIウィンドウが開くとすぐにコマンドを実行する方法は?

答え1

ローカルXサーバー

Xサーバーがローカルの場合(たとえば、TCP以外のUnixソケット接続)、さらに細かく分割して特定のローカルユーザーのみを許可できます。

xhost +SI:localuser:root

X SSH経由

そうでない場合は、ルートへの直接SSHアクセスを許可し(公開鍵認証を使用)、このセキュア接続を介してXを渡し、sudo呼び出しの代わりにそれを使用することを検討できます。

ssh -X -f root@localhost java -jar servermanager.jar

.Xauthorityとsudo

ルートがファイルを読み取ることができると仮定すると(おそらくホームディレクトリがNFSにない限り)、sudoで実行されているコマンド環境に1を.Xauthority入力するだけで接続できることがわかります。XAUTHORITY=$HOME/.Xauthority

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"

¹これは$HOMErootではなく、ユーザーのホームディレクトリです。

答え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ループの後に常に小さな値を維持できます。

関連情報