在telnet会话中使用变量

时间:2013-05-20 22:00:36

标签: linux bash telnet

我有一个脚本,用于使用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

2 个答案:

答案 0 :(得分:0)

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

无论剩下的问题是什么,我确信它们存在,我怀疑它们与你的头衔有什么关系。你的问题实际上就是编写脚本。

答案 1 :(得分:0)

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

更改

  1. 使用while循环从grep的输出一次读取一行。
  2. 删除了分号(它们没有伤害任何东西,但它们是不必要的
  3. 使用printf打印正确的控制字符代替文字字符串“^]”
  4. 另一个问题:如果您的输入文件有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
    }