bash - Expect Script - 修复奇怪的终端大小调整行为

标签 bash shell terminal tcl expect

我写了一个小的 expect 脚本来连接到多个 SSH 服务器。 但是,如果我在初始化连接后与终端交互,终端窗口的行为会很奇怪。

例如,如果我在非全尺寸终端中启动脚本,并在 Interact 之后调整窗口大小以使其变大,它看起来像这样:

Weird Terminal Preview

现在,我在第一个 expect 脚本中也遇到了这个问题。但我能够通过添加以下代码来解决它:

trap {
    set XZ [stty rows   ]
    set YZ [stty columns]
    stty rows $XZ columns $YZ < $spawn_out(slave,name)
} WINCH

这工作得很好!我能够毫无问题地调整终端的大小。

但是,我将这段代码添加到我的新脚本中,其中在不同的proc(函数)中有多个interact。在窗口调整大小时,出现以下错误:

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 "\033c"
    spawn ssh ${SERVER_1_USER}@${SERVER_1_HOST} -p ${SERVER_1_PORT}
    expect "assword:"
    send "${SERVER_1_PKEY}\r"
    interact
}

proc s2 {} {
    send_user "\033c"
    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)

关于bash - Expect Script - 修复奇怪的终端大小调整行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45454452/

相关文章:

linux - 比较/区分具有不同行终止符的两个文件

在程序c中捕获shell脚本输出

linux - 如何在后台运行ionic

string - 如何使用 Bash 测试文件中是否存在字符串?

linux - 从下面的 Shell 脚本中查找哪个文件有问题

arrays - bash:意外的数组成员句柄

linux - 用名称杀死随机进程

linux - 如何在 Bash 的算术表达式中使用字符串

Android SH 外壳脚本

macos - Mac OS X/打开具有指定窗口的终端