公司的系统都是内网访问,服务器也不能访问外网,所以git更新维护代码是不现实的。顺便学习几个新命令
学习两个命令
1. scp
Linux scp命令用于Linux之间复制文件和目录。
scp是 secure copy的缩写, scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令。
命令格式
scp [可选参数] [原路径] [目标路径]
参数说明
- -1: 强制scp命令使用协议ssh1
- -2: 强制scp命令使用协议ssh2
- -4: 强制scp命令只使用IPv4寻址
- -6: 强制scp命令只使用IPv6寻址
- -B: 使用批处理模式(传输过程中不询问传输口令或短语)
- -C: 允许压缩。(将-C标志传递给ssh,从而打开压缩功能)
- -p:保留原文件的修改时间,访问时间和访问权限。
- -q: 不显示传输进度条。
- -r: 递归复制整个目录。
- -v:详细方式显示输出。scp和ssh(1)会显示出整个过程的调试信息。这些信息用于调试连接,验证和配置问题。
- -c cipher: 以cipher将数据传输进行加密,这个选项将直接传递给ssh。
- -F ssh_config: 指定一个替代的ssh配置文件,此参数直接传递给ssh。
- -i identity_file: 从指定文件中读取传输时使用的密钥文件,此参数直接传递给ssh。
- -l limit: 限定用户所能使用的带宽,以Kbit/s为单位。
- -o ssh_option: 如果习惯于使用ssh_config(5)中的参数传递方式,
- -P port:注意是大写的P, port是指定数据传输用到的端口号
- -S program: 指定加密传输时所使用的程序。此程序必须能够理解ssh(1)的选项
使用方法
从本地复制到远程
命令格式:
1 | scp local_file remote_username@remote_ip:remote_folder |
复制目录命令格式:
1 | scp -r local_folder remote_username@remote_ip:remote_folder |
从远程复制到本地
从远程复制到本地,只要将从本地复制到远程的命令的后2个参数调换顺序即可,如下实例
应用实例:
1 | scp root@www.magicyou.cn:/home/root/others/music /home/space/music/1.mp3 |
指定端口
1.如果远程服务器防火墙有为scp命令设置了指定的端口,我们需要使用 -P 参数来设置命令的端口号,命令格式如下:
1 | #scp 命令使用端口号 4588 |
2. rsync
rsync的目的是实现本地主机和远程主机上的文件同步(包括本地推到远程,远程拉到本地两种同步方式),也可以实现本地不同路径下文件的同步,但不能实现远程路径1到远程路径2之间的同步(scp可以实现)。
命令格式
rsync [可选参数] [原路径] [目标路径]
参数说明
- -v:显示rsync过程中详细信息。可以使用”-vvvv”获取更详细信息。
- -P:显示文件传输的进度信息。(实际上”-P”=”–partial –progress”,其中的”–progress”才是显示进度信息的)。
- -n –dry-run :仅测试传输,而不实际传输。常和”-vvvv”配合使用来查看rsync是如何工作的。
- -a –archive :归档模式,表示递归传输并保持文件属性。等同于”-rtopgDl”。
- -r –recursive:递归到目录中去。
- -t –times:保持mtime属性。强烈建议任何时候都加上”-t”,否则目标文件mtime会设置为系统时间,导致下次更新
:检查出mtime不同从而导致增量传输无效。
- -o –owner:保持owner属性(属主)。
- -g –group:保持group属性(属组)。
- -p –perms:保持perms属性(权限,不包括特殊权限)。
- -D :是”–device –specials”选项的组合,即也拷贝设备文件和特殊文件。
- -l –links:如果文件是软链接文件,则拷贝软链接本身而非软链接所指向的对象。
- -z :传输时进行压缩提高效率。
- -R –relative:使用相对路径。意味着将命令行中指定的全路径而非路径最尾部的文件名发送给服务端,包括它们的属性。用法见下文示例。
- –size-only :默认算法是检查文件大小和mtime不同的文件,使用此选项将只检查文件大小。
- -u –update :仅在源mtime比目标已存在文件的mtime新时才拷贝。注意,该选项是接收端判断的,不会影响删除行为。
- -d –dirs :以不递归的方式拷贝目录本身。默认递归时,如果源为”dir1/file1”,则不会拷贝dir1目录,使用该选项将拷贝dir1但不拷贝file1。
- –max-size :限制rsync传输的最大文件大小。可以使用单位后缀,还可以是一个小数值(例如:”–max-size=1.5m”)
- –min-size :限制rsync传输的最小文件大小。这可以用于禁止传输小文件或那些垃圾文件。
- –exclude :指定排除规则来排除不需要传输的文件。
- –delete :以SRC为主,对DEST进行同步。多则删之,少则补之。注意”–delete”是在接收端执行的,所以它是在
:exclude/include规则生效之后才执行的。
- -b –backup :对目标上已存在的文件做一个备份,备份的文件名后默认使用”~”做后缀。
- –backup-dir:指定备份文件的保存路径。不指定时默认和待备份文件保存在同一目录下。
- -e :指定所要使用的远程shell程序,默认为ssh。
- –port :连接daemon时使用的端口号,默认为873端口。
- –password-file:daemon模式时的密码文件,可以从中读取密码实现非交互式。注意,这不是远程shell认证的密码,而是rsync模块认证的密码。
- -W –whole-file:rsync将不再使用增量传输,而是全量传输。在网络带宽高于磁盘带宽时,该选项比增量传输更高效。
- –existing :要求只更新目标端已存在的文件,目标端还不存在的文件不传输。注意,使用相对路径时如果上层目录不存在也不会传输。
- –ignore-existing:要求只更新目标端不存在的文件。和”–existing”结合使用有特殊功能,见下文示例。
- –remove-source-files:要求删除源端已经成功传输的文件。
使用方法
从本地复制到远程
命令格式:
1 | rsync local_file remote_username@remote_ip:remote_folder |
复制目录命令格式:
1 | rsync -r local_folder remote_username@remote_ip:remote_folder |
从远程复制到本地
从远程复制到本地,只要将从本地复制到远程的命令的后2个参数调换顺序即可,如下实例
应用实例:
1 | rsync root@www.magicyou.cn:/home/root/others/music /home/space/music/1.mp3 |
指定端口
1 | rsync -r --port 8888 www.magicyou.cn:/home/root/others/ /home/space/music/ |
3. scp 和 rsync 的区别
scp是相当于复制,黏贴,如果有的话是覆盖,比较耗时间,不智能。
rsync是复制,如果有重复的文件,会直接跳过,而且他自己的算法优化。
scp是把文件全部复制过去,当文件修改后还是把所有文件复制过去,rsync 第一次是把所有文件同步过去,当文件修改后,只把修改的文件同步过去。
进入正题
列出目前已经有的环境以及路径
名称 | 本地路径 | 所在服务器 | 服务器路径 | nginx端口 |
---|---|---|---|---|
演示环境 | /Applications/MAMP/htdocs/modou_obj/xxxx-web-osp/ | 10.0.111.217 | /www/xxxx-web-ceshi/ | 9009 |
测试环境 | /Applications/MAMP/htdocs/modou_obj/xxxx-web-ceshi/ | 10.0.111.217 | /www/xxxx-web-osp/ | 9010 |
校验数据的生产环境 | /Applications/MAMP/htdocs/modou_obj/xxxx-web_test/ | 10.0.112.222 | /opt/www/xxxx-web_new/ | 9006 |
生产环境 | /Applications/MAMP/htdocs/modou_obj/xxxx-web_new/ | 10.0.112.222 | /opt/www/xxxx-web_new/ | 8080 |
本地环境 | /Applications/MAMP/htdocs/modou_obj/xxxx-web/ | ————— | ————— | 80 |
情况介绍
由于环境很多,而且是在内网访问,服务器也不能连接外网,git就无能为力。按照之前,每次更新代码或者深夜上线新功能,都要远程联系运维,运维再连上vpn,更新代码。
麻烦不,后来技术总监推给我,让我维护这几个环境。
内网怎么去把代码传到服务器呢?
- 工具不太好使,而且每次都要打开,然后文件往里面拖。很容易传输过程缺文件,系统崩溃,用户又要反馈;
- 工具更新也慢,每次都要全部拖进去,文件多了耗时间;
- scp这个命令也不是不可以,就是每次都要全量同步
最后当然是用rsync命令了,妥妥的。
- 首先,复制几套代码,放一块,文件夹名字尽可能和服务器项目所在文件夹保持一致,防止混乱;
———— | —————— |
---|---|
xxxx-web | 本地开发代码 |
xxxx-web-ceshi | 本地开发代码复制,对应测试环境 |
xxxx-web-osp | 本地开发代码复制,演示环境 |
xxxx-web_test | 本地开发代码复制,校验数据的内测环境 |
xxxx-web_new | 本地开发代码复制,生产环境 |
- 然后,代码当然是放在git上,git忽略代码需要针对各个项目分别做维护
文件名 | 文件相对项目目录所在路径 | git忽略原因 |
---|---|---|
dev.php | 数据库配置,redis配置等 | 测试对应测试数据库,生产对应生产数据库 |
orginfo.php | 各个万象城基本配置信息 | 项目需要在不同项目下先是不同的名称,比如在演示环境不允许出现真实地名,大区,其他环境正常,就在演示环境下改名称为演示大区 |
基本完美,每次都要打命令,我干脆简单点,吧命令记录在文本里,每次更新代码复制粘贴
正式环境更新 2.0.0-prod
1
2
3
4
5
6rsync -r /Applications/MAMP/htdocs/modou_obj/xxxx-web_new/Application/ marketing@10.0.112.222:/data02/dmp/www/xxxx-web_new/Application/
rsync -r /Applications/MAMP/htdocs/modou_obj/xxxx-web_new/Public/ marketing@10.0.112.222:/data02/dmp/www/xxxx-web_new/Public/
rsync -r /Applications/MAMP/htdocs/modou_obj/xxxx-web_new/ThinkPHP/ marketing@10.0.112.222:/data02/dmp/www/xxxx-web_new/ThinkPHP/正式环境(内测) 9006 2.0.0-dev
1 |
|
- 测试环境 9010
1 | rsync -r /Applications/MAMP/htdocs/modou_obj/xxxx-web-ceshi/Application/ appuser@10.0.111.217:/www/xxxx-web-ceshi/Application/ |
- 演示环境 9009
1
2
3
4
5
6
7
rsync -r /Applications/MAMP/htdocs/modou_obj/xxxx-web-osp/Application/ appuser@10.0.111.217:/www/xxxx-web-osp/Application/
rsync -r /Applications/MAMP/htdocs/modou_obj/xxxx-web-osp/Public/ appuser@10.0.111.217:/www/xxxx-web-osp/Public/
rsync -r /Applications/MAMP/htdocs/modou_obj/xxxx-web-osp/ThinkPHP/ appuser@10.0.111.217:/www/xxxx-web-osp/Public/ThinkPHP/
懒人模式开启,不好的是不容易记忆这几个命令,多打几遍应该没坏处,emmmmm….