After spending yet another several hours fighting the good fight, it seems like a good idea to note how to use rsync
on a troublesome ssh
connection – one that both requires a password and that is slooooow to get logged on.
First, the problem of the password is solved using sshpass
. It allows you to put the password for the remote system in a file. The file, we presume, is stored in your ~/.ssh/
directory and has its permissions set so that only you, the user, can see it or do anything with it. In that way, it works like an ssh
key file that you might tell ssh
to log in with using the “ssh -i ...
” command line option.
Second, to allow for a slow server, use something like this as an option to ssh
:
ssh -o ServerAliveInterval=45 ...
That is, tell ssh
to wait for 45 seconds for the slow server to get you logged in.
So the command line to get a connection to the server is something like this:
sshpass -f ~/.ssh/bonzo_password.txt \ ssh \ -p __BONZO_SSH_PORT_22__ \ -o ServerAliveInterval=45 \ __BONZO_USER__@__BONZO__
Excuse the horrid backslashes. They are for the browser window.
All well and good. But that command line won’t work under rsync
. The connection will be made, then instantly dropped. And rsync
hangs.
I presume the drop is something security-related in
ssh
.Or maybe
sshpass
.Whatever.
rsync
is unhappy.But, here’s the deal: rsync
will be happy if the connection is already made in another terminal, and you have configured ssh
to allow connections to go through a “master” connection – that is, tell ssh
to not log in normally, but to rather use an existing ssh
connection.
You tell
ssh
to use an existing connection by putting the following in a ~/.ssh/config
file (remember to set the permissions for everything in ~/.ssh
for only your access):
ControlMaster auto ControlPath /tmp/ssh_mux_%h_%p_%r
For clean-up reasons, you put the sshpass
command in a separate .sh
file which we’ll call ssh_to_bonzo.sh
.
So now you run that ssh_to_bonzo.sh
script in a “SCREEN” – sort of a virtual terminal window!
screen -t ssh_to_bonzo -dmS ssh_to_bonzo ssh_to_bonzo.sh sleep 45
Note the you-set-it, 45 second delay.
Once this code is run, you can rsync
away, though with the world’s worst command line.
So your whole rsync
script might look something like this:
screen -t ssh_to_bonzo -dmS ssh_to_bonzo ssh_to_bonzo.sh sleep 45 rsync --rsh="sshpass -f ~/.ssh/bonzo_password.txt ssh -l bonzo_user_name" \ bonzo:bonzo_directory \ to_directory pkill ssh_to_bonzo.sh
Or something of that sort.
Notice the pkill ssh_to_bonzo.sh
at the end. That cleans up the screen
operation.
Note, too, that you must still give the sshpass
command line to the rsync --rsh
option.
Piece of cake.