私は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
答え1
あなたのスクリプトは2つの通訳者を組み合わせようとします。あなた#!/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コマンドを一度だけ入力するだけです。完全なパスワードのないアクセスのためには、パスワードを空白のままにしてください。
公開鍵を作成したら、ネットワーク上のすべてのコンピュータにコピーします。
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
答え2
コードをより簡潔にすることができます。
#!/bin/bash
read -p "Enter file name: " filePath
if ! [[ -r $filePath ]]; then
echo "cannot read $filePath"
exit 1
fi
PS3="Where you want to copy? "
select host in host1 host2 host3; do
if [[ -n $host ]]; then
expect <<END
spawn scp "$filePath" uname@$host:/usr/tmp
expect "password"
send "MyPassword\r"
expect eof
END
break
fi
done
提案されているようにSSHキーを設定する方が良いでしょう。
if [[ -n $host ]]; then
scp "$filePath" uname@$host:/usr/tmp
break
fi
答え3
spawn
expect
命令です。通訳があると機能しません/bin/bash
。