Homepage: https://github.com/renard/dired-sync
Updated:
Sync directories within dired
dired-sync provide a simple and easy way to synchronize directories from
dired. This tool is based upon both rsync(1) and ssh(1).
To install `dired-sync' you simply need to drop dired-sync.el in your
load-path and bind (suggested) C-s S key to `dired-do-sync':
(when (require 'dired-sync nil t)
(define-key dired-mode-map (kbd "C-c S") 'dired-do-sync))
Synchronizations can also be done using pools (seed `dired-do-sync-pool'.
For this to work `dired-sync-pools' needs to be configured. To bind
`dired-do-sync-pool' to C-c s add this in previous sexp:
(define-key dired-mode-map (kbd "C-c s") 'dired-do-sync-pool)
There are 3 types of directories synchronizations as explained bellow.
* local / local
This is the easiest way. rsync(1) would be enough.
* local / remote or remote / local
This is also a simple way, the only requirement is a working ssh
connection to the remote host.
* remote / remote
This is a bit more complexe since there are 3 types of remote / remote
syncs.
- source server can reach destination server
In that case `dired-sync' would optimize files synchronisation by
running rsync(1) on the source server through a ssh connection.
- source server cannot reach destination server
This is the more complexe case. `dired-sync' would create a ssh
tunnel from source to destination using your local machine as a
jumphost.
Be aware this mode is greedy regarding bandwidth consumption since
data are transfered twice: from the source server to localhost AND
from localhost to destination server.
- Both source and destination are located on the same remote host.
This case is the same as the first one (source server can reach
destination server) except the destination directory is local (on the
remote host).
If a direct connection could not be established from source to
destination, `dired-sync' would automatically fall back to the tunneled
sync mode.
`dired-sync' is heavily based on ssh(1) configuration hence your
~/.ssh/config file should be as accurate as possible. It doesn't matter
how many jumphosts you need to use to reach both source and destination
as long as they are declared in you ssh configuration file.
To allow `dired-sync' to work out of the box, key-based ssh
authentication is required.
Source Destination
+---------+ (if possible) +---------+
| HostA |<- - - - - - - - - >| HostB |
| UserA | | UserB |
+---------+ +---------+
^ ^
+---------+ +---------+
|JumphostA| |JumphostB|
| UserJHA | | UserJHB |
+---------+ +---------+
^ ^
| +---------+ |
-----------|localhost|----------
+---------+
To use that configuration, you ~/.ssh/config may be something like:
Host *
ForwardAgent yes
RhostsRSAAuthentication yes
RSAAuthentication yes
HashKnownHosts yes
IdentityFile ~/.ssh/id_rsa
TCPKeepAlive yes
ServerAliveInterval 30
Port 22
Protocol 2,1
Host jumphostA
User userJHA
HostName jumphostA.example.com
Host hostA
User userA
HostName jumphostA.internal.example.com
ProxyCommand ssh -q -t jumphostA nc -w 1 %h %p
Host jumphostB
User userJHB
HostName jumphostB.other-example.com
Host hostB
User userB
HostName jumphostV.internal.other-example.com
ProxyCommand ssh -q -t jumphostB nc -w 1 %h %p
then you would be able to connect to hostA by simply typing:
ssh hostA
Or opening a dired buffer to hostB: C-X C-f /scp:hostB: