scp 命令 #
scp
(Secure Copy Protocol)是一个基于SSH协议的命令行工具,用于在本地主机和远程主机之间或两个远程主机之间安全地传输文件。它使用与SSH相同的认证机制和加密方式,提供了文件传输的安全性和便捷性。
语法 #
scp [选项] [[用户@]主机1:]文件1 ... [[用户@]主机2:]文件2
常用选项 #
选项 | 描述 |
---|---|
-P 端口 |
指定远程主机的端口(注意是大写P,与ssh的-p不同) |
-p |
保留原文件的修改时间、访问时间和权限 |
-r |
递归复制整个目录 |
-q |
安静模式,不显示进度信息 |
-C |
启用压缩 |
-i 身份文件 |
指定用于认证的私钥文件 |
-l 限速 |
限制带宽使用,以Kbit/s为单位 |
-o SSH选项 |
传递SSH选项 |
-F ssh配置文件 |
指定SSH配置文件 |
-v |
详细模式,显示详细的调试信息 |
-4 |
强制使用IPv4地址 |
-6 |
强制使用IPv6地址 |
常见用法 #
1. 从本地复制文件到远程主机 #
scp /path/to/local/file username@remote_host:/path/to/remote/directory/
例如:
scp document.txt [email protected]:/home/user/documents/
2. 从远程主机复制文件到本地 #
scp username@remote_host:/path/to/remote/file /path/to/local/directory/
例如:
scp [email protected]:/home/user/document.txt ~/downloads/
3. 复制目录(递归) #
scp -r /path/to/local/directory username@remote_host:/path/to/remote/directory/
例如:
scp -r project/ [email protected]:/home/user/projects/
4. 使用非标准端口 #
scp -P 2222 file.txt username@remote_host:/path/to/destination/
5. 在两个远程主机之间复制文件 #
scp username1@host1:/path/to/file username2@host2:/path/to/destination/
6. 保留文件属性 #
scp -p file.txt username@remote_host:/path/to/destination/
7. 使用压缩加速传输 #
scp -C large_file.zip username@remote_host:/path/to/destination/
8. 限制带宽使用 #
scp -l 1000 large_file.zip username@remote_host:/path/to/destination/
这将限制带宽使用为1000 Kbit/s(约125 KB/s)。
9. 使用特定的私钥文件 #
scp -i ~/.ssh/id_rsa_custom file.txt username@remote_host:/path/to/destination/
10. 安静模式(不显示进度) #
scp -q file.txt username@remote_host:/path/to/destination/
实用示例 #
1. 复制多个文件 #
scp file1.txt file2.txt file3.txt username@remote_host:/path/to/destination/
2. 使用通配符复制文件 #
scp *.txt username@remote_host:/path/to/destination/
3. 复制文件并重命名 #
scp file.txt username@remote_host:/path/to/destination/newname.txt
4. 通过跳板机传输文件 #
scp -o "ProxyJump user1@jumphost" file.txt user2@destination:/path/to/destination/
5. 备份远程文件到本地 #
scp -r username@remote_host:/path/to/important/data/ ~/backups/$(date +%Y%m%d)/
6. 在脚本中使用scp(无需交互) #
scp -o "StrictHostKeyChecking=no" -o "BatchMode=yes" -i ~/.ssh/id_rsa file.txt username@remote_host:/path/to/destination/
7. 复制大目录并显示详细进度 #
scp -rv large_directory/ username@remote_host:/path/to/destination/
与其他文件传输工具的比较 #
工具 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
scp | 简单、安全、广泛可用 | 性能一般、不支持断点续传 | 小到中等文件的安全传输 |
rsync | 支持增量传输、断点续传、保留权限 | 配置较复杂 | 大文件、目录同步、备份 |
sftp | 交互式、支持更多文件操作 | 不适合批量传输 | 交互式文件管理 |
wget/curl | 支持HTTP/FTP、断点续传 | 不适合上传 | 从网络下载文件 |
安全注意事项 #
-
密钥权限:确保私钥文件权限正确(
chmod 600 ~/.ssh/id_rsa
) -
主机验证:首次连接到新主机时,scp会提示验证主机密钥。在自动化脚本中使用时,可以使用
StrictHostKeyChecking=no
选项,但这会降低安全性。 -
密码认证:尽量使用密钥认证而不是密码认证,特别是在自动化脚本中。
-
敏感数据:传输敏感数据时,确保使用加密(默认启用)。
-
网络安全:在公共网络上使用scp时要格外小心。
常见问题排查 #
1. 权限被拒绝 #
Permission denied (publickey,password).
可能的原因:
- 认证失败(密码错误或密钥未被接受)
- 目标目录没有写入权限
解决方法:
- 检查认证方式(密码或密钥)
- 检查目标目录权限
- 使用
-v
选项获取详细错误信息
2. 找不到文件或目录 #
No such file or directory
可能的原因:
- 源文件不存在
- 目标目录不存在
解决方法:
- 检查源文件路径
- 确保目标目录存在(可能需要先创建)
3. 主机密钥验证失败 #
Host key verification failed.
可能的原因:
- 远程主机的SSH密钥已更改
- 可能的中间人攻击
解决方法:
- 验证主机身份后更新known_hosts文件:
ssh-keygen -R hostname
- 如果确认安全,可以使用:
scp -o "StrictHostKeyChecking=no" ...
提示 #
- 使用
~/.ssh/config
文件可以简化scp命令,与ssh类似 - 对于大文件或需要断点续传的情况,考虑使用rsync
- 使用压缩(
-C
选项)可以加速在低带宽网络上传输文本文件 - 在传输大量小文件时,先打包(使用tar)再传输通常更高效
- 使用
-l
选项限制带宽可以避免scp占用全部网络资源 - 对于频繁的文件传输,考虑设置SSH密钥认证以避免重复输入密码
- 在脚本中使用scp时,添加错误处理和日志记录
- 使用
-p
选项保留文件时间戳和权限,对于备份特别有用