The scp Command — Secure File Copy
Last Updated: 2025-01-01
2 min read
Overview
scp (Secure Copy Protocol) uses SSH to securely transfer files between a local machine and a remote server, or between two remote servers. It’s a simple and reliable way to upload, download, or move files without needing FTP.
Basic Syntax
scp [options] source destination
Remote paths use the format: user@host:/path/to/file
Copying Files
Upload a file to a remote server
scp localfile.txt user@server.example.com:/home/user/
Download a file from a remote server
scp user@server.example.com:/home/user/remotefile.txt ./
Copy a file between two remote servers
scp user1@server1.com:/path/file.txt user2@server2.com:/path/
Copying Directories
Use the -r (recursive) flag to copy entire directories:
Upload a directory
scp -r /local/my-site/ user@server.example.com:/home/user/public_html/
Download a directory
scp -r user@server.example.com:/home/user/public_html/ ./backup/
Specifying a Custom SSH Port
If your server uses a non-standard SSH port, use the -P flag (uppercase):
scp -P 2222 localfile.txt user@server.example.com:/home/user/
scp -P 2222 -r /local/folder/ user@server.example.com:/home/user/
Useful Flags Reference
| Flag | Description |
|---|---|
-r | Recursively copy entire directories |
-P PORT | Specify remote SSH port (uppercase P) |
-p | Preserve modification times, access times, and modes |
-C | Enable compression during transfer |
-l LIMIT | Limit bandwidth in Kbit/s |
-i KEY | Use a specific SSH private key file |
-v | Verbose mode — useful for debugging |
-q | Quiet mode — suppress progress meter |
Practical Examples
Upload a database backup
scp ~/backups/database.sql.gz user@server.example.com:/home/user/backups/
Download logs for local analysis
scp user@server.example.com:/home/user/logs/error.log ./
Transfer with compression for large files
scp -C largefile.tar.gz user@server.example.com:/home/user/
Use a specific SSH key
scp -i ~/.ssh/my_private_key file.txt user@server.example.com:/home/user/
Limit bandwidth to avoid saturating the connection
scp -l 5000 largefile.zip user@server.example.com:/home/user/
This limits the transfer to approximately 5000 Kbit/s (~625 KB/s).
scp vs. rsync
| Feature | scp | rsync |
|---|---|---|
| Simplicity | Very simple syntax | More options, slightly complex |
| Incremental transfer | No — always copies everything | Yes — only copies changed parts |
| Resume interrupted transfers | No | Yes |
| Bandwidth efficiency | Copies entire files | Delta-based, much more efficient |
| Best for | Quick one-time transfers | Regular syncing and backups |
For recurring transfers or large data sets, consider using rsync instead.
Tips
- Always verify paths before transferring — especially when uploading to production directories like
public_html. - Use
-vif a transfer hangs or fails to diagnose connection issues. - Compress large files with
tarorgzipbefore transferring to reduce transfer time.
Tags:
ssh
linux
scp
file-transfer