我正在尝试在 SSH 会话中调整终端大小,该会话是由 Expect 生成的,而 Expect 是由 bash 生成的。
#!/bin/bash
...
SSH_PASS=XXXXX
SSH_ADDR=YYYYY
expect <(cat << EOD
trap {
set rows [stty rows]
set cols [stty columns]
stty rows $rows columns $cols < $spawn_out(slave,name)
} WINCH
spawn ssh $SSH_ADDR
expect "Password:"
send -- "${SSH_PASS}\n"
interact
EOD
)
当终端调整大小时,我收到类似的消息
couldn't open (slave,name): no such file or directory
while executing
"stty rows columns < (slave,name)"
所以,我假设由
$spawn_out(slave,name)
创建的 var expect
在内部不可见。如何才能实现呢?我试过了
global spawn_out
但这没有帮助。
提前致谢!
PS:我不能在这里使用 SSH 密钥,这是我无法绕过的限制。
您需要的是转义 $
中的
some,以便它们扩展为
expect
而不是 bash
:
SSH_PASS=XXXXX
SSH_ADDR=YYYYY
expect <(cat << EOD
trap {
set rows [stty rows]
set cols [stty columns]
stty rows \$rows columns \$cols < \$spawn_out(slave,name)
} WINCH
spawn ssh $SSH_ADDR
expect "Password:"
send -- "${SSH_PASS}\n"
interact
EOD
)
请注意,
$SSH_ADDR
是正常书写的,因为您希望 bash 插入该变量。但是 rows
、cols
和 spawn_out
的插值被延迟,以便 Expect 可以进行变量评估。
这个问题是因为
$
需要在正确的点展开。当您在 $rows
中写入 expect <(
时,它会在解析时扩展。所以传递给 expect
的代码类似于
trap {
set rows [stty rows]
set cols [stty columns]
stty rows "" columns "" < ""(slave,name)
} WINCH
spawn ssh XXXXX
expect "Password:"
send -- "YYYYY\n"
interact
因为
rows
在脚本中未定义,并在解析时扩展。
我遇到了同样的问题,这就是我解决的方法。通过此更改,它可以完美运行。