この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
$DISPLAY
3-スクリプトが実行されたときに変数を正しい値にオーバーライドするようにスクリプトを変更します。$XAUTHORITY
#!/bin/bash
source $HOME/.variableMemory
xdotool mousemove 31 61 click 1
これにより、グラフィカルインターフェイスを使用して初めてnewuserセッションにログインするときにデフォルトで変数の値をキャプチャ$DISPLAY
して保存し、後でシェルを使用してログインするときに使用できるようにします。$AUTHORITY
これでエラーは表示されず、xdotool
スクリプトを実行するときにコマンドを使用して別のセッションでマウスを完全に動かすことができますが、新しい問題があります。他のGUIセッションにあるXorgは、使用しないと停止します。。全体として、私が送信したすべてのクリックをキューに追加してから手動で特定のGUIセッションに切り替えると(xdotool
使用できなくなる)、すべてのクリックがすぐに無効になります。したがって問題は残ります。別のGUIセッションを実行するときにマクロツールを使用してGUIセッションを制御できますか?セッションを使用していない場合でも、リアルタイムでクリックコマンドを受信できるように、この「停止動作」を無効にできるXorg設定はありますか?
追加情報
- Ubuntu 18.04を実行しています。
- 使用されるディスプレイサーバーはXorgです(Wayland xdotoolを使用するとまったく機能しませんが、この質問はWaylandとは関係ありません)。
- GNOMEは私が現在使用しているGUIです。
- 私の主な目的は、マクロツールを使用して実際に使用されていない画面を制御することで、マクロが操作中にコンピュータを使用できるようにすることです。この問題を解決するためにxdotool、Ubuntu、Xorg、およびGNOMEを選択しましたが、他のツール、デスクトップ環境、さらには異なるLinuxディストリビューションを使用して同じ問題を解決する答えも開いています...ありがとう!
答え1
欠落している別のコンポーネントは.Xauthority
ファイルです。これには、X11サーバーが再起動されるたびに再生成される「セッションCookie」が含まれており、クライアントはX11サーバーにコマンドを送信するためにこのCookieが必要です。ファイルは通常にありますが、環境変数を使用して代替場所を指定~/.Xauthority
できます。$XAUTHORITY
あなた以外のGUIセッションを制御するには、他のセッションに対するセッションCookieへのアクセス権を取得する必要があります。値が異なる場合は、次のコマンドを使用して$DISPLAY
セッションCookieをファイルにコピーします。.Xauthority
xauth extract
xauth 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は、二重引用符内にパラメータとして指定できます。-l
google-chrome
$HOME
.Xauthority
~newuser/.Xauthority
$DISPLAY
newuser
google-chrome