인터넷 페이지에서 헤드리스 스크립트 실행 프로그램을 실행하기 위해 텍스트 브라우저를 사용하는 Raspbian

인터넷 페이지에서 헤드리스 스크립트 실행 프로그램을 실행하기 위해 텍스트 브라우저를 사용하는 Raspbian

저는 새로운 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 창에 표시되지 않습니다.

두 가지 매우 간단한 솔루션이 존재합니다.

  • 마우스 이동
  • xterm 창을 더 크게 만드십시오.

두 번째 옵션은 시작 시 화면 해상도를 알고 제어할 수 있으므로 xvfb가장 쉽습니다 .

-geometryxterm의 시작 매개변수를 추가하면 다음과 같이 됩니다:

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.

두 번째 옵션은 vncserver를 사용하는 것입니다. 자동화된 작업을 수행하는 헤드리스 데스크탑에 적합합니다. 수년 동안 그 일을 해왔습니다.

관련 정보