期待脚本切割/中继线

问题描述

我正在运行一个脚本,该脚本连接到一些 unix 服务器并获取信息列表,但是我发现所收集的信息的某些部分被 spawn 命令剪切/截断:

例如:

U2107.D02.RJ02DBH-P1-D20         7  node2     RJ02DBH 1          544C01        active U2107.D02 
U2107.D02.RJ02DBH-P1-D20         1  node1     RJ02DBH 2          558B01        active U2107.D02              
U2107.D02.RJ02DBH-P1-D20         7  node2     RJ02DBH 2          554C02        active U2107.D02              
spawn sh lscardscript.sh      1  node1      RJ0
The authenticity of host 'x.x.x.x (x.x.x.x)' can't be established.
ECDSA key fingerprint is SHA256:i0CmsCsxkjdsahjdajhdsajhfhxxxxiAg.

在上面的示例中,文本 spawn sh lscardscript.sh 不应该在那里,并且会导致一行被截断。然后脚本尝试连接到下一个 IP,有时行在下一个 IP 上被截断,有时没有。

这是我的代码

/usr/bin/expect <<'END_EXPECT'

    set timeout -1
    sleep 1
    send \r
    spawn sh lscardscript.sh
    expect "yes" { send "yes\r"}
    expect {
        -nocase "*assword*" {
            send "$env(PASSWORD)\r"
            exp_continue
        }
        eof
    }

我已经尝试了很多东西,但仍然看到相同的行为,有人知道吗?

解决方法

您的命令 send \r(CR = 回车)要求“输出光标”返回到行首。这就是为什么文本“spawn sh lscardscript.sh”会覆盖最后的输出行。

您可能应该发送 \n(LF = 换行符)或 \r\n\n 将导致“输出光标”转到下一行,这将保留已经写入的文本。

当然,这个\n不能干扰对方期望收到的东西,但我们对此一无所知。

,

我能够解决这个问题...我在脚本中添加了以下行。所以它会运行我需要的命令,获取输出并等待 2 秒钟,然后再调用下一个命令。

echo "sleep 2" >> lscardscript.sh