问题描述
我正在运行一个脚本,该脚本连接到一些 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