以下是 **scp** 命令的完整选项及用法详解,涵盖所有主要功能和场景:
完整选项列表及说明
选项说明**-P
完整语法
scp [选项] 源文件 目标路径
源文件/目标路径支持以下格式:
本地路径:/path/to/file 或 ./file远程路径:user@host:/path/to/fileIPv6 地址需用方括号包裹:user@[2001:db8::1]:/path
详细用法示例
1. 基础文件传输
# 本地 → 远程
scp file.txt user@example.com:/remote/dir/
# 远程 → 本地
scp user@example.com:/remote/file.txt /local/dir/
# 远程 → 远程(通过本地中转)
scp user@server1:/path/file user@server2:/path/
2. 递归复制目录
# 复制本地目录到远程
scp -r /local/dir user@example.com:/remote/dir/
# 从远程复制目录到本地
scp -r user@example.com:/remote/dir /local/dir/
3. 指定端口和私钥
# 使用非默认端口(2222)和指定私钥
scp -P 2222 -i ~/.ssh/custom_key.pem file.txt user@example.com:/dir/
4. 限速传输
# 限制带宽为 500 Kbit/s(约 62.5 KB/s)
scp -l 500 largefile.iso user@example.com:/backups/
5. 保留文件属性
# 保留文件的修改时间和权限
scp -p backup.tar.gz user@example.com:/archives/
6. 加密算法选择
# 使用 AES-256 加密算法
scp -c aes256-ctr secret.txt user@example.com:/secure/
7. 调试连接问题
# 显示详细传输日志(排查连接或权限问题)
scp -v file.txt user@example.com:/tmp/
8. 静默模式
# 不显示任何输出(适合脚本中使用)
scp -q config.yaml user@example.com:/etc/app/
9. 强制使用 IPv4/IPv6
# 强制使用 IPv4
scp -4 data.log user@example.com:/logs/
# 强制使用 IPv6
scp -6 user@example.com:/logs/error.log ./
10. 通过本地中转传输远程文件
# 从 server1 复制到 server2(不直接连接两者)
scp -3 user@server1:/file.txt user@server2:/destination/
高级用法
1. 使用 -o 传递 SSH 参数
# 跳过主机密钥检查(慎用)
scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null file.txt user@example.com:/tmp/
# 指定 SSH 连接超时时间
scp -o ConnectTimeout=10 backup.tar user@example.com:/backups/
2. 压缩传输大文件
# 启用压缩(适合文本或可压缩数据)
scp -C database.dump user@example.com:/backups/
3. 批量传输文件
# 使用通配符传输多个文件
scp user@example.com:/logs/*.log ./local_logs/
注意事项
文件路径特殊字符
若路径含空格,用引号包裹:scp "file name.txt" user@host:/dir/
SSH 密钥认证
配置免密登录可避免频繁输入密码:
ssh-keygen -t ed25519
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@example.com
大文件传输中断
使用 rsync 替代以支持断点续传:
rsync -Pavz largefile.iso user@example.com:/backups/
权限问题
确保目标路径有写入权限,否则会报错 Permission denied。
替代工具推荐
**rsync**:增量同步、断点续传、更高效的文件传输。**sftp**:交互式文件操作(上传、下载、删除、重命名)。**tar + ssh**:流式传输目录(适合管道操作):
tar czf - /local/dir | ssh user@example.com "tar xzf - -C /remote/dir"