2014-04-01 165 views
-1

我在bash上很糟糕,我嘗試使用openSSH將腳本連接到所有交換機,以便進行一些配置。Shebang導致腳本失敗

我創建了一個包含我所有25個交換機的數組,然後我用一個循環來打開每個人的SSH連接。

因爲我在Windows上並使用bash,所以我剛剛安裝了Cygwin。

但是,我不得不用純文本來使用expect和寫密碼,因爲交換機很差,這對我來說是最好的方式(我不會手動將RSA密鑰放在每臺交換機上,因爲它會佔用我儘可能多地在每臺交換機上手動配置配置)。

我使用shebang#!/ usr/bin/expect -f使bash識別expect。當我這樣做時,期望的語法(spawn,expect,interact)完美地工作,但我的數組不起作用。

我收到以下錯誤信息:

多餘的字符近距離報價 在執行 「arrayName中=(」 172.21.21.20" , 「172.20.55.55」 ......「

後!當我改變了家當,和使用#/斌/慶典,希望不再被發現:

./stationsnmp.sh:行20:重生:找不到命令無法讀取 ./stationsnmp.sh:line 24:send:command not found could not read file「assword」:no such file or directory ./stationsnmp.sh:line 27: send:command not found ./stationsnmp .SH:第28行:互動: 找不到命令

我真的不是在bash親,這說明我不能讓這個小問題...一些幫助將受到歡迎。

編輯:下面是我的代碼

#!/bin/bash 

switch=("172.20.0.229" "172.20.0.232" "172.20.0.233" "172.21.0.15" "172.21.0.16" "172.21.2.1" "172.20.2.250" "172.21.3.1" "172.20.3.250" "172.21.4.1" "172.20.4.250" "172.21.6.1" "172.20.6.250" "172.21.7.1" "172.20.7.250" "172.21.8.1" "172.20.8.250" "172.20.9.250" "172.21.9.1" "172.21.10.1" "172.20.10.250" "172.21.11.1" "172.20.11.250" "172.21.12.1" "172.21.12.250") 

nmb=`echo ${#switch[@]}` 

set timeout 3 


for ((ii=0; ii<=$nmb; ii++)) 
#for ii in {0..${#switch[@]}} 
do 
    if [ ${switch[$ii]:5:1} -eq 1 ] 
    then 
     ipdc=`echo ${switch[ii]} | grep -o -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.'`"10" 


     spawn ssh [email protected][$ii] 


     expect "*assword*" 
     send "PASS\r" 
     interact 


     exit 
    fi 
done 
+3

這是很難診斷你的問題,如果你不告訴我們,導致了它的代碼。 – rojomoke

+0

請原諒我,我添加了代碼。謝謝 – Aeron

回答

2

一部分你混合bashexpect,這是兩個完全不同的語言。您可能希望有一個bash包裝腳本,其中包含正確的選項處理(請參閱getopts),其中包含一個IP地址列表,併爲傳遞給bash打包機的每個IP地址執行expect腳本。如果您的expect腳本很小,您可能希望將它嵌入到shell腳本中,而不是將它嵌入到單獨的文件中。

編輯:

#!/bin/bash 

switches=("172.20.0.229" "172.20.0.232") 

for ip in "${switches[@]}"; do 
    expect "${ip}" <<-'EOT' 
     set host [lindex $argv 0] 
     set timeout 3 
     spawn ssh -l admin $host 
     expect "*assword*" 
     send "PASS\r" 
     interact 
     exit 
EOT 
done 
+0

恐怕我沒有得到你所說的一切。 Expect是我剛剛用cygwin安裝的一個包,就像我使用普通Linux的apt-get或aptitude安裝一樣。現在expect.exe在C:/ cygwin/bin中,就像egrep,frep等一樣。這就是爲什麼我不明白我應該如何將它放到我的腳本中,因爲期望是一個.exe程序。對不起,我的水平很差...... – Aeron

+0

你的腳本與* shebang *中使用的任何解釋器一起運行,例如'#!/ bin/bash'將使用'bash'運行你的腳本。然而'bash'對'expect'語法一無所知,因此您需要在腳本中調用'expect'作爲外部工具,併爲其提供期望的代碼。你可以用'expect'來實現整個事情(然後把'#!/ usr/bin/expect -f'作爲shebang),但是根據複雜性,你可能需要像你開始做的那樣包裝它。我編輯了我的答案,讓你知道從哪裏開始。這有幫助嗎? –

+0

感謝您的回答。爲什麼bash應該關於從openssh數據包安裝的SSH命令,但是不希望我已經從數據包中安裝了期望?如果我明白你說的話,使用shebang期望我應該只在腳本中使用這個命令?我從來沒有使用任何包裝...再次感謝。 – Aeron