When working with remote servers, comparing files or directories between local and remote machines is a common task. SSH provides secure access but lacks native diff functionality. Here's how to bridge that gap effectively.
The simplest approach uses diff
with process substitution:
diff local_file.txt <(ssh user@remote_host "cat remote_file.txt")
For directory trees, rsync
offers a powerful dry-run mode:
rsync -n -avz -e ssh --delete user@remote_host:/remote/path/ /local/path/ | grep -v "uptodate"
Combine find
and diff
for recursive comparison:
ssh user@remote_host "find /path -type f -exec sh -c 'diff -q {} /local/path/{}' \;"
For complex comparisons, create temporary snapshots:
ssh user@remote_host "cd /remote/path && find . -type f -print0 | xargs -0 md5sum" > remote.md5
cd /local/path && find . -type f -print0 | xargs -0 md5sum > local.md5
diff local.md5 remote.md5
For those preferring graphical tools:
- Meld with SSHFS
- Beyond Compare with SFTP
- WinSCP's built-in comparison
For large directories:
# Use checksums instead of full content
ssh user@remote_host "find /path -type f -exec md5sum {} +" > remote_checksums.md5
find /local/path -type f -exec md5sum {} + > local_checksums.md5
diff local_checksums.md5 remote_checksums.md5
When working with distributed systems or remote servers, comparing files and directories across machines is a common task. SSH is often the only available connection method, making traditional GUI diff tools unusable. Here's how to handle this like a pro.
The simplest approach uses diff
with process substitution:
diff -u <(ssh user@remote_host "cat /path/to/remote/file") /path/to/local/file
For comparing entire directories, these methods work best:
Method 1: Using rsync
rsync -n -avrc --delete -e ssh user@remote_host:/remote/dir/ /local/dir/ | grep -v "^sending"
Method 2: Combining find and md5sum
ssh user@remote_host "find /remote/dir -type f -exec md5sum {} \;" | sort > remote.md5
find /local/dir -type f -exec md5sum {} \; | sort > local.md5
diff -u remote.md5 local.md5
For continuous monitoring of changes:
ssh user@remote_host "inotifywait -m -r -e modify,create,delete /remote/dir" | while read -r line; do
echo "Remote change detected: $line"
# Trigger your diff logic here
done
When dealing with large files, use these optimized approaches:
# Compare only modified portions
ssh user@remote_host "dd if=/remote/largefile bs=1M" | cmp - /local/largefile
# Parallel checksum comparison
ssh user@remote_host "split -n 4 /remote/largefile --filter='md5sum'"
Always use SSH keys instead of passwords, and consider these security enhancements:
# Restrict SSH access to specific commands
command="diff -r /allowed/dir /allowed/dir2" ssh-rsa AAAAB3... user@local
For developers already using Git:
git diff remote/master -- /path/to/files
git ls-remote ssh://user@remote_host/path/to/repo