2013-05-20 59 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 
}