十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

MacBook 与服务器文件传输全攻略:命令行、图形工具与踩坑指南

MacBook 与服务器文件传输全攻略:命令行、图形工具与踩坑指南 MacBook 和服务器之间的文件传输看起来是个老生常谈的话题但群友问得特别频繁。有人卡在 scp 命令的参数上有人不知道除了命令行还有更顺手的工具还有人传大文件传到一半中断后整个人都麻了。这篇文章我就结合自己平时在 MacBook 上做服务器运维和部署的实际经验把常用的几种上传、下载操作从头到尾捋一遍包括命令、工具、踩坑记录和适用场景争取让你看完之后直接能上手。1. 先厘清场景MacBook 和服务器之间传文件到底有哪些路可以走1.1 为什么这个需求这么常见我自己日常的工作流里有大量场景需要跟服务器交换文件本地写完的脚本要丢到服务器上跑、服务器上生成的日志和数据要拉回本地分析、用 Figma 切完的图要传到团队服务器、甚至有时候只是临时想从云服务器上下载一个配置文件改两笔再传回去。只要你不是天天只在本地开发、跟服务器零接触那么“怎么把文件弄上去、怎么把文件拉下来”这件事就绕不开。很多刚接触服务器的朋友会下意识以为传文件必须用某种特定的“上传工具”其实在 macOS 生态里你能走的路非常多而且各有各的适用场景。从最底层的命令行走起到图形化客户端再到借助 Git 仓库和 IDE 内置能力每一条路我都实际用过也踩过不少坑。1.2 选择思路先看服务器上开了什么服务再看你要传什么这是我在无数个“为什么我传不上去”的问题里总结出的最核心的判断逻辑。你用什么方式传文件第一决定因素不是你的电脑是什么系统而是服务器上跑了什么服务。如果服务器只开了 SSH那你基本就是在 scp、sftp、rsync 这三兄弟里选如果服务器上有 Web 服务或者对象存储你可以走 HTTP 上传如果你跟同事共用 Git 仓库那 git push / git pull 本身就是一种文件传输如果服务器上装了 VS Code Server那你甚至不用“传文件”直接远程改文件就行。第二个要考虑的因素是文件特征单个小文件、几十个配置文件、几个 G 的大压缩包、成千上万的小文件目录这些场景对应的最优方案完全不同。一次传一个 2MB 的配置文件你没必要折腾 rsync同步一个包含 5 万个图片文件的目录你用 scp 就是自己给自己找罪受。1.3 我平时的工作流大概长什么样先交代一下我的使用习惯方便你对照参考临时传一两个小文件直接在终端敲 scp十秒内搞定需要跟服务器目录做双向同步、或者传大目录用 rsync配合 SSH 密钥免密体验很顺滑偶尔想看一眼服务器上的文件结构、拖拽下载打开 Cyberduck 或者 Termius 的文件管理器写代码部署相关的内容直接 VS Code Remote-SSH 连上去改本地几乎不需要“上传”这个动作前后端项目发版或者给别人共享代码走 Git 仓库。这个工作流不是一开始就有的而是被各种传文件失败的场景教育出来的。下面我按工具类别把细节展开。2. 命令行三件套scp、sftp、rsync先把最核心的掌握住2.1 scp一条命令搞定单次传输scp 是 OpenSSH 自带的远程文件复制工具也是绝大多数人接触到的第一个服务器传文件命令。它基于 SSH 协议传输数据所以只要你能 SSH 登录服务器scp 就一定能用不需要额外装任何东西这是它最大的优势。基本语法很简单# 本地文件上传到服务器 scp /Users/你的用户名/Desktop/test.txt root服务器IP:/root/ # 服务器文件下载到本地 scp root服务器IP:/root/test.txt /Users/你的用户名/Desktop/上传就是把本地路径写在前面、远程路径写在后面下载就是反过来远程路径在前、本地路径在后。这个“前前后后”的顺序是新手最容易搞反的地方我的记忆技巧是把 scp 当成 cp 的远程版cp 的语法是“从哪来 到哪去”scp 也一样只是“从哪来”和“到哪去”里面可以有“用户名IP:路径”这种远程写法。复制整个目录加一个-r参数scp -r /Users/你的用户名/Desktop/myfolder root服务器IP:/root/如果 SSH 端口不是默认的 22用-P指定注意是大写scp -P 2222 /Users/你的用户名/Desktop/test.txt root服务器IP:/root/如果不想每次输密码配置好 SSH 密钥之后 scp 会自动走密钥认证ssh-keygen -t ed25519 -C your_emailexample.com ssh-copy-id root服务器IP这里我强烈建议先配好免密登录再开始传文件否则传几个文件输几次密码真的会怀疑人生。-C参数可以开启压缩传输传纯文本文件时速度提升明显scp -C /Users/你的用户名/Desktop/large.log root服务器IP:/root/scp 的坑在于它不支持断点续传。传一个大文件传到 80% 网络断了重来一遍。而且它不会校验两端文件是否一致传完就完了。所以它只适合“一次性、小文件、对完整性要求不极端”的场景。真传大文件绕开它。2.2 sftp交互式操作适合临时传几个文件sftp 也是基于 SSH 协议但它跟 scp 不一样的地方在于它是个交互式程序连上之后像进了一个受限的 FTP 界面可以ls、cd、get、put还能在本地和远程之间来回切换目录。连接方式sftp root服务器IP连上之后常用操作# 查看远程当前目录 pwd # 查看本地当前目录 lpwd # 切换远程目录 cd /var/www # 切换本地目录 lcd /Users/你的用户名/Desktop # 下载远程文件到本地当前目录 get filename.tar.gz # 下载整个远程目录 get -r remote_folder # 上传本地文件到远程当前目录 put filename.tar.gz # 上传整个本地目录 put -r local_folder # 退出 exitsftp 比 scp 强的地方在于你可以先连上去看看服务器上有哪些文件再决定下载哪一个也可以用get只下载某个目录里的部分内容。虽然它同样不支持断点续传但胜在交互感好适合“我先上去看看情况再传”的场景。另外现在很多云服务器的安全组策略默认只开放 22 端口sftp 和 scp 走同一个端口所以不用额外开别的端口这也是它方便的原因之一。2.3 rsync增量同步大目录和定期备份的利器如果说前面两个是“复制文件”那 rsync 就是在“同步目录”。它的核心能力是增量传输只传两端有差异的部分而不是把整个目录从头传一遍。这在以下场景里是降维打击目录里有几万个文件每次只改了一小部分重复同步同一个大目录到服务器做定时备份每次备份都是增量的网络不稳定传一半断了重跑一遍能接着传虽然 rsync 本身不是断点续传但它会对比两端文件已传完的部分跳过。不过 macOS 自带的 rsync 版本比较老2.6.9而 Linux 服务器上通常是 rsync 3.x。两边版本差异偶尔会导致一些参数不兼容比如 macOS 老版本不支持--infoprogress2。建议先更新 macOS 上的 rsyncbrew install rsync然后确保 PATH 里用的是新版本which rsync rsync --version我的日常用法# 将本地目录同步到服务器增量上传 rsync -avz --progress /Users/你的用户名/Desktop/myproject/ root服务器IP:/var/www/myproject/ # 将服务器目录同步到本地增量下载 rsync -avz --progress root服务器IP:/var/www/myproject/ /Users/你的用户名/Desktop/myproject/参数说明-a归档模式保留权限、时间戳、软链接等属性-v显示详细输出-z传输时压缩适合文本代码文件--progress显示传输进度--delete删除本地有但远端没有的文件让两边完全一致慎用确认无误再用--exclude排除不需要同步的目录比如--excludenode_modules。举个例子我在同步前端项目时一定会排除依赖目录rsync -avz --progress --excludenode_modules --exclude.git /Users/你的用户名/Desktop/myweb/ root服务器IP:/var/www/myweb/node_modules里面几十万个文件不排除的话第一次同步能跑到天荒地老。补充一个我最常用的技巧在 rsync 命令后面加-e ssh -p 2222来指定非默认 SSH 端口。rsync 还有一个隐藏优势传输前会计算两端文件的 checksum或者用文件大小和时间戳做判断传输完成后不会像 scp 那样“闷头传完不管”所以它的可靠性在三个命令里是最高的。macOS 和 Linux 都是类 Unix 系统权限模型一致用 rsync 同步过去文件权限不会乱七八糟这也是我偏爱它的原因。2.4 三个命令的选型对比工具适用场景断点续传增量传输交互性上手难度scp临时传一两个小文件不支持不支持无最简单sftp先看再传、交互式操作不支持不支持有简单rsync大目录、重复同步、备份支持对比跳过已传部分支持无中等一句话总结单文件用 scp想看再传用 sftp目录同步和备份用 rsync。3. 图形化工具不想敲命令时的靠谱选择不是所有人都习惯在终端里操作也不是所有需求都适合命令行。比如我想在服务器上一层层翻目录找到某个日志文件再下载命令行里cd、ls来来回回确实不如图形界面看着直观。这一节说说我在 macOS 上实际用过、觉得靠谱的几个图形化工具。3.1 FileZilla免费跨平台基本够用FileZilla 是老牌 FTP/SFTP 客户端免费、开源、Windows 和 macOS 都有很多公司的运维手册里写的也是它。它对 SFTP走 SSH 协议支持得不错界面分左右两栏左边本地目录、右边远程目录拖拽就能上传下载。macOS 上安装brew install --cask filezilla或者去官网下载 dmg 安装包。使用上面有个细节站点管理器里新建站点时协议选SFTP - SSH File Transfer Protocol不是 FTP否则连不上。填好主机、端口、用户名密码可以暂存也可以加载本地的 SSH 私钥文件。FileZilla 最大的优点是免费且稳定传到一半断了会有提示重新传输时可以选择覆盖或续传FTP 协议支持断点续传SFTP 下也支持一部分。缺点就是界面有点老气而且 macOS 上窗口缩放偶尔有点迟钝但不影响核心功能。3.2 CyberduckmacOS 原生体验界面清爽Cyberduck 是我个人在 macOS 上最常用的图形化 SFTP 客户端。它支持 FTP、SFTP、WebDAV、S3、OpenStack Swift 等一堆协议界面原生、操作流畅跟 macOS 的文件系统集成得也好。安装brew install --cask cyberduckCyberduck 的一个亮点支持将远程服务器挂载为本地磁盘通过 macOS 的 Finder 集成挂载之后可以在 Finder 里直接拖拽文件也可以在很多应用的“打开/保存”对话框里直接读写服务器文件体验非常接近本地文件。这个功能对非技术背景的同事特别友好他们不需要理解什么 SFTP、SSH只需要看到一个“网盘”一样的磁盘。Cyberduck 同样支持断点续传和书签管理多个服务器配置可以分组存放。免费的基本没遇到过什么毛病。3.3 Transmit付费但体验最好Transmit 是 Panic 公司出品的经典 macOS 文件传输工具可以说是我用过的 macOS 上最精致的传输客户端。界面漂亮、传输速度快、支持标签页、支持同步、支持规则甚至可以设置传输完成后的动作比如传完自动解压。价格不算便宜买断制大概三百多人民币但如果你每天都要跟服务器打交道这个钱花得值。它有个很实用的功能叫Transmit Disk跟 Cyberduck 的挂载类似但更稳定。还有一个功能是同步本质上是在图形界面里帮你封装了 rsync填好两个目录点一下就能增量同步。我不建议新手一上来就花钱买这个先用免费的 FileZilla 或 Cyberduck等确定自己真的高频使用再升级也不迟。3.4 Termius 这类“终端文件管理”合体工具的实际体验Termius 是一个跨平台的 SSH 客户端macOS、Windows、iOS、Android 都有。它不只是终端还内置了 SFTP 文件管理面板。连上服务器之后左侧是远程文件列表右侧是终端可以一边敲命令一边拖文件。这类工具最大的价值在于把“管理服务器”和“传文件”两个动作合在了一个界面里省去来回切换软件的麻烦。而且它支持保存多台服务器配置、密钥管理、端口转发等对维护多台服务器的人来说非常方便。类似的还有 Final Shell、Royal TSX 等。我的建议是如果你只需要传文件专门的 SFTP 客户端够用了如果你本来就要频繁 SSH 连服务器那直接用 Termius 这类合体工具更合理少装一个软件少一层学习成本。4. 别忽略的第三条路借助代码仓库和 IDE 完成“变相上传下载”说到这很多人会发现一个现象有些场景下我根本没在“传文件”但文件确实从本地“跑”到了服务器上。这就是我要说的第三条路通过 Git 仓库和 IDE 远程开发能力把文件传输这件事隐蔽化、自动化。4.1 Git 工作流下的 push / pull既是版本管理也是文件传输在很多团队里服务器上的代码是从 Git 仓库拉下来的而不是有人手工传上去的。你在本地 commit、push然后在服务器上 git pull这个流程本质上就是一次文件“上传”。反过来你在服务器上改了代码想带回本地git push 之后再在本地 pull就是一次“下载”。这种做法的好处太明显了有版本记录改错了能回滚天然支持多人协作不会互相覆盖增量传输每次只需同步改动的内容不依赖 SSH 到服务器的权限只要有仓库权限就能操作。我在自己的项目里凡是需要长期维护的代码工程一律走 Git。只有临时放个配置文件、传个静态资源包才用 scp 或 rsync。这个习惯帮我避免了很多“服务器上这份代码到底是不是最新版”的撕扯。如果你在往 Gitee、GitHub、GitLab 这类平台上传代码时遇到“上传失败网络请求错误”或者“代码包大小超过限制”之类的提示要注意这通常不是 Git 命令本身的问题而是仓库的远程地址配置、网络代理、或者文件体积超过了平台限制。Git 本身并不限制单个文件大小但很多代码托管平台默认限制单文件 50MB 或 100MB。解决方式是用 Git LFS 管理大文件或者改走 rsync 直传服务器。4.2 VS Code Remote-SSH直接远程改文件连“传”的动作都省了VS Code 的 Remote-SSH 扩展是过去几年里对远程开发体验改变最大的一个东西。安装扩展后ssh连上服务器就能像打开本地文件夹一样打开服务器上的目录直接在远程环境里编辑、保存、运行、调试。这里的逻辑是你在本地通过 VS Code 编辑的是服务器上的文件保存时数据走 SSH 通道写回服务器不需要你手动“上传”。而你要从服务器下载文件到本地也可以在 VS Code 的文件树里右键选择下载。我觉得这套工作流特别适合服务器上的配置文件需要频繁调整Nginx、Docker Compose、环境变量等写 Python、Node.js 脚本需要直接在服务器环境里跑排查线上问题时随手打开服务器上的日志文件看看。VS Code 连远程服务器之后本地和远程的文件对比、查找、全局搜索都是无缝的体验比“下载到本地改完再传回去”舒服太多了。4.3 JetBrains 系 IDE 的部署功能适合传统 PHP、Python Web 项目用 PHPStorm、PyCharm、IDEA 这类 JetBrains 全家桶的朋友可能对部署功能更熟悉。在 Settings 里的 Deployment 配置好服务器信息然后可以手动上传、下载也可以配置成保存时自动上传。对做传统 Web 开发改一行代码马上要看到效果的人来说这个功能效率极高。配置路径大概是Settings - Build, Execution, Deployment - Deployment添加服务器类型选 SFTP填好 SSH 信息然后设置映射路径本地路径对应远程哪个目录。之后在文件上右键就有 Upload/Download 的选项。需要注意它跟 Git 的区别IDE 的部署是“直接把当前文件推到服务器”不做版本管理Git 是“提交到仓库再拉取”有历史记录。两者解决的是不同层面的问题。4.4 一个完整的全流程例子举个我自己经常做的例子本地 MacBook 上开发一个 Flask 项目准备部署到云服务器。代码完成后我先git push到 Gitee 私有仓库SSH 登录服务器git pull拉取最新代码如果有些本地生成的静态资源比如图片压缩包不想进 Git用 rsync 同步过去之后小改动直接用 VS Code Remote-SSH 改服务器上的文件改完重启服务即可。整个过程里“往服务器传代码”这个动作被拆成了“Git 同步 按需 rsync 远程编辑”每一种都是对应场景下最舒服的方式。5. 实际踩坑记录这些传输问题我基本都踩过一遍工具本身不复杂真正让人头大的是各种环境因素导致的传输失败。这里把我踩过的坑集中整理一下都是真实遇到过的不是从文档里抄来的。5.1 Permission denied权限问题不止一种现象一SSH 登录正常但 scp 上传提示 Permission denied。这种情况通常是远程目录对你登录的用户没有写权限。比如要用 root 用户往/var/www下传文件但目录属主是 www-data。解决办法是先登录服务器把目录属主改成当前用户或者放宽目录权限sudo chown -R 当前用户名 /var/www/myproject现象二scp 下载提示 Permission denied。远程文件对当前用户没有读权限。同样先 SSH 上去看看文件权限ls -l /var/www/myproject/config.php如果是 600 且属主是 root你当前用户确实读不了需要 chmod 或者切用户。现象三用 SSH 密钥连接时提示 Permission denied (publickey)。这个跟文件本身权限关系不大多半是~/.ssh目录或authorized_keys文件权限不对。服务器上执行chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys以及客户端私钥文件的权限不能是 644需要chmod 600 ~/.ssh/id_ed25519。5.2 大文件传输中断别硬扛换工具或加参数用 scp 传 4GB 的数据库备份文件传到一半网断了只能从头再来一遍这是我早年间干过的蠢事。后来我总结了几条经验大文件优先考虑rsync即使中断重跑一遍能跳过已完成的块rsync 对比文件大小和时间戳已传完的直接跳过如果服务器支持把大文件先压缩再传减少传输量在命令前加nohup或者用tmux跑传输任务避免本地终端关闭导致传输中断特别大的文件可以分卷压缩然后并发传但我个人觉得大部分场景没必要这么折腾rsync 足够。5.3 路径和特殊字符的坑现象一本地路径包含空格或中文导致命令解析错误。解决办法是给路径加引号scp /Users/你的用户名/Desktop/我的 文件.zip root服务器IP:/root/现象二远程路径中包含*、?、等特殊字符。这些字符在 shell 里会被解释成特殊含义。简单粗暴的办法是用引号把远程路径包起来或者用反斜杠转义。更稳妥的做法是尽量不在服务器上用这些特殊字符命名文件避免不必要的麻烦。5.4 SSH 配置和防火墙问题现象一连接超时。判断是服务器 IP 不通、安全组策略拦截还是 SSH 服务没起来。本地先ping IP确认网络通不通再telnet IP 22或nc -vz IP 22确认端口通不通。云服务器的话去控制台看安全组规则确认 22 端口是否对所有来源 IP 开放。现象二端口被改过。如果是出于安全考虑把 SSH 端口改成了2222scp 和 sftp 都需要显式指定端口不然默认连 22 端口会失败。scp 用-P 2222sftp 用-P 2222sftp 的-P也是大写跟 ssh 一样这点跟 ssh 一致跟 scp 保持一致记得是大写。现象三本机同时配置了多个 SSH key导致服务器不认。在~/.ssh/config里单独为这台服务器指定 IdentityFileHost myserver HostName 服务器IP Port 22 User root IdentityFile ~/.ssh/id_ed25519之后直接用ssh myserver、scp ... myserver:/path、rsync ... myserver:/path配置会自动帮你带上正确的密钥和端口。5.5 上传下载速度很慢怎么办如果小文件也慢先排除是否是网络问题用ping看延迟用iperf3测带宽。如果网络正常试试给 scp/rsync 加-C压缩参数文本文件收益明显确认服务器 CPU 是否跑满SSH 加解密非常吃 CPU 性能文件在机械盘上大量小文件读写会慢考虑打包后再传检查是不是本地 Wi-Fi 信号弱换个网络实测一下。5.6 macOS 特有的一个坑自带 rsync 版本太老开头我提过macOS 自带的 rsync 是 2.6.9这个版本有不少 bug而且跟 Linux 上 3.x 版本的参数表现不一致。我曾经在一台新 MacBook 上直接用rsync -avz同步一个大目录跑到一半进程无响应后来查资料发现就是版本问题。用 Homebrew 升级一下brew install rsync再执行which rsync确认路径是/opt/homebrew/bin/rsyncApple Silicon或者/usr/local/bin/rsyncIntel而不是/usr/bin/rsync。这个问题在长期使用 rsync 的 Mac 用户里非常经典网上很多“rsync 传到一半卡死”的帖子最终根因都是版本不匹配。6. 一点选择建议不同人群、不同场景的最佳解写到这里工具和坑都讲得差不多了。最后根据自己的使用体会给不同的人群一个简单的选型建议如果你是完全的新手刚买了一台 MacBook第一次接触服务器从 scp 开始一条命令解决问题不用装任何软件。等你能熟练使用终端再慢慢接触 rsync 和图形化工具。如果你是前端开发需要把构建产物传到服务器首选 rsync排除node_modules后同步 dist 目录秒级完成部署。配合 SSH 密钥一键脚本搞定不用每次输密码。如果你是后端开发频繁改服务器上的代码和配置强烈建议用 VS Code Remote-SSH把服务器目录直接变成你的工作目录彻底告别“上传-下载-再上传”的循环。如果你要传的文件经常超过 1GB放弃 scp直接 rsync断点续传会让你少掉不少头发。有条件的话先压缩再传效率翻倍。如果你是给非技术同事提供服务器文件访问支持用 Cyberduck 的挂载功能让他们在 Finder 里像操作本地文件夹一样使用服务器目录你只需要提前把连接配置好他们完全不用理解技术细节。有一个小技巧我从实践里总结出来的无论你用哪种方式都建议先在本地准备好一个文本文件记录常用服务器的 IP、用户名、端口、默认上传目录这些信息最好写成 SSH config别指望自己能记住多台服务器的细节。我见过太多人在关键时刻翻聊天记录找服务器信息非常浪费时间。MacBook 上传下载服务器文件这件事本质上就是“让本地和远程的数据流动起来”。工具本身不难难的是找到适合自己场景的那条路并且知道路上有哪些坑。希望这篇内容能帮你在自己的使用场景里少走点弯路把时间花在真正重要的事情上。
返回列表