When and Why to Use -e ssh Flag in rsync: SSH Protocol Usage Explained


1 views


rsync has a built-in intelligence when it comes to remote transfers. When you specify a remote host in the format user@host:/path, rsync automatically assumes you want to use SSH as the transport protocol. This behavior is by design and documented in the rsync manual.

While the -e flag isn't required for basic SSH transfers, there are specific scenarios where it becomes essential:

# 1. When using non-standard SSH ports
rsync -avz -e 'ssh -p 2222' user@host:/path ./local

# 2. When specifying custom SSH options
rsync -avz -e 'ssh -i ~/.ssh/custom_key' user@host:/path ./local

# 3. When using alternative remote shells
rsync -avz -e 'rsh' user@host:/path ./local

The -e ssh flag can impact performance in certain cases:

  • Using compression with SSH (-z) when files are already compressed
  • Extra overhead when specifying complex SSH options

The -e option predates rsync's automatic SSH detection. Older versions required explicit SSH specification, which explains why many legacy scripts and tutorials include it.

For most modern use cases:

# This is sufficient for standard SSH transfers
rsync -avz user@host:/path ./local

# Reserve -e for special cases only
rsync -avz -e 'ssh -C -c aes256-ctr' user@host:/path ./local

The key is understanding that while -e ssh isn't harmful, it's redundant for basic SSH transfers in modern rsync versions.


Many developers wonder about the necessity of the -e ssh flag when using rsync over SSH. The confusion stems from observing that both these commands work:

rsync --progress -avze ssh user@host:/path/to/files ./here
rsync --progress -avz user@host:/path/to/files ./here

rsync has smart default behavior when dealing with remote paths:

  • When a hostname is detected in the source/destination path (using host: syntax)
  • When no explicit remote shell is specified via -e

rsync will automatically use SSH as its default transport protocol.

While the flag is optional for basic SSH connections, there are scenarios where it's essential:

# 1. Custom SSH port:
rsync -avz -e 'ssh -p 2222' user@host:/path ./local

# 2. Using SSH options:
rsync -avz -e 'ssh -i ~/.ssh/custom_id' user@host:/path ./local

# 3. Alternative shells:
rsync -avz -e 'rsh' user@host:/path ./local

When using complex SSH configurations, the -e flag can impact performance:

  • Multiple SSH options increase connection overhead
  • Some options may disable SSH connection multiplexing
  • Each rsync process establishes a new SSH connection by default

For most use cases:

  • Omit -e ssh for standard SSH connections
  • Use -e only when needing SSH customization
  • Consider setting default SSH options in ~/.ssh/config instead

With SSH config (~/.ssh/config):

Host myserver
    HostName server.example.com
    User myuser
    Port 2222
    IdentityFile ~/.ssh/myserver_key

Then simply use:

rsync -avz myserver:/path ./local