2016-03-06 63 views
0

變量替換我需要與期望的腳本運行這個CMD:防止預計對遠程shell命令

echo users.1.password=`grep %user% /etc/passwd | awk -F: '{print $2}'` >> /tmp/system.cfg.new 

但它的錯誤了,因爲$ 2吧。我該如何解決?我需要該變量只對我發送cmd的設備可見。

這裏是通過腳本上UBNT設備密碼更改的完整的腳本(通過SSH的作品,而不是作爲腳本,因爲2 $):

#!/usr/bin/expect 
    set timeout 30 
    #Edit for User 
    set user user 
    #Edit for Old Password 
    set old oldpassword 
    #Edit for New Password 
    set new newpassword 
    #get IP List from iplist.txt 
    set f [open "/iplist.txt"] 
    set data [read $f] 
    close $f 

    foreach line [split $data \n] { 
      if {$line eq {}} continue 
      spawn ssh [email protected]$line 
      expect { 
        "assword:" { 
          send "$old\r" 
          expect { 
            "assword:" { 
                close 
                continue 
                }} 
          expect { 
            "*" { 
              send "passwd $user\r" 
              expect "assword:" 
              send "$new\r" 
              expect "assword:" 
              send "$new\r" 
              expect "*" 
              send "grep -v users.1.password= /tmp/system.cfg > /tmp/system.cfg.new\r" 
              expect "*" 
              send "echo users.1.password=`grep $user /etc/passwd | awk -F: '{print $2}'` >> /tmp/system.cfg.new\r" 
              expect "*" 
              send "cp /tmp/system.cfg.new /tmp/system.cfg\r" 
              expect "*" 
              send "save && reboot\r" 
              close 
              continue 
              }}}} 
      expect { 
        "*" { 
          close 
          continue 
          }} 
      expect eof 
    } 
+0

登錄後到SSH,你想在遠程shell執行這個命令? – Dinesh

+0

正確。 %user%實際上被替換爲$ user作爲期望變量,但是我需要打印$ 2才能被遠程shell看到。一直在研究這個腳本,這是唯一的事情(至少我認爲這是直到我得到一個新的錯誤信息),這是阻止我的工作。 –

+0

我加了完整的代碼 –

回答

0

你只需要轉義反斜線美元符號。

send "echo users.1.password=`grep $user /etc/passwd | awk -F: '{print \$2}'` >> /tmp/system.cfg.new\r" 

順便說一句,使用expect *可能是dangerous,而不是一個推薦一個,除非讀需要它。

你可以使用一個通用的方法爲匹配提示符,

set prompt "#|%|>|\\\$ $" 

在這裏,我們躲過了字面上的美元符號反斜線和最後一塊錢是爲結束線的常規表達。

發送任何命令來遠程shell後,您可以expect的圖案

expect -re $prompt 
+0

修復了錯誤信息。我使用「*」來強制超時,因爲睡眠似乎沒有辦法。該腳本完美(當然編輯)爲Mikrotiks,但似乎仍然重新輸入密碼:並關閉連接。你有什麼想法嗎? –

+0

我仍然對$/2之後的腳本有什麼問題感到茫然。當提示輸入新密碼時,它會轉到iplist.txt中的新IP:該密碼需要「assword:」應該處理。即使改變所有期望的睡眠也不會這樣做。你能告訴我我的代碼還有什麼問題嗎? –

+0

我取消選擇解決方案只是因爲它仍然在這條線上出錯。它修復了第一個錯誤,但實際上並不允許遠程shell使用它。 cmd工作正常,如果我真的ssh進入設​​備並手動運行而不期望腳本。我做了一些檢查,這仍然是錯誤,只是與一個不同的錯誤。它完成了這條線以上的所有操作,所以抓住遠程shell中的變量仍然是錯誤的。 –