期望 bash 中的脚本并调整终端大小

问题描述 投票:0回答:1

我正在尝试在 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 密钥,这是我无法绕过的限制。

bash resize expect
1个回答
0
投票

您需要的是转义 $ 中的

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
在脚本中未定义,并在解析时扩展。

我遇到了同样的问题,这就是我解决的方法。通过此更改,它可以完美运行。

© www.soinside.com 2019 - 2024. All rights reserved.