Linux 在telnet会话中使用变量

Linux 在telnet会话中使用变量,linux,bash,telnet,Linux,Bash,Telnet,我有一个脚本,用于使用telnet会话发送多个命令。我不确定我是否需要转义字符。如果我直接在telnet会话中键入该命令,它就会工作,并得到预期的响应。但是,当我把它放在脚本中时,它不起作用 而真正奇怪的是,我把其中一个命令放在了echo中,我从telnet提示符中得到了相同的命令……这让我相信我需要逃避某些字符,但这一直是我的问题 我尝试过使用sleep命令,但是这似乎并没有改变任何事情 以下是片段: pushSAT() { #This is what the command shou

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

而真正奇怪的是,我把其中一个命令放在了echo中,我从telnet提示符中得到了相同的命令……这让我相信我需要逃避某些字符,但这一直是我的问题

我尝试过使用sleep命令,但是这似乎并没有改变任何事情

以下是片段:

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
}
问题就在这里,;为什么会被切断

这就是我对失败的命令的期望:

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

^]表示控制/]。您发送的信息不正确。将其作为文本“^]”发送将不起作用。所以注销可能永远不会发生


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

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

变化

  • 使用
    while
    循环从
    grep
    的输出一次读取一行
  • 删除了分号(它们没有伤害任何东西,但它们是不必要的)
  • 使用printf打印一个适当的控制字符来代替文字字符串“^]”
  • 还有一个问题:如果您的输入文件有DOS行结尾,您需要使用类似于
    dos2unix
    的程序删除它们,因为
    read
    命令不会删除它们


    pushSAT(){
    #这是命令的外观:
    #EPHM:FPSH、卫星、星历代码、文件名、命令动作
    主机=$1
    grep'O3B_M*'“$DIR/$FILE2ACU”|而read-r行;
    做
    回音“$line”
    echo“EPHM:FPSH,$line,202,$FILE2ACU,@”
    (睡眠2
    echo“EPHM:FPSH,$line,202,$FILE2ACU,@”
    睡眠1
    回声“TGTS:FLST,?”
    睡眠1
    printf“\035\n”
    睡眠1
    回显“注销”
    )| telnet$HOST 6100 | tee acurresponse.txt
    log user.info“为$line将$FILE2ACU推送到$HOST。”
    完成
    }
    
    有迹象表明
    \r\n
    -配对和空白问题。您可以发布几行将由
    grep
    命令输出的内容吗?您可能还需要查看该实用程序。@chepner Telnet完全负责\r\n线路,它应该理解与(键盘)相同的换行符echo在输出时使用的输入肯定吗?我不太担心
    telnet
    ,我更担心的是为
    SATS
    阵列提供数据的文件的内容。我当时的印象是,
    加载卫星….
    等来自第一对
    echo
    语句,而不是输出通过管道传输到
    telnet
    的语句>@chepner是的,我明白了,在$I里面有一条流氓新线。这是一个问题,但可能不是唯一的问题。
    Connected to ant-3-acu (ip).
    Escape character is '^]'.
    EPHM:FPSH,O3B_M001,202,ephemeris.txt,@
    ephm:fpsh,0,0
    
    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
    }