TLDR;
在远程主机中运行命令的 shell 语法:前端$: ssh user@host "commands"
最近的一个项目中,咱们前端须要本身发布静态资源到远程目标服务器上,中间须要通过一个跳板机(为何不用公司内部的 GitLab 方式发布,缘由不少,这里就不表述了)。前端若是手动发布的话须要通过如下步骤:shell
把全部静态资源压缩成一个 tgz 包bash
把压缩包 scp 到跳板机服务器
ssh 到跳板机网络
把压缩包从跳板机 scp 到静态资源的目标主机ssh
ssh 到目标主机函数
解压缩压缩包到指定目录ui
执行 py 脚本,发布到 cdncode
从上面的步骤能够看出若是手动发布一个服务器,大概须要通过7个步骤,每次发布都须要至少 4-5 分钟时间等待(咱们有 12 台须要发布的机器,每次发布都须要 4(从第 3 步开始重复 12 次) * 12 分钟),并且若是网络不太好的话,等待的时间就更长了;更不要说手动发布的时候会常常忘了步骤且更容易出错了,每次发布都好像回到了原始时代。cdn
万幸的是 ssh 自己支持在远程主机中运行命令的,语法就是
$: ssh user@host "command1; command2; command3; ...."
此处的 command 应该用 ""
包起来,避免 ;
被本地主机当作定界符处理。 ok,知道 ssh 的用法,咱们写个 bash 处理一下上面 7 个步骤:
# 打压缩包并上传到跳板机的指定目录 function compress() { tar -zcvf sc.tgz -C build . && scp -r sc.tgz root@xxx.xxx.xxx.xxx:~/oss_download/demo/ } # 经过 ssh 登陆跳板机执行 3 - 7 步 # 注意在跳板机跳登陆到目标服务器的时候须要 ssh -tt ,能够在远程机器上 ssh 到其余的远程主机并执行。详细的解释经过 man ssh 查看 # mkidr -p 是若是目标机器不存在这个目录,就先建立这个目录,保证 cd 或者 tar 的时候不会由于目标目录不存在而引发报错 function send() { ssh root@xxx.xxx.xxx.xxx "scp -r oss_download/demo/sc.tgz alibaba@${1}:~/ossdowload/data/demo/ ; ssh -tt alibaba@${1} 'mkdir -p ossdowload; cd ossdowload; mkdir -p data/demo/sc/${version}; tar -zvxf data/demo/sc.tgz -C data/demo/sc/${version} && rm -rf data/demo/sc.tgz && ./ceph_tmp.py'" } # 执行 compress 和 send 函数 function deploy() { compress send ${1} } # 发送到目标服务器 deploy yyy.yyy.yyy.yy
这是发布到一个远程主机的命令的脚本,是否是很简单?以后若是想发布到多个远程主机,只要经过简单的 while 语句就能够搞定;到这里就算结束了,大多数时候前端只须要掌握简单的 bash 语法,就能够经过自动化脚本节省了大量的时间去泡妹子,好开心。