2013-05-20 38 views
2

我有一个脚本,我用它来发送多个命令使用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 
} 

下面是呼应以及远程登录的响应;注意它被切断的地方......奇怪!

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 
+0

有'的迹象\ r \ n'对和空白问题。你可以发表一些你的'grep'命令输出的行吗? – chepner

+0

您可能还想查看['expect'](http://www.nist.gov/el/msid/expect.cfm)实用程序。 – chepner

+0

@chepner Telnet完全在线上处理\ r \ n,它应该理解与回显在输出中一定使用的(键盘)输入相同的换行符? – EJP

回答

0

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

无论剩下的问题是什么,我相信他们存在,我怀疑他们与你的头衔有什么关系。你的问题其实只是关于脚本。

+0

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

+0

谢谢....我确定有!因此发布这个问题的原因。 – user2340495

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 
}