
私は新しいLinuxユーザーと中級ユーザーの間にいます。
グループのローカルネットワークを設定していてインターネット接続が失われた場合は、ポータルに自動ログインを設定する必要があります。
Raspberry Pi(RASPBIAN OS)自体のモニターを使用してbashスクリプトを実行すると、機能し、順序は次のようになります。
fpingを使用してインターネットがダウンしていることを確認してください - > xtermを開く - > xdotoolがw3mを開くようにし、自動的にクリックしてパスワードを入力します。
圧縮形式のコードは次のとおりです。
DNSPing=$(fping 9.9.9.9)
EtecsaPing=$(fping 10.180.0.30)
...
if [[ ( $EtecsaPing == "10.180.0.30 is alive" ) && ( $DNSPing == "9.9.9.9 is unreachable" ) ]]
then
echo "ETECSA UP - Internet all down - Run login script now"
xterm &
sleep 2
xdotool type "w3m -m https://10.180.0.30:8443/"
xdotool key Return
...
xdotool type <USER>
xdotool key Return
xdotool sleep 1
...
xdotool key Return
xdotool type <PASSWORD>
xdotool sleep 1
...
xdotool key Return
sleep 5
killall xterm
fi
だからモニターとマウスを接続して実行してみるとうまくいきましたね。
私はこれをヘッドレスで実行し、crontabでスクリプトを使用したいと思います。 2日間試した後は、ただ円を描いて行っているように感じられます。
問題は、新しいxtermセッションとxdotoolの両方を実行するにはDISPLAYを定義する必要があることです。
そのために、シミュレートされたディスプレイを生成するxvfbをインストールしました。
sudo Xvfb :10 -ac -screen 0 1024x768x24
DISPLAY=:10 xterm & (the script from above)
エラーなしで実行されますが、機能しません。
私が実行した場合:
sudo Xvfb :10 -ac -screen 0 1024x768x24
DISPLAY=:10 xterm -e "echo 'deb blah ... blah' | sudo tee -a /CronJobs/yap.txt > /dev/null"
ファイルにエコーを追加することで、私のモニターがxtermセッションを実行していることがわかり、エミュレートされたモニターとxtermセッションの両方が正しく機能していると結論付けることができます。
私がするなら:
sudo Xvfb :10 -ac -screen 0 1024x768x24
DISPLAY=:10 xterm &
DISPLAY=:10 xdotool type "sudo echo 'deb blah ... blah' | sudo tee -a /CronJobs/yap.txt > /dev/null"
DISPLAY=:10 xdotool key Return
これはうまくいきません。
要約すると、xdotoolは機能しますが(エラーなし)何もしません!
だから私はウィンドウが選択されていないので、xdotoolがxterm端末に入らないと思い、xtermウィンドウを選択しようとしましたが、次のような結果が出ました.
DISPLAY=:10 xdotool getactivewindow
Your windowmanager claims not to support _NET_ACTIVE_WINDOW, so the attempt to query the active window aborted.
xdo_get_active_window reported an error
現時点では、私のプロジェクトがあまりにもユニークで何をすべきかについての良い提案を見つけることができません。 windowmanagerをXvfdに置き換えようとしたが、その回数は非常に少なかった。
簡単に言うと:
Xvfdが実際のモニタのようにうまく機能するようにするにはどうすればよいですか?
Linuxでは、すべてのDISPLAY変数とウィンドウマネージャを忘れ、無条件に通常のユーザーとしてスクリプトを実行できますか?どのように?
xdotoolを使用しないように、よりスマートな方法でログインシーケンスを自動化できますか?
私のネットワークはプライベートで、ラズベリーパイのセキュリティを損なう可能性があるソリューションには問題がないので、xhostなどを無効にしても大丈夫でしょう。どうやって何がわかりません。
よろしくお願いします。
答え1
私はFosforoが私に問題に対するいくつかの解決策を試すようにインスピレーションを与えたので、私自身の質問に答えています。
現在アクティブなプログラムスイートを使用すると、ウィンドウの操作xvfb
には使用できませんxdotool
。
xdotool
それでも情報を入手できます。たとえば、次を実行してxtermウィンドウのPIDを見つけることができます。
DISPLAY=:10 xdotool search --name "xterm"
あなたの場合、アクティブなxtermセッションのPIDは2097165です。
通常、次のようにウィンドウをアクティブにできます。
DISPLAY=:10 xdotool windowactivate 2097165
しかし、これを実行すると、xvfb
次のエラーが返されます。
Your windowmanager claims not to support _NET_ACTIVE_WINDOW, so the attempt to activate the window was aborted.
xdo_activate_window on window:2097165 reported an error
したがって、フォーカスを積極的に操作することはできません。DISPLAY
次のコマンドを実行してデフォルトのフォーカスを見つけることができます。
DISPLAY=:10 xdpyinfo | grep focus
これにより、次の通知が送信されます。
focus: PointerRoot
フォーカスは、PointerRoot
入力したすべての内容がカーソル付きのウィンドウに入力されることを意味します。
以前のPIDでは、次のコマンドを実行してxtermウィンドウの位置とサイズをすばやく見つけることができます。
DISPLAY=:10 xwininfo -id 2097165
これは次のことを伝えます。
Absolute upper-left X: 0
Absolute upper-left Y: 0
Relative upper-left X: 0
Relative upper-left Y: 0
Width: 484
Height: 316
...
以下を使用して、xdotool
同様にマウスの位置を取得できます。
DISPLAY=:10 xdotool getmouselocation
これはマウスの位置がどこにあるかを知らせます。
x:512 y:384 screen:0 window:904
つまり、マウスがxtermウィンドウの上にないため、xdotoolタイプを使用して入力した内容はxtermウィンドウに表示されません。
2つの非常に単純な解決策があります。
- マウスの移動
- xtermウィンドウを大きくする
2番目のオプションは、起動時に画面の解像度を知って制御できるため、xvfb
最も簡単です。
-geometry
xtermの起動パラメータを追加すると、次のようになります。
sudo Xvfb :10 -ac -screen 0 1024x768x24
DISPLAY=:10 xterm -geometry 1024x768+0+0 &
これにより、xtermウィンドウがフルサイズで表示され、マウスがウィンドウの上にあり、キーやxdotool
タイプなどのコマンドが機能していることが確認されます。
-geometry
つまり、xtermにパラメータを追加することはあなたの質問に答えることです。
答え2
getwindowname
これを使ってデバッグしてみてください。
xdotool search --onlyvisible --name 'TITLE_YOUR_WINDOW' getwindowname
そしてファイルに出力します。
一部のメインウィンドウマネージャはこれを許可しますgetwindowname
が、許可しませんgetactivewindow
。
2番目のオプションはvncserverを使用することです。自動化されたタスクを実行するヘッドレスデスクトップに適しています。長年にわたってその仕事をしてきました。