autoexpectで生成された次のスクリプトを使用します。コマンドラインで使用すると、このコマンドはsudo surfshark-vpn multi
約15行のリストを提供し、次のようにユーザーに要求しますnumber
。
ただし、起動時にExpectスクリプトを使用すると、この15行が1行になり、各行Enter
に要求されます。
なぜこれが起こるのか知りたいです。どういうわけか、コマンドはシェルに1行しかないと思います。
$ 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"