scp(Secure Copy Protocol)是一个用于在本地计算机与远程计算机之间或两个远程计算机之间安全地复制文件和目录的命令行工具。它基于 SSH(Secure Shell)协议,提供加密和认证,因此比传统的 rcpftp 更安全。scp 通常用于 Linux、Unix 和类 Unix 系统,如 macOS 和 WSL 中。

1. scp 基本语法

scp [OPTION] <source> <destination>

  • <source>:源文件或目录的路径,可以是本地路径或远程路径。
  • <destination>:目标文件或目录的路径,也可以是本地路径或远程路径。

2. scp 传输文件的几种常见格式

  1. 从本地到远程scp /path/to/local/file username@remote:/path/to/remote/directory
    • 将本地的文件 /path/to/local/file 复制到远程服务器上的 /path/to/remote/directory 目录中。
    • username:远程服务器的用户名。
    • remote:远程服务器的主机名或 IP 地址。
  2. 从远程到本地scp username@remote:/path/to/remote/file /path/to/local/directory
    • 将远程服务器的文件 /path/to/remote/file 复制到本地计算机的 /path/to/local/directory 目录中。
  3. 从远程到远程scp username@remote1:/path/to/remote/file username@remote2:/path/to/remote/directory
    • 将远程主机 remote1 上的文件 /path/to/remote/file 复制到远程主机 remote2 上的 /path/to/remote/directory 目录中。
  4. 复制整个目录
    • 使用 -r 选项递归复制目录。
    scp -r /path/to/local/directory username@remote:/path/to/remote/directory
    • 将本地的整个目录 /path/to/local/directory 复制到远程服务器上的指定目录。

3. 常见选项

  • -r:递归复制整个目录。
    • 如果需要复制一个目录而不是单个文件,必须加上 -r 选项。
    scp -r /local/directory username@remote:/remote/directory
  • -p:保留文件的时间戳、权限等元数据。
    • 使用此选项可以保留文件的修改时间和权限设置。
    scp -p /path/to/local/file username@remote:/path/to/remote/file
  • -C:启用压缩。
    • 使用压缩可以加速传输,特别是在网络带宽较低时。
    scp -C /path/to/local/file username@remote:/path/to/remote/file
  • -i:使用指定的 SSH 密钥文件进行身份验证。
    • 如果 SSH 需要通过密钥而不是密码认证,可以使用 -i 指定私钥文件。
    scp -i /path/to/private_key /path/to/local/file username@remote:/path/to/remote/file
  • -v:启用详细模式。
    • 输出调试信息,帮助排查连接或传输过程中的问题。
    scp -v /path/to/local/file username@remote:/path/to/remote/file
  • -P:指定远程主机的端口号。
    • 如果远程服务器的 SSH 服务使用非默认端口,可以通过 -P 选项指定端口。
    scp -P 2222 /path/to/local/file username@remote:/path/to/remote/file

4. scp 的工作原理

  • 加密scp 基于 SSH 协议进行数据传输,所有的传输内容都经过加密,因此在网络上传输时比较安全。
  • 身份验证scp 会通过 SSH 进行身份验证,支持用户名/密码和基于密钥的认证。
  • 传输性能scp 默认使用加密,但这会增加一定的 CPU 开销。对于大文件传输,考虑使用 rsync(带有 -z 选项的压缩传输)或直接使用其他更优化的工具。

5. 示例

  1. 将本地文件上传到远程服务器scp /home/user/test.txt username@192.168.1.100:/home/username/documents/
    • 这个命令会将本地的 test.txt 文件上传到远程服务器 192.168.1.100/home/username/documents/ 目录中。
  2. 将远程文件下载到本地scp username@192.168.1.100:/home/username/test.txt /home/user/downloads/
    • 这个命令会将远程服务器 192.168.1.100 上的 test.txt 文件下载到本地 /home/user/downloads/ 目录。
  3. 使用 SSH 密钥传输文件scp -i /path/to/private_key /path/to/local/file username@remote:/path/to/remote/file
    • 这个命令会使用指定的 SSH 密钥 /path/to/private_key 连接到远程服务器,并上传文件。
  4. 递归复制目录scp -r /local/directory username@remote:/remote/directory
    • 该命令将本地目录 /local/directory 递归地复制到远程服务器上的 /remote/directory 目录。
  5. 通过指定端口传输文件scp -P 2222 /path/to/local/file username@remote:/path/to/remote/file
    • 如果远程服务器的 SSH 服务运行在非默认端口(例如 2222),可以使用 -P 选项指定端口号。

6. 安全性考虑

  • 认证:使用 SSH 密钥认证比使用密码认证更加安全。确保在 SSH 配置中禁用密码认证,只允许使用密钥对进行连接。
  • 传输加密scp 会自动加密文件传输,确保传输过程中数据不会被泄露或篡改。
  • 防火墙和权限设置:确保只有受信任的 IP 地址和用户才能访问远程服务器,设置合理的防火墙和权限策略。

7. scprsync 比较

虽然 scp 非常方便,但在某些场景下,rsync 是一个更优秀的选择:

  • 增量传输rsync 支持增量传输,只传输有更改的部分,而 scp 每次传输都会传输整个文件。
  • 性能rsync 在传输大文件时表现更好,尤其是在带宽有限的情况下。
  • 灵活性rsync 提供了更多的选项,如数据压缩、同步删除等功能。

对于大规模文件同步或频繁传输的情况,rsync 更为高效。


总结

scp 是一个安全、简单的文件传输工具,适用于大多数基于 SSH 的文件传输需求。它的优点是使用方便、支持加密,但对于大文件或高效传输,rsync 可能是更好的选择。