scp 命令

scp (Secure Copy) 是一个基于 SSH 协议的安全文件传输命令行工具,它可以在本地和远程服务器之间或者两个远程服务器之间安全地复制文件和目录。

基本语法

bash
scp [选项] [源路径] [目标路径]

路径格式

  • 本地路径:直接使用文件或目录的路径,如 file.txt/path/to/file.txt
  • 远程路径:格式为 [用户名@]主机名:文件路径,如 user@example.com:file.txtuser@example.com:/path/to/file.txt

常用选项

选项 描述
-r 递归复制整个目录
-P 指定远程主机的 SSH 端口号
-p 保留文件的权限、时间戳等属性
-q 静默模式,不显示传输进度
-v 详细模式,显示传输过程的调试信息
-i 指定用于认证的 SSH 私钥文件
-C 启用压缩传输
-l 限制传输带宽(以 Kbit/s 为单位)

示例用法

1. 从本地复制文件到远程服务器

bash
scp file.txt user@example.com:/path/to/destination/

2. 从远程服务器复制文件到本地

bash
scp user@example.com:/path/to/file.txt /local/path/

3. 从本地复制目录到远程服务器

bash
scp -r local_directory user@example.com:/path/to/destination/

4. 从远程服务器复制目录到本地

bash
scp -r user@example.com:/path/to/remote_directory /local/path/

5. 在两个远程服务器之间复制文件

bash
scp user@server1:/path/to/file.txt user@server2:/path/to/destination/

6. 使用特定端口复制文件

bash
scp -P 2222 file.txt user@example.com:/path/to/destination/

7. 使用 SSH 密钥文件复制文件

bash
scp -i ~/.ssh/id_rsa file.txt user@example.com:/path/to/destination/

8. 复制多个文件到远程服务器

bash
scp file1.txt file2.txt user@example.com:/path/to/destination/

9. 复制所有 .txt 文件到远程服务器

bash
scp *.txt user@example.com:/path/to/destination/

注意事项

  1. 权限问题:确保你对源文件有读取权限,对目标路径有写入权限
  2. 文件覆盖:如果目标路径已存在同名文件,scp 会自动覆盖而不提示
  3. 端口问题:如果远程服务器使用非默认 SSH 端口(默认是 22),必须使用 -P 选项指定端口
  4. 大文件传输:对于非常大的文件,可以考虑使用 -C 选项启用压缩以提高传输效率
  5. 带宽限制:在网络带宽有限的情况下,可以使用 -l 选项限制传输速度
  6. 目录传输:传输目录时必须使用 -r 选项,否则只会复制目录本身而不会复制其中的内容
  7. 特殊字符:如果路径中包含空格或特殊字符,需要使用引号将路径括起来
  8. SSH 配置:可以在 ~/.ssh/config 文件中配置主机别名、端口等信息,简化 scp 命令的输入

与其他工具的比较

  • scp vs cp:scp 用于远程文件传输,cp 用于本地文件复制
  • scp vs rsync:rsync 提供了更多高级功能,如增量传输、进度显示更详细等,但 scp 的语法更简单,使用更广泛
  • scp vs sftp:sftp 提供了交互式的文件传输界面,而 scp 主要用于非交互式的命令行传输

常见问题

问题:Permission denied (publickey)

解决方法:确保你使用的 SSH 密钥文件有正确的权限(通常是 600),并且公钥已添加到远程服务器的 ~/.ssh/authorized_keys 文件中。

问题:Host key verification failed

解决方法:这通常是因为远程主机的 SSH 密钥发生了变化。可以通过编辑 ~/.ssh/known_hosts 文件删除对应的条目,或者使用 -o StrictHostKeyChecking=no 选项暂时绕过检查(不推荐用于生产环境)。

问题:scp 命令执行很慢

解决方法:尝试使用 -C 选项启用压缩,或者使用 -l 选项限制带宽。如果网络连接不稳定,可以考虑使用 rsync 命令替代。

最后更新:2026-02-07