在 Mac 上直接编辑 SFTP 服务器上的文件

简短回答:不必再把服务器上的文件下载下来、编辑、再手动上传。在 Folia Files 中通过 SFTP 连接服务器一次,然后在服务器的文件夹里连按文件即可。文件会从 Mac 上的一份副本在你常用的 App 中打开,每次存储时,Folia Files 都会先确认这段时间里没有人在服务器上改动过它,再把它发回服务器。发送情况可在操作 › 远程文件中查看。
本文介绍如何设置、编辑时会看到什么,以及服务器拒绝写入时会发生什么。
为什么编辑服务器上的文件很麻烦
用 SFTP 客户端,流程总是三步:下载 config.php 或 index.html,编辑,再上传。忘了最后一步,服务器上运行的仍是旧版本;从两台 Mac 上各做一次,还可能在不知不觉中覆盖别人的修改。
把服务器装载成磁盘看起来更简单,编辑器可以直接打开文件。但 App 直接存储到网络磁盘的效果并不好:很多 App 会先写入一个临时文件再替换原文件,留下锁定文件,或者在慢速服务器上每次往返都要等待。结果可能是文件丢失了所有者和权限,或者编辑器在存储时卡住。
理想的做法是两者兼得:一份编辑器用起来顺手的本地文件,以及一份随每次存储同步更新的服务器副本。
第 1 步:通过 SFTP 连接服务器
在 Folia Files 的网站版中,SFTP 连接通过免费开源工具 rclone 实现。在终端中运行一次 brew install rclone 即可安装(如果尚未安装,连接窗口会提供一个安装按钮)。然后:
- 选取工具 › 连接(服务器和云服务)…(⌘K),点按新建连接,再选择 SFTP / SCP (SSH)。
- 输入服务器地址、用户名,以及密码或 SSH 密钥(密码留空则使用密钥或 SSH 代理)。
- 在起始文件夹中输入你平时工作的文件夹,例如
/var/www。Folia Files 会从根目录装载整个服务器,你可以随意向上层浏览;起始文件夹只是最先打开的那个。 - 点按测试连接,然后点按装载。服务器会出现在边栏的服务器部分。

如果要编辑文件,请在连接的选项中保持只读为关闭。只读连接中的文件会按原样打开,不会发回任何内容。关于 rclone、SSH 密钥和 S3 的更多内容,请参阅不用 macFUSE,在 Mac 上连接 SFTP 和 S3。
第 2 步:打开并编辑文件
像浏览其他文件夹一样在面板中浏览服务器,然后:
- 连按文件,在其默认 App 中打开;或者
- 右键点按文件并选取打开方式,改用其他 App:文本编辑、BBEdit、Visual Studio Code、Nova 或你喜欢的任何编辑器。
Folia Files 会把一份工作副本下载到 Mac 并打开它。横幅会提示“‘index.html’从这台 Mac 上的副本打开”,并说明每次存储都会回传到你的服务器,可在“操作”中跟踪。如果下载超过一秒,会先显示带有服务器名称的“正在打开‘index.html’…”。
现在照常编辑,并用 ⌘S 存储。App 写入完成大约一秒后,Folia Files 就会发送文件。只有在服务器确实收到新内容之后,它才会显示已存储到服务器:对于 SFTP,它会直接询问服务器,而不是相信装载的磁盘所显示的内容。
在 Web 服务器上,有几个细节很重要:
- 权限保持不变。文件在原位置重写,因此会保留服务器上的所有者和权限,而不是变成新文件的默认值。
- 每个文件一份副本。再次打开同一个文件,会打开同一份工作副本,包括尚未发送的更改。
- 只处理文稿。200 MB 以内的文件会通过副本处理。视频、归档、磁盘映像和 App 则直接从服务器打开。
此功能默认开启。开关位于设置 › 文件与网络:“通过这台 Mac 上的副本编辑服务器上的文稿,每次存储时发回”。关闭后,文件会直接从服务器打开,但你仍可右键点按某个文件,选取编辑并发回服务器。

这并不限于 SFTP:你其他连接中的文件,以及 Mac 上装载的任何网络宗卷(例如 SMB 共享或 WebDAV 服务器)中的文件,也是同样的处理方式。
第 3 步:在“操作 › 远程文件”中跟踪发送
点按工具栏中的操作(两个箭头的按钮),或选取窗口 › 正在进行的操作(⌃⌘O)。只要还有从服务器打开的文件,全部和进行中页面就会显示远程文件部分,每个文件一行:
- 文件名,下方是连接名称和文件在服务器上的路径;
- 状态:已是最新、“发送于”某个时间、正在发送…、更改尚未发送、期间已在服务器上更改,或导致上次发送失败的错误;
- 三个按钮:发回服务器、显示这台 Mac 上的副本,以及完成(删除这台 Mac 上的副本)。
文件编辑完毕后,就把它“完成”。如果服务器上还没有你的最新版本,Folia Files 会先询问:“要在不发送最新更改的情况下完成吗?”。已是最新且一周未动的副本会被自动清理。
当服务器拒绝时
服务器拒绝写入文件
典型情况是配置文件属于另一个用户,例如你以 alex 连接,而 php.ini 的所有者是 root。rclone 只会简短地回复“permission denied”,Folia Files 则会在横幅和远程文件中用清楚的话说明:
服务器拒绝写入此文件:连接所用的用户无权修改它(服务器上该文件的所有者或权限)。
你的更改不会丢失:它会保留在 Mac 上,横幅中还有重试按钮。要解决问题,请在服务器上更改文件的所有者或权限,或者用有写入权限的用户重新连接,然后再次发送。遇到“服务器上已没有空间存放此文件。”时也是一样。如果服务器始终没有确认收到,你会看到“服务器未确认已收到文件。更改仍保留在这台 Mac 上。”
如果发送途中连接中断,服务器之前的版本会保存在 Mac 上,点按横幅中的显示按钮即可找到它。
有人在服务器上改动了文件
每次发送之前,Folia Files 都会把服务器上的文件与你打开时的文件进行比较。如果文件已被改动(同事、部署脚本或其他编辑器),则不会覆盖任何内容。横幅会显示“‘index.html’已在服务器上更改”,并提供:
- 替换服务器上的版本:发送你的版本;如果 Folia Files 尚未见过服务器上的内容,会先在 Mac 上保留一份它的副本;
- 两者都保留:你的版本会以“index(我的版本).html”存储在旁边,之后的存储都会发送到这个文件。
服务器未连接
如果在连接中断时存储,横幅会提示服务器未连接,更改已保留在这台 Mac 上。点按连接并发送即可重新装载并发送。连接日志(在边栏中右键点按服务器 › 连接日志)会列出每个发送的文件和每次失败,问题反复出现时很有用。如果网络磁盘经常让你的 Mac 卡住,可以看看这篇文章:为什么 Finder 会在网络驱动器上卡住。
有更改尚未到达服务器时退出
编辑期间请保持 Folia Files 打开:每次存储都是由它发送的。如果在更改到达服务器之前退出,它会询问:
对远程文件的部分更改尚未同步到服务器。它们会保留在这台 Mac 上:Folia Files 将在下次启动时再次提供(操作 › 远程文件)。
点按取消可以留下来发送这些更改;点按退出的话,下次启动时该文件会在远程文件中显示“更改尚未发送”,点按箭头按钮即可发送。如果某个更改是之前的会话遗留下来、之后也没有再存储过的(例如服务器一直拒绝写入的文件),每次退出时就不会再询问;它会留在远程文件中,直到你发送或完成它。
网站版与 Mac App Store 版
以上内容描述的都是网站版,安装 rclone 后即可使用 SFTP。通过副本编辑的功能两个版本都有,也适用于 SMB 和 WebDAV 共享。在 Mac App Store 版中,SFTP 连接需要 Folia Files Companion 这个免费的小 App,因为 Apple 的沙盒不允许 App 启动 rclone。
关于连接、云服务和原位编辑的更多信息,请参阅服务器和云服务页面。


