Basic Syntax #
Use this general form for scp commands.
Command
Description
scp SOURCE DEST
General scp syntax
scp file.txt user@host:/path/
Copy local file to remote
scp user@host:/path/file.txt .
Copy remote file to current directory
scp user@host:/path/file.txt /local/path/
Copy remote file to local directory
Upload Files #
Copy local files to a remote host.
Command
Description
scp file.txt user@host:/tmp/
Upload one file
scp file1 file2 user@host:/tmp/
Upload multiple files
scp *.log user@host:/var/log/archive/
Upload matching files
scp -p file.txt user@host:/tmp/
Preserve modification times and mode
Download Files #
Copy files from a remote host to your local system.
Command
Description
scp user@host:/tmp/file.txt .
Download to current directory
scp user@host:/tmp/file.txt ~/Downloads/
Download to specific directory
scp user@host:'/var/log/*.log' .
Download remote wildcard (quoted)
scp user@host:/tmp/file.txt ./new-name.txt
Download and rename locally
Copy Directories #
Use -r for recursive directory transfers.
Command
Description
scp -r dir/ user@host:/tmp/
Upload directory recursively
scp -r user@host:/var/www/ ./backup/
Download directory recursively
scp -r dir1 dir2 user@host:/tmp/
Upload multiple directories
scp -rp project/ user@host:/srv/
Recursive copy and preserve attributes
Ports, Keys, and Identity #
Connect with custom SSH settings.
Command
Description
scp -P 2222 file.txt user@host:/tmp/
Use custom SSH port
scp -i ~/.ssh/id_ed25519 file.txt user@host:/tmp/
Use specific private key
scp -o IdentityFile=~/.ssh/id_ed25519 file.txt user@host:/tmp/
Set key with -o option
scp -o StrictHostKeyChecking=yes file.txt user@host:/tmp/
Enforce host key verification
Performance and Reliability #
Tune speed, verbosity, and resilience.
Command
Description
scp -C large-file.iso user@host:/tmp/
Enable compression
scp -l 8000 file.txt user@host:/tmp/
Limit bandwidth (Kbit/s)
scp -v file.txt user@host:/tmp/
Verbose output for debugging
scp -q file.txt user@host:/tmp/
Quiet mode
scp -o ConnectTimeout=10 file.txt user@host:/tmp/
Set connection timeout
Remote to Remote Copy #
Transfer files between two remote hosts.
Command
Description
scp user1@host1:/path/file user2@host2:/path/
Copy between remote hosts
scp -3 user1@host1:/path/file user2@host2:/path/
Route transfer through local host
scp -P 2222 user1@host1:/path/file user2@host2:/path/
Use custom port (applies to both hosts)
Common Patterns #
Frequently used command combinations.
Command
Description
scp -r ./site user@host:/var/www/
Deploy static site files
scp -i ~/.ssh/id_ed25519 -P 2222 backup.sql user@host:/tmp/
Upload with key and custom port
scp user@host:/etc/nginx/nginx.conf ./
Pull config for review
scp -rp ./configs user@host:/etc/myapp/
Copy configs and keep metadata
Troubleshooting #
Check
Command
Permission denied
Verify user has write access to the destination path
Host key verification failed
ssh-keygen -R hostname to remove old key, then retry
Connection refused on custom port
scp -P PORT file user@host:/path/ (uppercase -P)
Transfer stalls or times out
scp -o ConnectTimeout=10 -o ServerAliveInterval=15 file user@host:/path/
Not a regular file error
Add -r for directories: scp -r dir/ user@host:/path/
Protocol error on OpenSSH 9.0+
scp -O file user@host:/path/ to use legacy SCP protocol
Debug connection issues
scp -v file user@host:/path/ for verbose SSH output
Related Guides #
Use these articles for detailed file transfer and SSH workflows.
Discuss with AI
Context loaded: SCP Cheatsheet
📋 Summary
🔑 Key points
🎓 Explain simply
💬 Pros & cons