Take the 2-minute tour ×
Server Fault is a question and answer site for professional system and network administrators. It's 100% free, no registration required.

I have to copy a file to different servers almost every day. What I usually do is:

scp filename user@destinationhost:/destination/folder

I run this same command changing the destination host over and over again until I finish all the servers. What is the best (and fastest) way to transfer the same file to those different servers?

Another drawback is that I need to enter the password over and over again, but using rsa is not an option since several people can connect to the source server.

Edit - I found loop in commandlinefu that may do the trick:

 for h in host1 host2 host3 host4 ; { scp file user@$h:/destination_path/ ; }
share|improve this question
    
Do you have expect on the system ? –  Iain May 15 '12 at 21:02
    
@lain Yes, expect is installed. –  Ruben Ploneda May 15 '12 at 21:07
add comment

3 Answers

up vote 2 down vote accepted

There are various tools which can scp files to multiple hosts (with simultaneous connections), like pssh and kanif. In terms of passwords I would suggest using agent forwarding. This allows you to keep the key on your local machine, but use it when initiating SSH connections from another host. Otherwise, the --askpass option to the parallel-scp command from pssh makes it prompt for a password to use for every host.

If you can't install a tool to do this, setup agent forwarding (by adding the -A option to ssh when connecting to the machine you're doing this on) and then run scp in a loop like so:

for HOST in server1 server2 server3; do
    scp somefile $HOST:~/somedir/
done
share|improve this answer
    
pssh is not installed in the server and I can't run applications that weren't provided by the sysadmin team. –  Ruben Ploneda May 15 '12 at 21:00
    
@RubenPloneda, but it does sound like you have a valid reason for that tool. You should at least consider it, and forward your request to your sysadmin team to get that installed. –  Zoredache May 15 '12 at 21:01
    
Then you'll have to use SSH agent forwarding and a bash loop (see answer). –  mgorven May 15 '12 at 21:05
add comment

Try doing this with an expect script e.g.

#!/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

The above should be fairly straight forward to adapt to your requirements.

share|improve this answer
add comment

I used 'sshpt' for a similar situation. The SSH Power Tool (sshpt) enables you to execute commands and upload files to many servers simultaneously via SSH without using pre-shared keys. Uploaded files and commands can be executed directly or via sudo.

share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.