Expect Script - 修复奇怪的终端大小调整行为
Expect Script - Fixing weird terminal resizing behaviour
我写了一个小的 expect 脚本来连接到多个 SSH 服务器。
但是,如果我 interact
在初始化连接后使用终端,终端 window 表现得很奇怪。
例如,如果我在非全尺寸终端中启动脚本,并调整 window 的大小使其变大 在 Interact
之后,看起来像这样:
现在,我的第一个 expect 脚本中也遇到了这个问题。但我能够通过添加以下代码来解决它:
trap {
set XZ [stty rows ]
set YZ [stty columns]
stty rows $XZ columns $YZ < $spawn_out(slave,name)
} WINCH
这工作得很好!我能够毫无问题地调整终端的大小。
但是,我将这段代码添加到我的新脚本中,其中有多个 interact
在不同的 proc
(函数)中。在 window 调整大小时,出现以下错误:
can't read "spawn_out(slave,name)": no such variable
while executing
"stty rows $XZ columns $YZ < $spawn_out(slave,name)"
我不知道如何解决这个问题。这是我的代码:
#!/usr/bin/expect -f
set SERVER "0"
set CHOICE "0"
set SERVER_1_PKEY [exec cat /home/me/p1]
set SERVER_2_PKEY [exec cat /home/me/p2]
set SERVER_1_HOST "server1.com"
set SERVER_2_HOST "server2.com"
set SERVER_1_USER "server1user"
set SERVER_2_USER "server2user"
set SERVER_1_PORT "22"
set SERVER_2_PORT "22"
trap {
set XZ [stty rows ]
set YZ [stty columns]
stty rows $XZ columns $YZ < $spawn_out(slave,name)
} WINCH
proc s1 {SERVER_1_PKEY SERVER_1_HOST SERVER_1_USER SERVER_1_PORT} {
send_user "3c"
spawn ssh ${SERVER_1_USER}@${SERVER_1_HOST} -p ${SERVER_1_PORT}
expect "assword:"
send "${SERVER_1_PKEY}\r"
interact
}
proc s2 {} {
send_user "3c"
spawn ssh ${SERVER_2_USER}@${SERVER_2_HOST} -p ${SERVER_2_PORT}
expect "assword:"
send "${SERVER_2_PKEY}\r"
interact
}
set arg [lindex $argv 0]
switch $arg {
"" { set CHOICE "0" }
"1" { set CHOICE "1" }
"2" { set CHOICE "2" }
}
if {$CHOICE eq "0"} {
puts -nonewline " Input \[1,2\]: "
flush stdout
gets stdin SERVER
if {$SERVER eq "1"} { s1 $SERVER_1_PKEY $SERVER_1_HOST $SERVER_1_USER $SERVER_1_PORT }
if {$SERVER eq "2"} { s2 $SERVER_2_PKEY $SERVER_2_HOST $SERVER_2_USER $SERVER_2_PORT }
}
if {$CHOICE eq "1"} { s1 $SERVER_1_PKEY $SERVER_1_HOST $SERVER_1_USER $SERVER_1_PORT }
if {$CHOICE eq "2"} { s2 $SERVER_2_PKEY $SERVER_2_HOST $SERVER_2_USER $SERVER_2_PORT }
任何人都可以帮我解决这个问题或告诉我我缺少什么吗?
当您在过程中调用 spawn 时,数组变量 spawn_out(slave,name)
仅具有该过程的范围。通常,您可以通过在每个过程中将其声明为全局范围来使其成为全局范围:
proc s1 {...} {
global spawn_out
...
spawn ...
}
send_user $spawn_out(slave,name)
我写了一个小的 expect 脚本来连接到多个 SSH 服务器。
但是,如果我 interact
在初始化连接后使用终端,终端 window 表现得很奇怪。
例如,如果我在非全尺寸终端中启动脚本,并调整 window 的大小使其变大 在 Interact
之后,看起来像这样:
现在,我的第一个 expect 脚本中也遇到了这个问题。但我能够通过添加以下代码来解决它:
trap {
set XZ [stty rows ]
set YZ [stty columns]
stty rows $XZ columns $YZ < $spawn_out(slave,name)
} WINCH
这工作得很好!我能够毫无问题地调整终端的大小。
但是,我将这段代码添加到我的新脚本中,其中有多个 interact
在不同的 proc
(函数)中。在 window 调整大小时,出现以下错误:
can't read "spawn_out(slave,name)": no such variable
while executing
"stty rows $XZ columns $YZ < $spawn_out(slave,name)"
我不知道如何解决这个问题。这是我的代码:
#!/usr/bin/expect -f
set SERVER "0"
set CHOICE "0"
set SERVER_1_PKEY [exec cat /home/me/p1]
set SERVER_2_PKEY [exec cat /home/me/p2]
set SERVER_1_HOST "server1.com"
set SERVER_2_HOST "server2.com"
set SERVER_1_USER "server1user"
set SERVER_2_USER "server2user"
set SERVER_1_PORT "22"
set SERVER_2_PORT "22"
trap {
set XZ [stty rows ]
set YZ [stty columns]
stty rows $XZ columns $YZ < $spawn_out(slave,name)
} WINCH
proc s1 {SERVER_1_PKEY SERVER_1_HOST SERVER_1_USER SERVER_1_PORT} {
send_user "3c"
spawn ssh ${SERVER_1_USER}@${SERVER_1_HOST} -p ${SERVER_1_PORT}
expect "assword:"
send "${SERVER_1_PKEY}\r"
interact
}
proc s2 {} {
send_user "3c"
spawn ssh ${SERVER_2_USER}@${SERVER_2_HOST} -p ${SERVER_2_PORT}
expect "assword:"
send "${SERVER_2_PKEY}\r"
interact
}
set arg [lindex $argv 0]
switch $arg {
"" { set CHOICE "0" }
"1" { set CHOICE "1" }
"2" { set CHOICE "2" }
}
if {$CHOICE eq "0"} {
puts -nonewline " Input \[1,2\]: "
flush stdout
gets stdin SERVER
if {$SERVER eq "1"} { s1 $SERVER_1_PKEY $SERVER_1_HOST $SERVER_1_USER $SERVER_1_PORT }
if {$SERVER eq "2"} { s2 $SERVER_2_PKEY $SERVER_2_HOST $SERVER_2_USER $SERVER_2_PORT }
}
if {$CHOICE eq "1"} { s1 $SERVER_1_PKEY $SERVER_1_HOST $SERVER_1_USER $SERVER_1_PORT }
if {$CHOICE eq "2"} { s2 $SERVER_2_PKEY $SERVER_2_HOST $SERVER_2_USER $SERVER_2_PORT }
任何人都可以帮我解决这个问题或告诉我我缺少什么吗?
当您在过程中调用 spawn 时,数组变量 spawn_out(slave,name)
仅具有该过程的范围。通常,您可以通过在每个过程中将其声明为全局范围来使其成为全局范围:
proc s1 {...} {
global spawn_out
...
spawn ...
}
send_user $spawn_out(slave,name)