ほとんど毎日、ファイルを別のサーバーにコピーする必要があります。私が通常行うことは次のとおりです。
scp filename user@destinationhost:/destination/folder
この同じコマンドを実行して、すべてのサーバーが完了するまで、宛先ホストを何度も変更します。同じファイルをそれらの異なるサーバーに転送する最良の(そして最も速い)方法は何ですか?
もう1つの欠点は、パスワードを何度も入力する必要があることですが、rsaを使用することは、数人がソースサーバーに接続できるため、オプションではありません。
編集-私は commandlinef でループを見つけました、それはトリックを行うかもしれません:
for h in Host1 Host2 Host3 Host4 ; { scp file user@$h:/destination_path/ ; }
pssh や kanif のように、ファイルを複数のホストに(同時に接続して)scpできるさまざまなツールがあります。パスワードに関しては、 agent forwarding を使用することをお勧めします。これにより、ローカルマシンにキーを保持できますが、別のホストからSSH接続を開始するときにそれを使用します。それ以外の場合は、 pssh の--askpass
コマンドのparallel-scp
オプションを使用すると、すべてのホストで使用するパスワードを要求するプロンプトが表示されます。
これを行うためのツールをインストールできない場合は、エージェント転送をセットアップし(これを実行しているマシンに接続するときにssh
に-A
オプションを追加して)、次にscp
は次のようにループします:
for Host in server1 server2 server3; do
scp somefile $Host:~/somedir/
done
これを、expectスクリプトで実行してみてください。
#!/bin/bash
HOSTS="h1.lan h2.lan h3.lan"
read -p "Password: " PASSWORD
for Host in $HOSTS
do
expect -c "
spawn /usr/bin/scp file user@$Host:/destination_path/
expect {
"*password:*" { send $PASSWORD\r;interact }
}
exit
"
done
上記はあなたの要件に適応するためにかなり簡単なはずです。
ここでsshpass
について言及する必要があると思います。これは、必要なパスワードを使用して、ファイルを複数のターゲットに送信することです:
filePath="/home/download/textToSend.txt"
ip_range=("10.10.10.1" "10.10.10.2" "10.10.10.3" "10.10.10.4")
# Start file transfer
echo "Starting file transfer to ${#ip_range[@]} units."
for ((i=0; i<${#ip_range[@]}; ++i )) ;
do
echo "Transfering ${filePath} to ${ip_range[$i]}..."
sshpass -p password scp -o 'StrictHostKeyChecking=no' "${filePath}" root@${ip_range[$i]}:/home/downloads&
done
wait
echo "File transfers ended"
同様の状況で「sshpt」を使用しました。 SSH電源ツール(sshpt)を使用すると、事前共有キーを使用せずに、SSHを介してコマンドを実行し、同時に多くのサーバーにファイルをアップロードできます。アップロードされたファイルとコマンドは、直接またはSudoを介して実行できます。