
SCP指令使用详解
SCP(Secure Copy Protocol)是基于SSH协议的安全文件传输命令,用于在本地主机与远程主机之间,或者两个远程主机之间安全地复制文件和目录。
基本语法
基本格式说明
- 本地到远程:
scp local_file user@remote_host:remote_path
- 远程到本地:
scp user@remote_host:remote_file local_path
- 远程到远程:
scp user1@host1:file user2@host2:path
常用选项参数
基础选项
| 选项 |
说明 |
-r |
递归复制整个目录 |
-p |
保留文件的修改时间、访问时间和权限 |
-v |
显示详细的传输过程 |
-q |
静默模式,不显示传输进度 |
-C |
启用压缩传输 |
高级选项
| 选项 |
说明 |
-P port |
指定SSH端口号 |
-i identity_file |
指定私钥文件 |
-o ssh_option |
传递SSH选项 |
-l limit |
限制传输带宽(Kbit/s) |
-S program |
指定加密程序 |
实用示例
1. 基本文件传输
1 2 3 4 5 6 7 8
| scp /local/file.txt user@192.168.1.100:/remote/path/
scp user@192.168.1.100:/remote/file.txt /local/path/
scp /local/old_name.txt user@192.168.1.100:/remote/new_name.txt
|
2. 目录传输
1 2 3 4 5 6 7 8
| scp -r /local/directory/ user@192.168.1.100:/remote/path/
scp -r user@192.168.1.100:/remote/directory/ /local/path/
scp -rp /local/directory/ user@192.168.1.100:/remote/path/
|
3. 高级用法
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| scp -P 2222 file.txt user@host:/path/
scp -i ~/.ssh/private_key file.txt user@host:/path/
scp -C large_file.zip user@host:/path/
scp -l 1000 file.txt user@host:/path/
scp -v file.txt user@host:/path/
|
4. 批量传输
1 2 3 4 5 6 7 8 9
| scp file1.txt file2.txt file3.txt user@host:/remote/path/
scp *.txt user@host:/remote/path/ scp /local/path/*.log user@host:/remote/logs/
scp /local/path/*.{jpg,png,gif} user@host:/remote/images/
|
远程主机间传输
1 2 3 4 5
| scp user1@host1:/path/file.txt user2@host2:/path/
scp -3 user1@host1:/path/file.txt user2@host2:/path/
|
配置文件优化
SSH配置文件 (~/.ssh/config)
1 2 3 4 5 6
| Host myserver HostName 192.168.1.100 User myuser Port 2222 IdentityFile ~/.ssh/myserver_key Compression yes
|
使用配置后的简化命令:
1
| scp file.txt myserver:/remote/path/
|
安全注意事项
1. 密钥管理
1 2 3 4 5 6 7 8
| ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
ssh-copy-id user@remote_host
chmod 600 ~/.ssh/private_key
|
2. 主机验证
1 2 3 4 5
| scp -o StrictHostKeyChecking=yes file.txt user@host:/path/
scp -o StrictHostKeyChecking=ask file.txt user@host:/path/
|
3. 连接安全
1 2 3 4 5 6 7 8
| scp -o PasswordAuthentication=no file.txt user@host:/path/
scp -o ConnectTimeout=30 file.txt user@host:/path/
scp -o Ciphers=aes256-ctr file.txt user@host:/path/
|
性能优化技巧
1. 传输优化
1 2 3 4 5 6 7 8
| scp -C documents.tar user@host:/path/
scp -o ControlMaster=auto -o ControlPath=/tmp/ssh-%r@%h:%p file.txt user@host:/path/
tar czf - /local/directory/ | ssh user@host "cd /remote/path && tar xzf -"
|
2. 并行传输
1 2 3 4 5 6 7 8 9
| rsync -avz -e ssh /local/path/ user@host:/remote/path/
split -b 100M large_file.zip chunk_ for chunk in chunk_*; do scp "$chunk" user@host:/remote/path/ & done wait
|
故障排除
常见错误及解决方案
Permission denied (publickey)
1 2 3 4 5
| ssh-add -l
ssh-add ~/.ssh/private_key
|
Host key verification failed
1 2 3 4 5
| ssh-keygen -R hostname
ssh user@hostname
|
Connection timed out
1 2 3 4 5
| ping hostname
ssh -v user@hostname
|
调试模式
1 2 3 4 5 6 7 8
| scp -v file.txt user@host:/path/
scp -vvv file.txt user@host:/path/
ssh -F /dev/null -v user@host
|
最佳实践
1. 安全实践
- 始终使用密钥认证而非密码认证
- 定期更换SSH密钥
- 使用非标准SSH端口
- 启用防火墙和fail2ban
- 定期更新SSH服务
2. 效率实践
- 对于大量小文件,使用tar打包后传输
- 利用SSH连接复用减少握手开销
- 根据网络条件选择是否启用压缩
- 使用rsync进行增量同步
3. 自动化脚本示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| #!/bin/bash
SOURCE_DIR="/local/backup" REMOTE_HOST="backup-server" REMOTE_DIR="/remote/backup" DATE=$(date +%Y%m%d)
tar czf "backup_${DATE}.tar.gz" "$SOURCE_DIR"
scp -C "backup_${DATE}.tar.gz" "$REMOTE_HOST:$REMOTE_DIR/"
rm "backup_${DATE}.tar.gz"
echo "备份完成: backup_${DATE}.tar.gz"
|
总结
SCP是一个功能强大且安全的文件传输工具,掌握其各种选项和用法可以大大提高工作效率。在使用过程中,要特别注意安全配置,合理使用各种优化选项,并根据实际需求选择最适合的传输方式。
对于日常运维工作,建议结合SSH配置文件、密钥认证和自动化脚本,构建高效安全的文件传输工作流程。