ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Linux服务器文件上传全攻略:scp、rsync与SFTP实战指南

Linux服务器文件上传全攻略:scp、rsync与SFTP实战指南 刚接触云服务器或公司内网Linux主机的人几乎都会卡在同一个问题上本地资料已经准备好了怎么把它放到服务器上我第一次部署网站时也在这上面绕了不少弯路——以为是某个特别高端的技术查了一堆资料最后真正解决的还是同事敲的一条 scp 命令。结论其实很简单只要你能用 SSH 登录服务器基本就等于自带了文件上传通道。这篇文章就把我日常用的各类上传文件到 Linux 服务器的方法整理成体系从 Windows 到 macOS/Linux从单个文件到几万个文件的目录从命令行到图形工具一次讲透。适合刚买云服务器、正在部署网站的新手也适合需要定期同步服务器的运维同学参考。1. 传文件之前先把这三件事想清楚很多教程上来就丢命令但如果你连自己处在什么环境、服务器开了哪些服务、文件是什么形态都没确认很容易把简单事情搞复杂。我习惯在动手前先花一分钟确认三件事这三件事直接影响你该用哪个工具。1.1 先分清是系统级传输还是应用级上传这里要澄清一个容易被搜索词带偏的误区。有些人搜上传文件到服务器实际是想在 JMeter 里测一个 HTTP 上传接口或者在 Web 系统里提交附件那种场景走的是 HTTP multipart 协议服务器端需要跑 Web 应用才能接收。本文讨论的是系统级文件传输也就是把文件从你的电脑复制到 Linux 主机的磁盘上走的多是 SSH、SFTP、FTP 或 rsync 协议。区分清楚这点后面所有操作才有的放矢。1.2 你的电脑是什么系统服务器开放了哪些服务从 Windows、macOS、Linux 桌面端发起上传工具和命令是不同的。Windows 10/11 其实自带 OpenSSH 客户端直接可以用 scp 命令macOS 和 Linux 更是天生就带 scp、rsync、sftp 这几个标配命令。服务器端则要看门开在哪里。只要你能正常 SSH 登录那么 scp 和 SFTP 一定可用因为它们是 SSH 协议自带的传输能力不需要额外安装任何东西。FTP 则需要服务器上装了 vsftpd 之类的服务而且默认 21 端口、被动模式、防火墙规则都是坑rsync 依赖服务端装了 rsync 命令才能工作。我的建议是能用 SSH 通道的场合一律不走 FTP少一道配置就少一个出错点。1.3 文件本身长什么样单文件、目录还是超大文件这一点直接决定传输策略。传一个配置文件或安装包用 scp 就够了传一个包含几万个小文件的网站目录最好用 rsync 或先打包再传传几十GB的数据库备份则要考虑分卷和断点续传。把它们都搞明白之后你再看下面不同系统的操作会发现其实都是围绕这几个要素展开的。下表是个快速选型参考可以存一下方式底层协议适合场景服务器端是否需要额外配置scpSSH单文件、小规模临时传输不需要SFTPSSH交互式浏览、图形工具传输不需要rsyncSSH默认目录同步、断点续传、增量备份需安装 rsync 命令FTP/SFTP 图形工具FTP / SSH不熟悉命令行的用户FTP 需另装服务Web 网盘中转HTTPS无公网直连的服务器依赖外部存储服务2. Windows 传 Linux从自带 scp 到图形化工具Windows 用户上传文件有两条主流路线一是用系统自带的 scp 命令二是用 WinSCP 这样的图形工具。两种我都长期用过这里把细节和坑都写出来。2.1 不装任何软件Windows 自带的 scp 命令Windows 10 1809 之后的版本自带 OpenSSH 客户端你可以直接在 CMD 或 PowerShell 里敲 scp。基本格式是scp -P 22 C:\Users\用户名\Desktop\backup.zip root192.168.1.10:/data/注意几个只有用 Windows 时才会踩到的点。第一指定 SSH 端口用的是大写-P小写-p在 scp 里是保留文件修改时间的参数写错会直接报错。第二本地路径含空格或中文时一定要加双引号否则会被拆成多个参数。第三如果本地用户名是中文比如张三部分终端编码可能导致路径解析异常我习惯先cd /d D:\temp切到临时目录再用相对文件名避免路径编码问题。命令执行后会提示输入密码输入时屏幕不会显示任何字符这是正常现象。如果服务器改了 SSH 端口记得把 22 改成实际端口。2.2 图形化工具怎么配以 WinSCP 为例对不习惯命令行的朋友WinSCP 是我推荐的首选图形工具免费、轻量、支持断点续传。安装后新建站点时协议选 SFTP主机名填 IP端口填 22用户名密码按服务器实际账号填写。首次连接会弹出主机密钥指纹确认这是因为 SSH 客户端要校验服务器身份确认无误后勾选记住即可以后不会再问。连接成功后左边是本地目录右边是远程目录直接拖拽文件就能上传。WinSCP 默认支持断点续传传输过程中网络断了重新连接再传同一个文件它会自动从断点继续这个特性对几百MB以上的文件非常友好。如果只想临时下载文件Xftp、FileZilla 的操作逻辑也几乎一样选一个熟练即可。2.3 网站程序上传后的权限与属主问题这是我最常替新手排障的问题WordPress 或 PHP 项目在本地用 WinSCP 拖上服务器访问页面出现 500 错误。原因通常是 Windows 客户端上传的文件在 Linux 上默认权限不对或者属主不是 Web 服务运行用户。排查时先看文件属主和权限ls -la /var/www/site/正常 PHP 站点目录的期望状态是目录权限 755文件权限 644属主为www-data或站点配置的用户。调整命令如下chown -R www-data:www-data /var/www/site/ find /var/www/site -type d -exec chmod 755 {} \; find /var/www/site -type f -exec chmod 644 {} \;如果站点有运行时写入目录如runtime/、uploads/再单独加一条chmod -R 775 /var/www/site/runtime/WinSCP 在传输设置里也可以预设上传权限但我更建议在服务器上统一修正因为不同框架对权限的要求差异很大按项目实际需求批量调整最稳。2.4 隐藏文件别丢两个容易忽略的设置很多人在 WinSCP 上拖完整个目录服务器上却没有.env、.htaccess、.gitignore这类隐藏文件项目跑起来各种报错。原因有二要么是 WinSCP 默认没显示隐藏文件拖拽时漏了要么是把文件从 Windows 资源管理器拖到 WinSCP 窗口时资源管理器本身就没显示隐藏项。我的操作习惯是连接后先按CtrlAltH切换显示隐藏文件或者打开选项 偏好设置 面板勾选显示隐藏文件。上传完成后再用ls -la抽查一遍关键隐藏文件是否到位。曾经有个项目因为缺了.env所有数据库连接全部失败排查了大半天最后发现就是拖拽时漏了隐藏配置——这种低级错误犯一次就能记住一辈子。3. Linux 与 macOS 原生命令scp 和 rsync 的取舍如果你用的是 macOS 或 Linux 桌面版那直接打开终端操作就好系统自带的命令足够解决 90% 的上传需求。这一章的重点是搞清楚 scp 和 rsync 各自适合干什么别用错。3.1 scp 适合什么场景命令怎么写scp 的语法和 cp 很像只是目标变成远端的。上传单个文件scp /tmp/backup.tar.gz user192.168.1.10:/data/下载单个文件则是把源和目标调换scp user192.168.1.10:/data/backup.tar.gz /tmp/传目录加-r需要指定端口加-P想顺手压缩加-C。但我要说实话scp 只适合临时传一两个文件。它的劣势在于不支持断点续传传大文件时一旦网络抖动断了就得从头再来也不擅长增量同步重复传同一目录会全量再传一遍。这些场景交给 rsync 更合适。3.2 rsync增量同步和断点续传才是王道rsync 是我日常使用频率最高的上传工具核心价值是两点增量同步和断点续传。增量同步意味着第二次传同一目录时只有变化的部分会被传输断点续传意味着传大文件断了重新执行命令会从断点继续而不是重头再来。最常用的命令格式rsync -avzP /local/dir/ user192.168.1.10:/data/参数含义-a归档模式保留权限、属主、时间戳等属性-v显示传输详情-z传输时压缩-P等价于--partial --progress既支持断点续传又显示进度条。这里有个细节必须提醒源路径末尾是否加斜杠结果完全不一样。rsync -avzP /local/dir/ userhost:/data/会把dir里的内容同步到/data/而rsync -avzP /local/dir userhost:/data/会把dir整个目录放到/data/dir。我早期搞混过一次把网站文件全都多套了一层目录。想清楚你期望的目标结构再写路径。如果要做发布式同步可以加--delete让远程目录里存在而本地已删除的文件也被删掉。但首次迁移千万别加等确认两边状态一致再用于后续发布。3.3 Linux 桌面版怎么传文件管理器直接访问远程目录如果你用的是 Ubuntu 22.04 这类桌面版 Linux有个常常被忽略的方法在文件管理器地址栏直接输入sftp://192.168.1.10/home/user回车后输入密码远程目录就会以本地文件夹的形式展开直接复制粘贴即可。这种方式的优势是直观适合偶尔传几个文件的人。更进阶的用法是挂载 SSH 文件系统sudo apt install sshfs mkdir -p ~/mnt_remote sshfs user192.168.1.10:/data ~/mnt_remote挂载完成后远程目录就像 U 盘一样出现在本地可以随便操作。用完取消挂载fusermount3 -u ~/mnt_remote但注意SSHFS 走的是交互式连接传输性能和稳定性不如 rsync不适合一次性同步大量文件更适合长期开着做日常维护。4. 大文件与海量小文件的上传策略日常传单个文件谁都会但遇到几百 GB 备份或一个目录几万个小文件时直接 scp 很容易翻车。这一章讲我用过且验证可行的策略。4.1 海量小文件先打包再传一个网站目录里动辄几万张图片、静态页、缓存文件直接 rsync 会非常慢。因为每个文件都要单独建立协议交互文件越多握手开销越大。我的做法是先在源机器上打包压缩再把压缩包传过去最后在服务器上解压。打包时养成一个好习惯先进入目标目录的父级再打包相对路径避免解压时多套一层目录。tar -czf site.tar.gz -C /var/www site-C的意思是在执行前先切换到/var/www目录这样包内路径是site/xxx而不是/var/www/site/xxx。传到服务器后解压tar -xzf site.tar.gz -C /var/www/当然如果服务器后续需要频繁增量更新那单独用 rsync 同步变更文件更方便因为打包解压是全量操作做不到增量。4.2 超大单文件分卷与合并单个文件超过几十 GB比如数据库备份、虚拟机镜像一次性传输的风险在于任何一次网络抖动都可能导致整个传输失败。我通常会把它分卷成多个 2GB 左右的小块再逐个传输。分卷命令split -b 2G backup.sql backup.sql.vol_这会生成backup.sql.vol_aa、backup.sql.vol_ab等一组文件。用 rsync 全部传上去之后在服务器端合并cat backup.sql.vol_* backup.sql合并后务必校验哈希确认分卷传输没有损坏sha256sum backup.sql源机器上也执行同样的校验两边哈希一致说明文件完整。如果是打包超大目录后分卷还可以直接用一条管道组合tar -czf - /data | split -b 2G - backup.tar.gz.vol_注意最后的-表示从标准输入读、写到分卷文件这样不会额外占用一份磁盘空间。4.3 断点续传的完整操作与免密脚本断点续传最省心的实现就是 rsync 的-P参数。我传 30GB 的数据库备份时常用这条命令rsync -avzP dump.sql user192.168.1.10:/data/传输中断后重新执行同一条命令rsync 会自动识别已传的部分并从断点继续。如果希望传输在本地终端关闭后依然运行可以在本地加nohupnohup rsync -avzP dump.sql user192.168.1.10:/data/ rsync.log 21 再通过tail -f rsync.log看进度。但要注意nohup要挂在发起传输的那台机器上而不是服务器上。对于需要定时同步的场景配置 SSH 密钥免密登录会更顺手ssh-keygen -t ed25519 -N -f ~/.ssh/id_ed25519 ssh-copy-id user192.168.1.10这样后续 scp、rsync 都不需要输密码可以放心写进定时任务。5. 上传失败的典型场景与完整排查链路传文件失败的报错五花八门但九成以上集中在权限、端口、断点、编码这四类。这里把常见场景和排查思路完整列出来遇到问题可以按顺序走一遍。5.1 Permission denied不是密码错是写权限不够Permission denied (publickey,password)是最常见的报错。很多人第一反应是密码错其实还有两个容易忽视的原因一是服务器的 sshd 配置禁用了密码登录只允许密钥登录二是目标目录对当前用户没有写权限。排查流程先用ssh -v userip看 SSH 认证详情确认走的是哪种认证方式然后登录服务器查看目录权限ls -ld /data目录的属主如果显示 root而你用普通用户上传一定会失败。解决方法是让管理员把目录属主改给你或者把上传用户切到有写权限的账号sudo chown -R user:user /data还要注意一个误区sudo scp并不能提升远程写入权限sudo 只作用于本地命令远程目录有没有写权限取决于远程账号本身。5.2 连接超时或连接被拒绝先查端口和安全组Connection timed out和Connection refused含义不同超时通常是网络路径不通或防火墙丢包被拒绝多数是端口没监听或安全组直接拒绝。排查顺序建议是ping → telnet → ssh -v。ping 192.168.1.10 telnet 192.168.1.10 22如果 ping 通但 telnet 22 不通大概率是云服务器安全组没有放行 22 端口或者本机防火墙拦截了出站连接。云服务器要去控制台检查安全组规则本地服务器则检查 firewalld / ufwsudo firewall-cmd --list-ports sudo ufw status有的服务器禁 ping但并不代表连接有问题这时直接用 telnet 判断更准确。5.3 传到一半断了续传的正确姿势普通 scp 中断后没有任何办法续传只能重来。所以大文件我几乎不用 scp而是用 rsync-P。如果已经用 scp 传了一半别慌马上改用 rsync 重跑同一条 rsync 命令它会在 scp 留下的部分文件基础上继续传输吗严格来说不行rsync 会重新对比源和目标至少能跳过已经完整传输的部分比 scp 从头再来好很多。如果终端网络不稳定导致 SSH 频繁断开可以给 rsync 加超时参数rsync -avzP --timeout30 bigfile userip:/data/再配合nohup或tmux挂在后台传输会话就不会因为终端窗口关闭而中断。建议在本地开 tmux 再执行传输随时可以回来查看进度tmux new -s upload rsync -avzP bigfile userip:/data/然后按Ctrlb d脱离之后用tmux attach -t upload回来。5.4 中文文件名乱码千万别硬广为传Windows 本地文件名默认是 GBK 编码Linux 使用 UTF-8直接把测试报告.zip传到服务器文件名很可能变成????.zip或乱码符号。这个问题我建议从源头解决上传前把中文文件名改成拼音或英文。如果已经传上去乱码了可以用convmv批量修正编码sudo apt install convmv convmv -r -f GBK -t UTF-8 --notest /data/files/--notest表示真正执行修改首次建议先不加这个参数试运行看结果。但说实话服务器上大量乱码文件的最好解法是删除重传改编码只是补救手段。6. 特殊场景与临时方案按需选择工作中总有一些场景不适合标准 scp/rsync比如没有公网直连、临时传小文件、传输代码项目、搬运 Docker 镜像。这些情况我也有相对成熟的替代方案。6.1 SSH 终端里的 rz/sz小文件的快捷通道如果你用的是 Xshell、SecureCRT 这类终端工具服务器又装了lrzsz那rz和sz两个命令能带来最直观的体验。在服务器上执行rz会弹出本地的文件选择窗口选完文件就开始上传。下载则执行sz 服务器上的文件会直接保存到本地。这个方案适合传配置文件、日志文件、几 MB 的小压缩包并不适合大文件因为 ZMODEM 协议在大文件传输上稳定性一般断了就断了。6.2 网盘中转没有公网直连时的应急方案遇到服务器没有公网 IP、或者公司网络禁用了出站 SSH 的极端情况我会先把文件上传到对象存储或网盘再让服务器通过wget或curl拉取。典型命令curl -O https://your-bucket.example.com/backup.zip用这个方案要注意两点私有桶一定要用带有效期的签名 URL不要把密钥写在明文命令里下载完成后及时删除临时文件避免泄露。它的优势是只要服务器能访问外网就能绕过直连限制而且对象存储带宽通常比单个服务器带宽更稳。6.3 代码项目用 Git 而不是打包上传如果你的文件其实是开发代码我强烈建议不要用 scp 传 zip。代码是持续变更的每次全量打包传输既慢又容易漏文件版本还难以追踪。正确的做法是走 Git 流程本地git push到远仓库服务器上git pull。服务器上只要配好 Git 仓库的 SSH 密钥后续发版就是一行命令git pull origin main很多团队的上线脚本本质就是登录服务器后执行git pull再触发构建或者重启服务。这套流程比任何文件传输工具都适合代码交付场景。6.4 Docker 镜像和服务器之间的直接传输Docker 镜像如果目标服务器无法直接访问镜像仓库常见做法是把镜像保存成 tar 文件再搬运docker save -o nginx.tar nginx:latest然后用 scp 或 rsync 传过去目标服务器上导入docker load -i nginx.tar两台服务器之间直接传文件同样可以用 scp 和 rsync。如果必须经过跳板机使用-J参数指定跳板即可scp -J user跳板机IP backup.tar user目标IP:/data/多台服务器需要分发同一份文件时我一般先把文件传到一台中心节点再让各节点从中心节点拉取或者直接放进对象存储统一分发比一台台对连省心得多。传文件这件事我的日常习惯其实很固定临时传一两 GB 以内的文件用 rsync 加-P网站整站迁移先打包再 rsync需要定时同步配置好 SSH 密钥后直接写脚本跑 rsync。这几招配合上面的排查思路基本能覆盖日常所有上传场景。遇到报错时先看提示再按协议、端口、权限三层去定位不要一上来就急着换工具——换工具往往掩盖了真正的问题问题没解决下次换个报错继续踩。
返回列表