2

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

真正奇怪的部分是我已经将其中一个命令放在 echo 中,我得到的结果与我从 telnet 提示符中所做的一样......这让我相信我需要转义一些字符,但这一直是我的问题。

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

这是片段:

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
4

2 回答 2

0

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

变化

  1. 使用while循环从 的输出中一次读取一行grep
  2. 删除了分号(它们没有伤害任何东西,但它们是不必要的
  3. 使用 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
}
于 2013-05-21T12:20:30.313 回答
0

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

不管剩下的问题是什么,我确信它们存在,我怀疑它们与你的头衔有什么关系。您的问题实际上只是关于脚本。

于 2013-05-20T23:04:10.923 回答