xdotoolを使用して、現在使用しているものとは異なるGUIセッションを自動的にクリックして制御できますか?

xdotoolを使用して、現在使用しているものとは異なるGUIセッションを自動的にクリックして制御できますか?

このxdotoolコマンドを使用すると、システムのグラフィカルユーザーインターフェースを制御するスクリプトを非常に簡単に作成できます。たとえば、次のコマンドを実行すると、次のデスクトップでChromeブラウザを開くことができますxdotool mousemove 26 146 click 1

ここに画像の説明を入力してください。

それでは、私のシステムの新しいユーザーを作成するとしましょう。

# adduser newuser

newuser別のセッションにログインしてxdotoolコマンドを実行すると、正常に動作します。しかし、2つの異なるGUIセッションが異なるttyに開いており、そのうちの1つが私のセッションとは異なるとしましょう。一般ユーザーその他の関連新しいユーザー、そして私達はまた私がそう言うことができます現在実行中私のGUIを使ったセッション一般ユーザー次のスクリプトを作成します。

#!/bin/bash

xdotool mousemove 31 61 click 1

macro.bashそれから私のホームフォルダに保存し、chmod 777 ~/macro.bash正しい権限を設定するために実行しました。最後に、新しい端末を開き、次のようにログインしますnewuser(現在の一般ユーザーセッションを使用している場合)。

$ su newuser

スクリプトを実行しようとすると、次のエラーが表示されます(編集を参照)。

newuser@myPC:~$ /home/myregularuser/macro.bash 
No protocol specified
Error: Can't open display: (null)
Failed creating new xdo instance

newuserで記録されたGUIセッションの実行中にスクリプトを実行しようとすると、スクリプトは正常に動作しますが、私の目標は、通常のユーザーセッションの使用中にスクリプト内の新しいユーザーセッションのグラフィカルインターフェイスを制御できるマクロツールを持つことです。可能ですか?このエラーを解決する回避策を知っている人はいますか?


編集する

〜のように非現実的なコメントで言った通信会社彼の答えは$DISPLAY環境変数と$XAUTHORITY。 telcoMの回答に記載されているように問題を解決することはできませんでしたが、次のプロセスで問題を解決しました。

1-私のnewuserセッションにログインします。

2-ファイルの最後の行に次のコマンドを挿入します~/.bashrc

if xhost >& /dev/null; then
   echo "export DISPLAY=\"$DISPLAY\"" > $HOME/.variableMemory
   echo "export XAUTHORITY=\"$XAUTHORITY\"" >> $HOME/.variableMemory
fi

$DISPLAY3-スクリプトが実行されたときに変数を正しい値にオーバーライドするようにスクリプトを変更します。$XAUTHORITY

#!/bin/bash

source $HOME/.variableMemory
xdotool mousemove 31 61 click 1

これにより、グラフィカルインターフェイスを使用して初めてnewuserセッションにログインするときにデフォルトで変数の値をキャプチャ$DISPLAYして保存し、後でシェルを使用してログインするときに使用できるようにします。$AUTHORITY

これでエラーは表示されず、xdotoolスクリプトを実行するときにコマンドを使用して別のセッションでマウスを完全に動かすことができますが、新しい問題があります。他のGUIセッションにあるXorgは、使用しないと停止します。。全体として、私が送信したすべてのクリックをキューに追加してから手動で特定のGUIセッションに切り替えると(xdotool使用できなくなる)、すべてのクリックがすぐに無効になります。したがって問題は残ります。別のGUIセッションを実行するときにマクロツールを使用してGUIセッションを制御できますか?セッションを使用していない場合でも、リアルタイムでクリックコマンドを受信できるように、この「停止動作」を無効にできるXorg設定はありますか?


追加情報

  1. Ubuntu 18.04を実行しています。
  2. 使用されるディスプレイサーバーはXorgです(Wayland xdotoolを使用するとまったく機能しませんが、この質問はWaylandとは関係ありません)。
  3. GNOMEは私が現在使用しているGUIです。
  4. 私の主な目的は、マクロツールを使用して実際に使用されていない画面を制御することで、マクロが操作中にコンピュータを使用できるようにすることです。この問題を解決するためにxdotool、Ubuntu、Xorg、およびGNOMEを選択しましたが、他のツール、デスクトップ環境、さらには異なるLinuxディストリビューションを使用して同じ問題を解決する答えも開いています...ありがとう!

答え1

欠落している別のコンポーネントは.Xauthorityファイルです。これには、X11サーバーが再起動されるたびに再生成される「セッションCookie」が含まれており、クライアントはX11サーバーにコマンドを送信するためにこのCookieが必要です。ファイルは通常にありますが、環境変数を使用して代替場所を指定~/.Xauthorityできます。$XAUTHORITY

あなた以外のGUIセッションを制御するには、他のセッションに対するセッションCookieへのアクセス権を取得する必要があります。値が異なる場合は、次のコマンドを使用して$DISPLAYセッションCookieをファイルにコピーします。.Xauthorityxauth extractxauth merge

su newuser -c "xauth extract /home/newuser/.Xauthority $newuserDISPLAY" | xauth merge

.Xauthorityファイルは、同時に複数のディスプレイの複数のセッションCookieを保存できます。

または、セッションCookieがすでにアクセス権を持つファイルにある場合は、この変数を使用して$XAUTHORITYそれを指すこともできます。


これは次のように見え始めました。XYの問題xdotool:あなたが達成したいことがあり、それを達成するための仮定された方法に定住したかもしれません。

しかし、何かを自動化しようとするときにGUIを使用するのがxdotool最も便利な方法です。たとえば、特定のユーザーとしてGoogle Chromeを自動的に実行したい場合は、アイコンのクリックをシミュレートする必要はありません。正しいIDと環境を並べ替え、必要なプロセスを実行するだけです。

たとえば、google-chromeユーザーとして起動するには、newuser次のようにします。

su -lc "DISPLAY=<whatever> google-chrome" newuser

コマンドにオプションがsuあるため、プロセスにはnewuser権限があるため、デフォルトの場所になります。つまり、Googleが必要な場合は、実際に実行されているGUIセッションに一致する変数に正しい値を提供するだけです。 Chromeで特定のURLを開くことができます。このURLは、二重引用符内にパラメータとして指定できます。-lgoogle-chrome$HOME.Xauthority~newuser/.Xauthority$DISPLAYnewusergoogle-chrome

関連情報