web-dev-qa-db-ja.com

scpを使用してファイルを別のサーバーにコピーする

ほとんど毎日、ファイルを別のサーバーにコピーする必要があります。私が通常行うことは次のとおりです。

scp filename user@destinationhost:/destination/folder

この同じコマンドを実行して、すべてのサーバーが完了するまで、宛先ホストを何度も変更します。同じファイルをそれらの異なるサーバーに転送する最良の(そして最も速い)方法は何ですか?

もう1つの欠点は、パスワードを何度も入力する必要があることですが、rsaを使用することは、数人がソースサーバーに接続できるため、オプションではありません。

編集-私は commandlinef でループを見つけました、それはトリックを行うかもしれません:

 for h in Host1 Host2 Host3 Host4 ; { scp file user@$h:/destination_path/ ; }
8
Ruben Ploneda

pss​​hkanif のように、ファイルを複数のホストに(同時に接続して)scpできるさまざまなツールがあります。パスワードに関しては、 agent forwarding を使用することをお勧めします。これにより、ローカルマシンにキーを保持できますが、別のホストからSSH接続を開始するときにそれを使用します。それ以外の場合は、 pss​​h--askpassコマンドのparallel-scpオプションを使用すると、すべてのホストで使用するパスワードを要求するプロンプトが表示されます。

これを行うためのツールをインストールできない場合は、エージェント転送をセットアップし(これを実行しているマシンに接続するときにssh-Aオプションを追加して)、次にscpは次のようにループします:

for Host in server1 server2 server3; do
    scp somefile $Host:~/somedir/
done
6
mgorven

これを、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

上記はあなたの要件に適応するためにかなり簡単なはずです。

2
user9517

ここで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"
1
Xoferif

同様の状況で「sshpt」を使用しました。 SSH電源ツール(sshpt)を使用すると、事前共有キーを使用せずに、SSHを介してコマンドを実行し、同時に多くのサーバーにファイルをアップロードできます。アップロードされたファイルとコマンドは、直接またはSudoを介して実行できます。

0
Chakri