Bash
spawn - 找不到命令!
我正在使用 Mac OS X 10.9.4,以下是我將文件從本地機器複製到不同主機的腳本
#!/bin/bash #!/usr/bin/expect echo "I will fail if you give junk values!!" echo " " echo "Enter file name: " read filePath echo " " echo "Where you want to copy?" echo "Enter" echo "1. if Host1" echo "2. if Host2" echo "3. if Host3" read choice echo " " if [ $choice -eq "1" ] then spawn scp filePath uname@host1:/usr/tmp expect "password" send "MyPassword\r" interact elif [ $choice -eq "2" ] then spawn scp filePath uname@host2:/usr/tmp expect "password" send "MyPassword\r" interact elif [ $choice -eq "3" ] then spawn scp filePath uname@host3:/usr/tmp expect "password" send "MyPassword\r" interact else echo "Wrong input" fi
執行此腳本時,我正在關注
./rcopy.sh: line 21: spawn: command not found couldn't read file "password": no such file or directory ./rcopy.sh: line 23: send: command not found ./rcopy.sh: line 24: interact: command not found
您的腳本正在嘗試組合兩個解釋器。你同時擁有
#!/bin/bash
和#!/usr/bin/expect
。那是行不通的。您只能使用兩者之一。從bash
一開始,您的腳本就作為 bash 腳本執行。但是,在您的腳本中,您有
expect
諸如spawn
和之類的命令send
。由於腳本是由bash
而不是由讀取的expect
,因此失敗。您可以通過編寫不同的expect
腳本並從您的腳本中呼叫它們bash
或將整個內容轉換為expect
.不過,最好的方法,也是避免在簡單文本文件中以純文字形式保存密碼的可怕做法的一種方法是設置無密碼 ssh。這樣,
scp
就不需要密碼,你也不需要expect
:
- 首先,在您的機器上創建一個公共 ssh 密鑰:
ssh-keygen -t rsa
每次登錄後第一次執行任何 ssh 命令時,系統都會要求您輸入密碼。這意味著對於多個 ssh 或 scp 命令,您只需輸入一次。將密碼留空以實現完全無密碼訪問。 2. 生成公鑰後,將其複製到網路中的每台電腦:
while read ip; do ssh-copy-id -i ~/.ssh/id_rsa.pub user1@$ip done < IPlistfile.txt
IPlistfile.txt
應該是每行包含伺服器名稱或 IP 的文件。例如:host1 host2 host3
由於這是您第一次執行此操作,您必須手動輸入每個 IP 的密碼,但一旦您完成此操作,您將能夠通過簡單的操作將文件複製到這些機器中的任何一台:
scp file user@host1:/path/to/file
- 從腳本中刪除期望。現在您擁有無密碼訪問權限,您可以將腳本用作:
#!/bin/bash echo "I will fail if you give junk values!!" echo " " echo "Enter file name: " read filePath echo " " echo "Where you want to copy?" echo "Enter" echo "1. if Host1" echo "2. if Host2" echo "3. if Host3" read choice echo " " if [ $choice -eq "1" ] then scp filePath uname@host1:/usr/tmp elif [ $choice -eq "2" ] then scp filePath uname@host2:/usr/tmp elif [ $choice -eq "3" ] then scp filePath uname@host3:/usr/tmp else echo "Wrong input" fi