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 -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
I presume the drop is something security-related in
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
sshto use an existing connection by putting the following in a
~/.ssh/configfile (remember to set the permissions for everything in
~/.sshfor 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
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.
pkill ssh_to_bonzo.sh at the end. That cleans up the
Note, too, that you must still give the
sshpass command line to the
rsync --rsh option.
Piece of cake.