web-dev-qa-db-ja.com

Xセッションの外部から(たとえば、コンソールまたはSSHから)Xプログラムを実行する方法

コンソールにログインしている人でなくても、Xアプリケーションを実行してそのXセッションに表示するにはどうすればよいですか?私がrootであるか、ログインしたユーザーと同じであると想定しているため、原則としてこれを行う許可があります。しかし、どうすればこのことをXに納得させることができますか?

このような状況の例:

  • SSHでログインして、リモートコンピューターの画面に表示されるプログラムを実行します(notSSHを介してトンネリングされます-これはまったく異なります)
  • ImageMagickのimportコマンドを介してXセッションのスクリーンショットを撮るcronジョブ
  • 監査目的でキーストロークロガーを実行する

これは のよりシンプルなバージョンです。ウィンドウレスLinuxターミナルから直接OpenGLアプリを起動します

35
JasonSmith

簡単な答えは、DISPLAY環境変数を設定する必要があるということです。そうすると、アプリが実行されます。

長い答えは、Xauthを持っているということです。同じマシンで同じユーザーとして実行している場合を除き、Xサーバーを実行しているアカウントからXを実行しているアカウントにXauth資格情報をエクスポートしない限り、クライアント。 ssh -Xがこれを処理します。これが素晴らしい理由ですが、手動の手順にはxauth extract - $DISPLAY Xサーバーアカウントで、そのデータをxauth merge -クライアントアカウント。 (警告:データはバイナリです。)

最新のLinuxシステムでは、:0に1つのXセッションがあり、X11機関データファイルは常に$HOME/.Xauthorityしたがって、ほとんどの場合、たとえばBashで2つの環境変数を設定できます。

export XAUTHORITY=/home/$your_username/.Xauthority
export DISPLAY=':0'
43
hobbs

結果は、Xディスプレイ(DISPLAY環境変数に配置)とマジックCookie(ファイルに配置、XAUTHORITY環境変数にファイル名を配置)を知る必要があるということです。

手っ取り早い方法

Xを実行しているシステムで、rootであるか、Xにログインしたユーザーと同じユーザーである場合は、最も一般的なディスプレイおよびCookieファイルを想定してください(ディストリビューションのほぼすべての標準デスクトップインストールで動作します)。

env DISPLAY=:0 XAUTHORITY=/home/whoever/.Xauthority /path/to/my/X/program

より確実な方法

すでに実行中のXプログラムの環境からそれらを見つけてください。繰り返しますが、あなたがrootであるか、ログインしている同じユーザーである場合、これはあなたに知らせます(ユーザーがGNOMEを使用している場合):

cat /proc/`pgrep -f ^x-session-manager`/environ \
  | Ruby -ne 'puts $_.split("\0").select { |e| e =~ /^(DISPLAY|XAUTHORITY)=/ }'
17
JasonSmith