scp(Secure Copy Protocol)常被当作Linux和macOS主机之间传文件的默认工具。它不需要额外安装FTP服务,只要两端能通过SSH登录,就能用同一条命令完成加密复制。很多人觉得scp难,是因为命令里的冒号、路径和参数容易混淆,一旦理解了谁到谁的方向,大部分使用场景都能套用固定格式。

scp的运行基础:先有SSH,后有复制
scp本质上是在调用ssh进行数据传输,因此本地和远程主机都需要运行sshd服务,并且账号具备登录权限。传输过程会对内容和认证信息进行加密,比传统的ftp明文传输更安全。与ftp不同,scp不需要单独开放21端口,只要22端口可达即可。如果服务器出于安全考虑修改过SSH端口,scp也必须用大写-P参数指定新端口,否则会连接失败。
依赖条件还包括本地要有scp命令,通常安装openssh-clients包即可。Windows 10及以上版本可以在PowerShell或CMD中直接使用OpenSSH自带的scp,老版本Windows则需要安装WinSCP或PuTTY的pscp。验证命令是否可用很简单:在终端输入scp不带任何参数,如果能显示用法说明,就说明安装正常。另外scp在传输前会校验目标目录的写权限,如果权限不足会直接报Permission denied,而不是创建临时文件,这一点在排查问题时非常关键。
三种传输方向与常用命令格式
第一次接触scp,建议先把方向拆成三类。第一种是本地到远程,命令格式为:scp [参数] 本地文件 用户名@远程IP:目标路径。例如执行scp -P 2222 ./app.tar.gz root@192.168.1.10:/opt/backup/,表示把当前目录的app.tar.gz上传到目标服务器的/opt/backup目录。如果目标路径是目录,结尾要加斜杠;如果不写目标文件名,默认使用原文件名。
第二种是远程到本地,格式为:scp 用户名@远程IP:远程文件 本地路径。例如scp root@192.168.1.10:/var/log/nginx/error.log ./logs/,会把远端日志下载到本地logs目录。第三种是远程到远程,格式为:scp 用户A@主机A:/文件 用户B@主机B:/目录。此时数据从A直接传到B,但认证信息会经过发起命令的机器。如果带宽紧张,不建议使用远程到远程,先拉到本地再上传反而更稳定。
参数方面有几个容易混淆的点,整理如下。
| 参数 | 作用 | 示例 |
|---|---|---|
| -P | 指定远程主机的SSH端口,注意是大写P | scp -P 2222 file user@host:/tmp/ |
| -p | 保留文件修改时间、访问时间和权限 | scp -p file user@host:/tmp/ |
| -r | 递归复制整个目录 | scp -r ./config user@host:/etc/ |
| -C | 传输时启用压缩,适合文本和大文件 | scp -C large.log user@host:/tmp/ |
| -l | 限制带宽,单位Kbit/s | scp -l 8192 file user@host:/tmp/ |
| -v | 显示调试信息,用于排查失败原因 | scp -v file user@host:/tmp/ |
大写-P和小写-p只差一个字母,但作用完全不同。很多教程只记参数不强调大小写,实际敲错就会报错。参数可以合并使用,例如scp -rC ./site user@host:/var/www/表示递归压缩上传。目标路径写错是另一个高频问题,建议先用ssh登录确认目录存在,再执行scp。
常见疑问集中解答
连接超时或卡住不动怎么办?第一步先测试ssh是否能登录,再看目标IP和端口是否正确。使用-v参数可以查看卡在哪个阶段,常见原因包括防火墙未放行、安全组未开放端口、DNS反解过慢。可以在ssh配置里关闭UseDNS,或者使用-o ConnectTimeout=10设置连接超时,避免长时间无响应。
文件路径包含空格如何处理?将整个路径用引号括起来,或者用反斜杠转义空格。例如scp "my file.txt" user@host:"/home/user/my data/"。如果不加引号,shell会把空格前后的内容当成两个参数,导致文件找不到。
known_hosts冲突怎么解决?目标主机重装系统后host key会变化,scp可能拒绝连接并提示REMOTE HOST IDENTIFICATION HAS CHANGED。确认服务器确实重装后,可以执行ssh-keygen -R 目标IP删除旧记录,再重新连接。不要轻易忽略这个提示,以免遭遇中间人攻击。
传大文件有没有更好选择?scp是单线程传输,遇到网络抖动可能中断且不支持断点续传。超过几个GB的文件建议用rsync -avzP替代,它可以增量传输、断点续传,速度也更稳。对于需要加密且内网环境稳定的场景,scp依然足够轻量。
Windows本地路径反斜杠总报错?Windows下scp本地文件可以写C:\Users\name\file.txt,但部分终端需要写成C:/Users/name/file.txt或加引号。远程路径始终使用Linux斜杠,不要把Windows反斜杠和远程路径混用。
少走弯路:实用的操作建议
先测SSH再传文件。scp的大多数失败本质是SSH不通。一条ssh -p 端口 用户@主机命令能排除大部分网络和认证问题,避免在scp报错上浪费大量时间。
目录上传一定加-r,否则会报not a regular file。目标目录末尾的斜杠也不要丢,缺斜杠可能被当成文件名,导致复制后改名,甚至覆盖已有文件。传输敏感文件后建议手动校验:远端执行sha256sum 文件名,和本地比对,虽然scp传输过程加密,但完整性校验能进一步确保文件没有损坏。
掌握scp的基本命令和方向后,日常传文件完全可以不依赖额外工具。遇到错误时,先看权限、端口、路径三件事,再用-v细化定位。希望这篇介绍能帮你少踩坑,更快上手。