Shell-Script

在啟動時使用期望腳本時,行列表的輸出會縮短。如何在啟動時增加期望或終端的緩衝區?

  • December 15, 2020

我使用以下通過 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 - ZOTAC@192.168.100.91 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 直到列表結束。我該怎麼做?

當您執行spawn ...in 時expect,它會創建一個 pty 終端,該終端繼承程序正在執行的目前 tty 的設置。

因此,當在終端中測試腳本時,例如,24 行(行),vpn 程序將看到這一點並進行適當的互動,每 24 行輸出提示輸入。

例如,如果您現在從 systemd 單元執行腳本,則沒有可從其繼承設置的 tty,並且行數和列數預設為 0。因此 vpn 程序的行為不同。

解決方案是在執行spawn. 這expect是通過spawn ...在行前設置一個變數來完成的:

set stty_init "rows 24 cols 80"

您甚至可以設置rows 999和避免所有頁面提示。

引用自:https://unix.stackexchange.com/questions/624475