Bash

spawn - 找不到命令!

  • October 16, 2019

我正在使用 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

  1. 首先,在您的機器上創建一個公共 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
  1. 從腳本中刪除期望。現在您擁有無密碼訪問權限,您可以將腳本用作:
#!/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

引用自:https://unix.stackexchange.com/questions/187339