掌握 SCP:在本地和远程主机之间安全传输文件

学习 scp 语法,用于安全上传、下载、递归复制、自定义 SSH 端口以及保留文件属性。

掌握 SCP:在本地与远程主机之间安全传输文件

scp 通过 SSH 在机器之间复制文件。当你需要快速安全地上传或下载,并且已经拥有服务器的 SSH 访问权限时,它非常有用。

对于大型同步任务、中断传输或重复部署,rsync 通常是更好的工具。对于简单的一次性复制,scp 简单易用,并且大多数类 Unix 系统都支持。

基本语法

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

本地路径看起来像普通的文件路径。远程路径使用以下格式:

[用户@]主机:/路径/到/文件

如果省略 用户@scp 会使用你的本地用户名进行 SSH 登录。如果远程 SSH 服务器使用非默认端口,请使用大写 -P 传递端口号。小写 -p 表示保留文件属性。

上传文件

要将本地文件复制到远程服务器:

scp local_report.txt [email protected]:/home/remote_user/documents/

这会将当前目录下的 local_report.txt 发送到远程的 documents 目录。

要在上传时重命名文件,请包含目标文件名:

scp local_report.txt [email protected]:/home/remote_user/documents/report-2026.txt

下载文件

要将远程文件复制到当前本地目录:

scp [email protected]:~/server_log.tar.gz .

要以不同的本地名称保存:

scp [email protected]:~/server_log.tar.gz ./prod-server-log.tar.gz

递归复制目录

使用 -r 复制目录树:

scp -r local_project_folder [email protected]:/var/www/

这会将目录及其内容复制到目标位置。请注意,scp -r 会跟随遍历过程中遇到的符号链接,这可能会复制超出预期的数据。

使用自定义 SSH 端口

如果 SSH 监听端口 2222,请使用大写 -P

scp -P 2222 local_config.ini [email protected]:/tmp/

你也可以将端口放入 SSH 配置中,然后使用主机别名:

Host prod-web
  HostName remote.example.com
  User user
  Port 2222

然后:

scp local_config.ini prod-web:/tmp/

保留时间和模式

使用小写 -p 保留源文件的修改时间、访问时间和文件模式位:

scp -p important_script.sh user@server:/tmp/

通常不会像归档工具那样保留所有权。如果所有权很重要,请在传输后设置,或使用为此需求设计的部署流程。

使用详细模式进行故障排除

使用 -v 查看 SSH 连接详细信息:

scp -v large_backup.zip user@server:/backups/

详细输出有助于诊断身份验证失败、SSH 配置问题、主机密钥问题以及意外端口。

在需要时启用压缩

-C 将 SSH 压缩传递给连接:

scp -C logs.txt user@server:/tmp/

在较慢的链路上处理文本密集型数据时,压缩可能有所帮助。对于已经压缩的文件(如 .zip.gz.jpg.mp4),压缩可能没有太大帮助。

在两个远程主机之间复制

你可以使用 scp 和两个远程路径:

scp user_a@server_alpha:/data/db.sql user_b@server_beta:/backup/

在当前 OpenSSH scp 中,远程到远程的复制默认通过你的本地机器传输。仅当你希望源主机直接连接到目标主机时,才使用 -R

scp -R user_a@server_alpha:/data/db.sql user_b@server_beta:/backup/

使用 -R 时,源主机必须能够在不提示输入密码的情况下向目标主机进行身份验证。

避免常见错误

引用包含空格的远程路径:

scp "local file.txt" 'user@server:/tmp/local file.txt'

当本地文件名包含冒号时,使用绝对路径或明确相对的本地路径,因为 scp 会将 host:path 视为远程路径:

scp ./report:final.txt user@server:/tmp/

在以 root 身份复制或复制到系统目录之前,请仔细检查目标路径。在正常使用中,scp 会覆盖现有目标文件而不会询问。

SCP 还是 Rsync?

使用 scp 进行简单的安全复制:

  • 上传一个文件。
  • 下载一个归档文件。
  • 一次性复制一个小目录。
  • 在仅 SSH 环境中移动数据。

当你需要可恢复传输、高效重复同步、删除处理、排除模式、校验和或更好的进度控制时,请使用 rsync

要点

使用 scp 源路径 目标路径 进行基于 SSH 的快速文件传输。添加 -r 用于目录,-P 用于自定义 SSH 端口,-p 用于保留时间和模式,以及 -v 用于排查 SSH 连接问题。