I can never quite recall the exact command when I actually need it, so I'm parking it here for copy-paste.
TL;DR (for the impatient)
# Pull from remote to local (with sudo)
ssh host "sudo tar cz /var/log/nginx" | tar xzv --strip-components=3
# Push from local to remote
tar cz . | ssh host "tar xz -C /path/to/dest"
What happened
I needed to pull logs off an old CentOS server.
Tried rsync:
-bash: rsync: command not found
The box is EOL and its repos are dead, so yum install rsync won't work either.
Tried scp:
scp: /var/log/nginx/access.log: Permission denied
The log directory needs root, and scp gives you no way to slip a sudo in there.
This is exactly where the tar + ssh pipe earns its keep.
When to reach for it
- rsync isn't installed (old servers, minimal containers)
- scp can't read the file because of permissions (sudo is required)
- You don't want to leave a temp file on the remote
- You want to compress on the fly to save bandwidth
Basic patterns
Remote → local
ssh host "tar cz /path/to/dir" | tar xz
The remote /path/to/dir gets extracted into your current local directory.
When sudo is required
ssh host "sudo tar cz /var/log/nginx" | tar xzv --strip-components=3
--strip-components=3 chops off the first three path components of /var/log/nginx/... so it extracts as nginx/....
Choosing the extraction target
ssh host "tar cz /path/to/data" | tar xz -C ./backup/
Local → remote
Send a directory and extract it on the other side:
tar cz . | ssh host "tar xz -C /path/to/dest"
Save as an archive file instead:
tar cz directory | ssh host "cat > backup.tar.gz"
Variations
Show progress
tar cz /data | pv | ssh host "tar xz -C /backup"
Slotting pv into the pipe gives you a live transfer rate.
Fan out to multiple servers at once
tar cz /deploy | tee >(ssh server1 "tar xz -C /app") \
>(ssh server2 "tar xz -C /app") > /dev/null
Gotchas
Counting --strip-components
It strips N leading path components.
/var/log/nginx/access.log
│ │ │
1 2 3 ← strip-components=3 leaves you with nginx/access.log
Where -C goes
It belongs on the extracting side (right-hand side of the pipe).
# OK
ssh host "tar cz /path" | tar xz -C ./dest/
# Pointless — `-C` on the compression side doesn't change where it lands
ssh host "tar cz -C /path ." | tar xz
Compression options
| Option | Format | When to use |
|---|---|---|
| z | gzip | Usually all you need |
| j | bzip2 | When you care about ratio over speed |
| J | xz | Best ratio, slowest |
scp vs rsync vs tar + ssh
| Situation | Pick |
|---|---|
| One-off small file | scp |
| Recurring sync / incremental | rsync |
| No rsync available / sudo required | tar + ssh |
Wrap-up
- tar + ssh is the fallback when rsync isn't available
- It can grab files that are only readable through sudo
-
--strip-componentslets you trim the path depth - Streaming transfer — no temp file left behind
This post was written with AI assistance and reviewed by the author.
Top comments (0)