在 telnet 会话中使用变量

Posted

技术标签:

【中文标题】在 telnet 会话中使用变量【英文标题】:using variables within a telnet session 【发布时间】:2013-05-15 13:48:21 【问题描述】:

我有一个脚本,用于通过 telnet 会话发送多个命令。我不确定是否需要转义字符。如果我直接在 telnet 会话中键入命令,它会起作用并且我会得到预期的响应。但是,当我将它放在脚本中时,它不起作用。

真正奇怪的是,我将其中一个命令放入了 echo 中,得到的结果与从 telnet 提示符中得到的结果相同……这让我相信我需要转义某些字符,但是一直是我的问题。

我尝试过使用睡眠命令,但这似乎并没有改变任何东西......

这是sn-p:

pushSAT() 
    #This is what the command should look like:
    #EPHM:FPSH,satellite,ephemeris_code,file_name,cmd_action<cr><lf>

    HOST=$1
    SATS=( $(grep O3B_M* $DIR/$FILE2ACU) )

    for i in "$SATS[@]"
    do
       echo "$i"
       echo "EPHM:FPSH,$i,202,$FILE2ACU,@"; 
       (sleep 2
        echo "EPHM:FPSH,$i,202,$FILE2ACU,@";
        sleep 1
        echo "TGTS:FLST,?";
        sleep 1
        echo "^]";
        sleep 1
        echo "logout";
       ) | telnet $HOST 6100 | tee acuresponse.txt

       log user.info "Pushed $FILE2ACU to $HOST for $i."
    done

这是来自 echo 和 telnet 的响应;注意它被切断的地方......奇怪!

Loading satellites to ant-3-acu
O3B_M001
,202,ephemeris.txt,@"

这就是问题所在;为什么会被切断?

而且,这是我对失败的命令的期望:

Connected to ant-3-acu (ip).
Escape character is '^]'.
EPHM:FPSH,O3B_M001,202,ephemeris.txt,@
ephm:fpsh,0,0

【问题讨论】:

\r\n-pair 和空白问题的迹象。您能否发布几行将由您的 grep 命令输出的行? 您可能还想查看expect 实用程序。 @chepner Telnet 完全处理线路上的 \r\n,它应该理解与 echo 在输出中使用的(键盘)输入相同的换行符吗? 我不太担心telnet,而是担心提供SATS 数组的文件的内容。我的印象是Loading satellites.... et al 来自第一对echo 语句,而不是输出通过管道传送到telnet 的语句。 @chepner 是的,我明白了,$i 中有一个流氓换行符。 【参考方案1】:

这可能无法解决所有问题,但这将是一个开始。由于您的输入文件有空格,因此您需要更改读取方式。

变化

    使用while 循环从grep 的输出中一次读取一行。 删除了分号(它们没有伤害任何东西,但它们是不必要的 使用 printf 打印适当的控制字符来代替文字字符串“^]”

另一个问题:如果您的输入文件有 DOS 行结尾,您需要使用类似 dos2unix 的程序删除它们,因为它们不会被 read 命令删除。


pushSAT() 
    #This is what the command should look like:
    #EPHM:FPSH,satellite,ephemeris_code,file_name,cmd_action<cr><lf>

    HOST=$1
    grep 'O3B_M*' "$DIR/$FILE2ACU" | while read -r line;
    do
       echo "$line"
       echo "EPHM:FPSH,$line,202,$FILE2ACU,@"
       (sleep 2
        echo "EPHM:FPSH,$line,202,$FILE2ACU,@"
        sleep 1
        echo "TGTS:FLST,?"
        sleep 1
        printf "\035\n"
        sleep 1
        echo "logout"
       ) | telnet $HOST 6100 | tee acuresponse.txt

       log user.info "Pushed $FILE2ACU to $HOST for $line."
    done

【讨论】:

【参考方案2】:

^] 表示控制/]。你没有正确发送。将其作为文字“^]”发送将不起作用。所以注销可能永远不会发生。

无论剩下的问题是什么,而且我确信它们存在,我怀疑它们与您的标题有任何关系。您的问题实际上只是关于脚本。

【讨论】:

这是一个,但可能不是唯一的问题。

以上是关于在 telnet 会话中使用变量的主要内容,如果未能解决你的问题,请参考以下文章

在 python 中访问 telnet 会话

如何在 C# 程序中打开 Telnet 会话并以编程方式发送命令和接收响应?

如何检查 Net::Telnet 会话是不是仍在 Perl 中?

当我在脚本中使用它时,无法关闭带有 echo "^]" 的 scpi(telnet) 会话

使用Python 2.7打开用户指定的文件以在Telnet会话中使用

从 Windows cmd 向 telnet 会话日志的每一行添加时间戳