起動時に予想されるスクリプトを使用すると、行リストの出力が短くなります。起動時に予想または端末のバッファをどのように増やすことができますか?

起動時に予想されるスクリプトを使用すると、行リストの出力が短くなります。起動時に予想または端末のバッファをどのように増やすことができますか?

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"

関連情報