← 返回首页

SCP 安全复制文件:Windows、macOS 与 Linux 的基础用法

把电脑上的报告传到服务器,或者取回一份自己有权访问的日志,是 scp 的常见用途。它的命令看起来很短,但方向写反、端口字母写错、文件名中的空格没有处理好,都可能导致失败,甚至覆盖已有文件。

本文聚焦本地电脑与一台 Linux 服务器之间的复制。本地可以使用 Windows PowerShell、macOS 终端或 Linux Shell。示例主机 server.example.com 和账号 demo 都是占位符,执行前必须换成获授权使用的服务器和账号。以下内容依据官方文档整理,没有把演示命令包装成真实服务器测试。

一、先确认客户端、权限与传输模式

Windows 可以先在 PowerShell 中执行:

Get-Command scp
ssh -V

如果找不到程序,按 Microsoft 的官方说明检查 OpenSSH Client 可选组件。客户端用于主动连接其他机器;仅仅向服务器复制文件,不需要为了教程顺手在本机启用 SSH Server。微软推荐使用随 Windows 提供、通过 Windows Update 维护的 OpenSSH 功能。Windows OpenSSH 官方说明

在 macOS 或 Linux 终端中,可以先检查命令是否存在:

command -v scp
ssh -V

ssh -V 显示 SSH 客户端版本,不应被当成文件传输已经成功的证明。若系统缺少组件,应从系统支持的官方渠道安装,不要照搬陌生网页上的“下载脚本并立即执行”命令。

另一个关键区别是协议。OpenSSH 从 9.0 开始,scp 默认通过 SFTP 传输;旧教程里的双重转义方式可能不再适用。下文含空格的远端路径示例以现代 OpenSSH 的默认 SFTP 模式为前提。Windows 随系统提供的版本可能不同,应先确认本地版本,而不是仅凭系统名称判断。OpenSSH 9.0 发布说明

二、复制方向只看源与目标

基本结构是:

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

远端路径写成 账号@主机:路径。例如,把当前目录的报告上传到已经存在、且账号有写入权限的远端目录:

scp ./report.txt demo@server.example.com:/home/demo/incoming/

反过来下载,则把远端路径写在前面:

scp demo@server.example.com:/home/demo/reports/report.txt ./report-downloaded.txt

这里有意为下载文件使用不同名字,降低覆盖现有材料的机会。scp 不是一个保证自动生成备份副本的工具,运行前应检查目标文件名。目录示例也不意味着命令会替你创建缺失的父目录。scp 官方手册

建议第一次先复制一份不敏感、体积很小的样例文件。确认账号、位置和方向正确以后,再处理正式材料。不要拿包含客户数据、私钥或生产配置的文件来验证命令是否可用。

三、自定义端口用大写 P

如果管理员明确告知 SSH 服务监听 2222 端口:

scp -P 2222 ./report.txt demo@server.example.com:/home/demo/incoming/

这里是大写 -P。小写 -p 用于保留文件时间和模式信息,不是端口参数。目录复制可使用 -r,但要先检查目录中是否包含不应上传的内容;递归过程中还会跟随遇到的符号链接,不能只根据目录名字估计上传范围。scp 选项说明

日常传一两个文件时,明确写文件名通常比递归上传整个工作目录更可靠。比如一个网站项目目录可能同时存在源代码、构建结果、缓存和本地配置,你实际需要的往往只是其中一个导出文件。

四、空格文件名与 Windows 路径

macOS、Linux 的常见 Shell 中,可以给含空格的完整参数加单引号:

scp './meeting notes.txt' demo@server.example.com:/home/demo/incoming/
scp 'demo@server.example.com:/home/demo/reports/meeting notes.txt' './meeting-notes-copy.txt'

第二行的引号包住整个远端参数,防止本地 Shell 在空格处拆开它。不要随意叠加旧版 SCP 教程里的额外引号或反斜杠;现代 SFTP 模式与旧协议对远端文件名的处理不同。协议迁移说明

Windows 建议先进入本地文件目录,再使用相对路径,减少盘符和远端冒号混在一起时的阅读负担:

Set-Location 'C:\Users\YourName\Documents'
scp '.\meeting notes.txt' demo@server.example.com:/home/demo/incoming/
scp 'demo@server.example.com:/home/demo/reports/meeting notes.txt' '.\meeting-notes-copy.txt'

将 YourName 替换成自己的目录名。PowerShell 中,含空格的参数需要引号;单引号适合不需要展开变量的文字路径。请使用键盘上的普通引号,不要复制排版软件自动替换出来的弯引号。本文不覆盖文件名本身带引号、换行或通配符的复杂情况,这类文件应先单独核对路径。PowerShell 引号规则

五、首次连接不要盲目接受指纹

SSH 会核验远端主机身份。第一次连接时看到主机密钥提示,应通过管理员、可信的管理控制台或其他独立可信渠道比对指纹;确认无误后再继续。如果以前连接正常,现在出现主机身份变化警告,应先问清服务器是否更换过密钥,不要为了“让命令能跑”而关闭检查。SSH 官方手册

使用密钥登录时,私钥留在本地用于身份验证,不要把它作为上传文件发到服务器。排查问题也不需要把私钥内容粘贴到群聊、工单或教程评论区。

六、失败时按层次检查

遇到问题可以依次确认:主机名是否写对;端口是否是管理员提供的端口;账号是否有登录资格;源文件是否存在;目标目录是否存在并可写。如果出现认证错误,先核对账号和认证方式;如果提示路径不存在,重点核对服务器路径的大小写和是否误用了本地路径。

传输结束后,不要只看进度条。确认命令没有报错,再在目标位置核对文件名和大小;重要材料可以比较双方用同一种算法生成的校验值。需要向同事提供日志时,先去除账号、内部主机名及个人目录等不必要信息。

最后,传输安全与文件内容可信是两回事。加密连接能保护通信,并不保证下载到的脚本或程序适合执行。把“复制文件”和“执行文件”分成两个独立决定,是跨平台文件传输中很实用的一道安全边界。

写于此,留待再读。