近几日在协调一个类似商品微店的项目,客户需求还没来得及了解,项目的前端与后端分别是两个开发组并行推进,现在前后端工作进入尾期需要合并测试,而我在其中扮演中间人的角色。
这篇笔记算是在 Mac 环境里基于 FTP 协议操作本地、服务器文件系统的一套完整解决方案,整理下来以备日后再用。
FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”。
TCP/IP 协议中,FTP 标准命令 TCP端口号为 21,Port方式数据端口为 20。
FTP的任务是从一台计算机将文件传送到另一台计算机,不受操作系统的限制。
初阶: Finder 查看/下载
Mac 环境中的文件系统原生支持连接 FTP 服务器查看文件目录,但功能十分有限,仅支持查看、下载 FTP 服务器中的文件[夹],不支持上传、编辑、删除文件[夹],满足了查阅目录结构、文件配置等最基本的需求。
要把前端同事的网页批量上传至 FTP 服务器,这时就可以使用 FTP 命令行劳心了。
进阶:FTP 命令
1. 登录
命令行中最简单的两种登录方式,首次登录使用方式一
比较简单,连接超时可以再使用方式二
重新登录,两种登录方式算是配合或组合关系。
# 方式一
$ ftp server-ip
# 方式二
$ ftp
ftp> open server-ip
实例登录场景效果:
$ ftp 139.196.161.141
Connected to 139.196.161.141.
220-FileZilla Server 0.9.53 beta
220-written by Tim Kosse (tim.kosse@filezilla-project.org)
220 Please visit https://filezilla-project.org/
Name (139.196.161.141:lijunjie): username
331 Password required for username
Password:
230 Logged on
Remote system type is UNIX.
ftp>
// wait a long time
ftp> ls
421 Connection timed out.
ftp> open 139.196.161.141
Connected to 139.196.161.141.
220-FileZilla Server 0.9.53 beta
220-written by Tim Kosse (tim.kosse@filezilla-project.org)
220 Please visit https://filezilla-project.org/
Name (139.196.161.141:lijunjie): username
331 Password required for username
Password:
230 Logged on
Remote system type is UNIX.
ftp>
登录成功后,就会进入 FTP 命令行环境,此时如何分辨本地与服务器的目录呢?此时的视角犹如四游记中一直在天空中隐身保护唐僧的五方揭谛四值功曹,上观天堂神仙欢乐事、下览人间凡体苦难状;此时不能说查看目录,而应该说查看本地目录或服务器目录,与文件系统相关的命令操作都分本地与服务器两套。
服务器操作 | 本地目录操作 |
---|---|
cd 目录名(进入服务器目录) | lcd 目录名(进入本机目录) |
cd \(退到服务器根目录) | lcd \(退到本机根目录) |
cd ..(退回到上一级目录) | lcd ..(退回到上一级目录) |
pwd | !pwd |
ls | !ls |
**2. 上传文件[夹] **
上传本地文件至服务器指定目录中,必须显式指定上传至服务器后文件名称。
# server-filename 必须显式指明,否则报错:文件名无效
ftp> put /local/path/filename /remote/path/server-filename
ftp> cd /views
250 CWD successful. "/views" is current directory.
ftp> put /local/path/report_161226.cshtml report2.cshtml
local: /local/path/report_161226.cshtml remote: report2.cshtml
229 Entering Extended Passive Mode (|||56835|)
150 Opening data channel for file upload to server of “/views/report2.cshtml"
100% |*| 10865 2.87 MiB/s --:-- ETA
226 Successfully transferred “/views/report2.cshtml"
10865 bytes sent in 00:00 (85.37 KiB/s)
使用通匹符批量上传文件至服务器,需要注意的一点,mput
不支持懒操作即使用绝对路径,应该先进入要上传的本地文件夹及远程文件夹才可以操作,确实这样显得上传操作异常简洁。
ftp> cd /remote/path
ftp> lcd /local/path
ftp> mput goods*
local: goods.cshtml remote: goods.cshtml
229 Entering Extended Passive Mode (|||62331|)
150 Opening data channel for file upload to server of "/local/path/goods.cshtml"
100% |*| 519 1.80 MiB/s --:-- ETA
226 Successfully transferred "/local/path/goods.cshtml"
519 bytes sent in 00:00 (9.54 KiB/s)
关于上传文件夹, FTP 命令不支持文件夹上传操作。
3. 下载文件[夹]
下载服务器中的文件至本地目录中,可选指定下载至本地目录后的文件名称,依然要求提前进入待下载文件的目录中。
# 方式一
ftp> get remote-filename
# 方式二
ftp> get remote-filename local-filename
ftp> get Web.config
local: Web.config remote: Web.config
229 Entering Extended Passive Mode (|||58735|)
150 Opening data channel for file download from server of "/Web.config"
100% |*| 1300 2.28 MiB/s 00:00 ETA
226 Successfully transferred "/Web.config"
1300 bytes received in 00:00 (142.33 KiB/s)
ftp> get Web.config hello.config
local: hello.config remote: Web.config
229 Entering Extended Passive Mode (|||53446|)
150 Opening data channel for file download from server of "/Web.config"
100% |*| 1300 2.55 MiB/s 00:00 ETA
226 Successfully transferred "/Web.config"
1300 bytes received in 00:00 (143.20 KiB/s)
使用通匹符批量下载服务器中的文件至本地目录。
ftp> cd /remote/path
ftp> mget filename*
关于下载文件夹, FTP 命令不支持文件夹下载操作。
4. 删除文件[夹]
在服务器中删除文件,可以指定绝对路径,相对其他命令显得比较灵活。
ftp> delete /remote/path/category.cshtml
250 File deleted successfully
ftp> mdelete *_order*
mdelete goods_order.cshtml [anpqy?]? a
Prompting off for duration of mdelete.
250 File deleted successfully
250 File deleted successfully
250 File deleted successfully
250 File deleted successfully
250 File deleted successfully
250 File deleted successfully
250 File deleted successfully
关于删除文件夹, FTP 命令不支持文件夹删除操作。
5. 移动文件
FTP 命令不支持移动文件,只能通过删除再上传文件变相的实现移动文件。
6. 增删改查
操作 | 单文件 | 批量操作(multi) |
---|---|---|
增 | put | mput |
删 | delete | mdelete |
改 | 不支持 | 不支持 |
查 | get | mget |
7. FileZilla 工具
涉及到服务器端文件夹的修改、删除等操作时,就需要安装一下 FileZilla 工具;使用 FTP 命令登录后的提示内容中可以看到 FileZilla 字样。
FileZilla 工具界面很简单,全程使用鼠标拖拖拉拉即可完成操作。
高阶:脚本操作
其实没有很复杂的场景,把前端的静态资源使用 FileZilla 工具一次性上传至服务器,按照后端同事的要求把不同功能需求的网页上传至服务器不同目录下,这种批量重复性的无聊操作最佳解决方案就是写入脚本,省时、准确、周全,后续前端同事调整网页内容时,调用一下脚本即可。
$ cat commands.txt
open remote-server-ip
user user-name user-password
binary /*以二进制传送*/
hash /*当有数据传送时,显示#号*/
cd /remote/path1
lcd /local/path2
mput file1.*
cd /remote/path2
!cd /local/path2
mput file2.*
bye /*退出*/
$ cat commands.txt | ftp -n
不喜欢 bash 脚本中的 EOF 用法,感觉代码思路不够清晰,但需要使用变量时,就不得不使用这种写法了。
$ commands.sh
#!/usr/bin/env bash
timestamp=$(date "+%Y%m%d")
# mkdir -p ${timestamp} && touch ${timestamp}/hello.txt
cat <<EOF | ftp -n
open 139.196.161.141
user junjie junjie
binary
hash
!ls ${timestamp}/
bye
EOF
sed 批量修改文件
后端同事部署的测试环境中,前端同事的页面对静态资源的引用需要调整一下,有章可循,也就是一条 sed
命令回车间可以解决的。
# 方式一:无备份
$ sed -i '' 's/wait-replace/to-replace/g' filename
# 方式二:备份
$ sed -i '.bak' 's/wait-replace/to-replace/g' filename
$ cat filename // 确认修改无误
$ rm *.bak // 删除备份
# ./resource 替换为 /mobile/resource
$ sed -i '.bak' 's/\.\/resource/\/mobile\/resource/g' project/*.html
$ rm project/*.html.bak