autoexpect를 통해 생성된 다음 스크립트를 사용합니다. 명령줄에서 사용할 경우 이 명령은 sudo surfshark-vpn multi
약 15줄의 목록을 제공한 다음 사용자에게 다음을 요청합니다 number
.
그러나 시작할 때 Expect 스크립트를 사용하면 이 15줄이 한 줄이 되어 Enter
각 줄마다 요청됩니다.
왜 이런 일이 발생하는지 알고 싶습니다. 어떻게 든 명령은 쉘에 한 줄만 있다고 생각하는 것 같습니다.
$ cat startsurfshark.sh
#!/usr/bin/expect -f
#
# This Expect script was generated by autoexpect on Sat Dec 12 15:36:12 2020
set force_conservative 0 ;# set to 1 to force conservative mode even if
;# script wasn't run conservatively originally
if {$force_conservative} {
set send_slow {1 .1}
proc send {ignore arg} {
sleep .1
exp_send -s -- $arg
}
}
set timeout -1
log_file /home/USER/startshark.log
spawn $env(SHELL)
match_max 100000
send -- "sudo surfshark-vpn multi\r"
expect -exact "\[sudo\] Passwort for USER: "
send -- "PASSWORD"
expect -exact "press enter for next page"
send -- "\r"
expect -exact "press enter for next page"
send -- "\r"
expect -exact "press enter for next page"
send -- "\r"
expect -exact "press enter for next page"
send -- "\r"
# ... in here should be a lot more
# ... it then should continou like this
expect -exact "Enter a number to select the location\r"
send -- "2\r"
expect -exact "\r
Enter a number to select the VPN connection type. For default UDP, press ENTER\r
0 TCP\r
1 UDP\r
1 selected\r
"
send -- "\r"
expect -exact "\r
Checking for connection status...\r"
sleep 15
send -- "exit"
아래 양식에 수동으로 몇 개의 행을 추가했습니다. 이것이 내가 이상한 행동을 발견한 방법입니다:
expect -exact "press enter for next page"
send -- "\r"
또한 다른 명령은 목록이 모니터 크기에 비해 너무 크더라도 사용자가 볼 수 있도록 모니터에 남아 있으려는 목록을 인쇄하지 않기 때문에 attack
제대로 작동하지 않고 이 스크립트를 사용할 수 있습니다 .multi
내 로그 파일의 출력은 다음과 같습니다.
$ cat ../startshark.log
spawn /bin/bash
sudo surfshark-vpn multi
~ - 21:19:10 - ben - [email protected] Mo Dez 14
$ sudo surfshark-vpn multi
[sudo] Passwort für ben:
press enter for next page
0 France Paris
press enter for next page
1 Germany Frankfurt am Main
press enter for next page
2 Hong Kong Hong Kong
press enter for next page
3 India Chennai
시작 시가 아닌 터미널에서 스크립트를 수동으로 실행하면 다음과 같은 목록이 표시됩니다.
0 France Paris
1 Germany Frankfurt am Main
2 Hong Kong Hong Kong
3 India Chennai
4 Netherlands Amsterdam
5 Netherlands Amsterdam
6 Portugal Loule
7 Singapore Singapore
8 Sweden Stockholm
9 United Kingdom Manchester
10 United Kingdom London
11 United States San Francisco
12 United States Dallas
13 United States New York
Enter a number to select the location
while 루프를 사용하여 목록 끝까지 Enter를 누를 수도 있습니다. 어떻게 해야 하나요?
답변1
spawn ...
in 작업을 수행하면 expect
프로그램이 실행 중인 현재 tty의 설정을 상속하는 pty 터미널이 생성됩니다.
따라서 예를 들어 24줄이 있는 터미널에서 스크립트를 테스트할 때 VPN 프로그램은 이를 확인하고 적절하게 상호 작용하여 출력 24줄마다 입력하라는 메시지를 표시합니다.
예를 들어, 이제 시스템 장치에서 스크립트를 실행하면 설정을 상속할 tty가 없으며 행과 열의 수는 기본적으로 0으로 설정됩니다. 따라서 VPN 프로그램은 다르게 동작합니다.
해결책은 실행하기 전에 필요한 행과 열 수를 명시적으로 설정하는 것입니다 spawn
. 이는 expect
다음 행 앞에 변수를 설정하여 수행됩니다 spawn ...
.
set stty_init "rows 24 cols 80"
rows 999
모든 페이지 프롬프트를 설정하고 방지할 수도 있습니다 .
답변2
부팅/비부팅 차이점을 이해하지 못합니다.
그러나 "Enter 키 누르기" 작업을 반복하는 방법은 다음과 같습니다.
expect {
-exact "press enter for next page" {
send -- "\r"
exp_continue
}
-exact "Enter a number to select the location\r"
}
send -- "2\r"