想把本地文件传到 Linux 服务器,最直接的办法是在本地终端执行 scp 本地文件 用户名@服务器IP:/目标目录,输入一次密码就传完。 文件大、网络不稳,或者需要经常同步,再考虑 rsync 和图形化工具,效率差别很明显。
scp命令上传本地文件到服务器:语法与参数一次讲清
scp 全称 secure copy,跑在 SSH 协议之上,只要服务器开了 SSH、你能正常登录,这个命令基本就能用,它不需要在服务器上额外装服务端软件,这也是它成为默认选择的原因。
命令结构拆成三段看
一条标准的 scp 命令,从左到右就是三个部分:
- 本地源路径:要传的文件或目录,可以写相对路径,也可以写绝对路径。
- 远程目标地址:格式固定为
用户名@服务器IP:目标目录,中间的冒号不能漏,漏了就会被当成普通文件名。 - 可选参数:放在 scp 和源路径之间,用来控制端口、递归、压缩等行为。
举个具体例子,本机有个 report.pdf 在下载目录,服务器 IP 是 168.1.100,登录用户是 root,想放到 /data/upload/ 下:
scp ~/Downloads/report.pdf root@192.168.1.100:/data/upload/
回车后提示输入密码,输完就开始传,进度条走完即结束,目标目录必须提前存在,scp 不会自动创建多级目录,这是新手最常遇到问题的地方。
五个常用参数,记住就够用
| 参数 | 作用 | 典型场景 |
|---|---|---|
-r |
递归复制整个目录 | 传项目文件夹 |
-P |
指定 SSH 端口(大写) | 服务器改过 22 端口 |
-p |
保留文件时间戳和权限 | 迁移备份文件 |
-C |
传输时压缩 | 文本类小文件多 |
-v |
输出调试信息 | 排查连接失败 |
要注意 -P 和 -p 是两个完全不同的参数,一个管端口,一个管属性,大小写搞反会直接报错。
三类高频操作场景
传单个文件。 就是上面那条命令,最常用,没什么好展开的。
传整个目录。 加 -r:
scp -r ./myproject root@192.168.1.100:/opt/www/
这条命令会把 myproject 目录连同里面的文件一起放过去,如果目标路径写成 /opt/www/myproject,效果是目录重命名;写成 /opt/www/,则是在该目录下生成同名文件夹,差别就在结尾有没有斜杠和目录名。
本地终端在服务器上,要反过来拉文件。 把源和目标位置对调即可:
scp root@192.168.1.100:/var/log/nginx/error.log ./
最后那个 表示存到当前目录,不写会报错。
端口不是22,命令要加-P
很多云服务器为了安全会把 SSH 端口改成 2222 之类,这时命令得带上 -P 2222,并且必须紧跟在 scp 后面:
scp -P 2222 ./app.jar root@192.168.1.100:/data/
顺序写错,比如放到源路径后面,scp 会把它当成要传的文件名,直接报找不到文件。
scp和rsync哪个快?大文件与断点续传的取舍
这是实际工作中被问得最多的一类问题,两者都能传文件,但定位不一样:scp 是”传完就走”,rsync 是”算完差异再传”。
核心差异对比
| 维度 | scp | rsync |
|---|---|---|
| 传输协议 | SSH | SSH(也可配 rsync 守护进程) |
| 断点续传 | 不支持 | 支持,--partial 参数 |
| 增量同步 | 不支持,每次全量 | 支持,只传变化部分 |
| 速度 | 小文件快,大文件易中断 | 首传略慢,重传优势明显 |
| 排除规则 | 无 | 支持 --exclude |
| 适合场景 | 一次性传几个文件 | 定期备份、大目录同步 |
行业共识认为,几十 GB 以上的单文件或几十万个小文件的目录同步,rsync 的综合表现更稳。 原因很实在:网络一抖,scp 就得从头再来,而 rsync 能从断点继续。
什么时候该换rsync
出现下面几种情况,建议直接换:
- 传的过程中断过一次,不想重传几个 G。
- 同一个目录需要每周甚至每天同步一次。
- 目录里有很多日志、缓存文件,只想传代码部分。
对应命令:
rsync -avz --partial --progress ./data/ root@192.168.1.100:/backup/data/
-a 保留属性,-v 显示过程,-z 传输压缩,--partial 保留断点,--progress 显示进度,想排除某些目录,追加 --exclude='node_modules' 即可。
业内专家指出,SSH 加密本身的处理开销是这类传输方式的速度上限之一,所以无论用哪个命令,单连接跑到几十 MB/s 之后想再提升,往往得从网络带宽和加密算法入手,而不是换命令。
Windows本地文件传到Linux服务器怎么做
不少人的本地环境是 Windows,没有原生终端习惯,这时候有三条路可走。
图形化工具:WinSCP 与 FileZilla
WinSCP 是 Windows 上最常用的选择,安装后填服务器 IP、端口、用户名、密码,连上就是左右两栏的界面,左边本地、右边远程,拖拽即可完成上传,FileZilla 逻辑类似,跨平台,Mac 用户也能用。
这类工具的优势是直观,适合偶尔传文件、需要肉眼确认目录结构的场景,缺点是批量操作和自动化能力弱,传大目录时稳定性不如命令行。
Windows 10/11 自带 scp
系统自带 OpenSSH 客户端,直接按 Win + R 输入 cmd 打开命令提示符,就能用和 Linux 完全一样的语法:
scp D:\work\data.zip root@192.168.1.100:/data/
Windows 路径带盘符和反斜杠,注意别写成 Linux 风格,如果提示 scp 不是内部命令,去”设置应用可选功能”里把 OpenSSH 客户端装上。
PowerShell 与 Xftp 的补充选择
PowerShell 里同样能执行 scp,还支持 Copy-Item 配合 SSH 模块做更复杂的操作,Xftp 则是很多运维人员配合 Xshell 使用的工具,支持多标签和队列传输,适合一次要往多台服务器分发文件的场景。
传文件总失败?按这个顺序排查
- 先测连通性:
ping 服务器IP,通不通决定后面查什么。 - 再测 SSH:
ssh 用户名@服务器IP,登不上去说明端口、防火墙或密钥有问题,scp 必然失败。 - 看目标目录:路径写错、目录不存在、没有写权限,都会报
Permission denied或No such file or directory。 - 检查端口大小写:
-P没写或写反,报Connection refused。 - 确认磁盘空间:服务器分区满了,传输会在中途中断,用
df -h看一眼。 - 中文文件名乱码:本地和服务器字符集不一致时会出问题,建议关键文件用英文命名。
排查顺序遵循由外到内:网络、认证、路径、权限,逐层排除,比盲目重试有效得多。
Linux把本地文件拷贝到服务器常见问题解答
scp每次都要输密码,能免密吗
可以,本地执行 ssh-keygen -t rsa 生成密钥对,再用 ssh-copy-id 用户名@服务器IP 把公钥推到服务器,之后 scp 和 ssh 都不再询问密码,这是运维环境的标准做法,省去重复输入,也方便写进脚本做定时传输。
传文件夹报错 not a regular file 是什么原因
这条报错的意思是 scp 把目录当成了普通文件处理,原因只有一个:忘了加 -r 参数,补上递归参数后命令即可正常执行,这是 scp 对目录和文件的处理逻辑不同导致的,并非权限问题。
传输速度只有几MB/s,是命令用错了吗
多数情况下不是命令的问题,scp 的速度受限于两端带宽、网络延迟和 SSH 加密开销,跨公网传输时受运营商线路影响尤其明显,可以先在同机房内网测一次,如果内网速度正常、公网慢,瓶颈就在链路上;如果内网也慢,再检查服务器磁盘 IO 和 CPU 负载,对于需要反复传输的大体量数据,改用 rsync 配合压缩参数,实际耗时通常比反复重传的 scp 更短,这也是运维实践中逐渐形成的默认选择。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/775365.html


