TLDR;
在长途主机中运转敕令的 shell 语法:$: ssh user@host "commands"
近来的一个项目中,我们前端须要自身宣布静态资本到长途目的服务器上,中心须要经由一个跳板机(为何不必公司内部的 GitLab 体式格局宣布,缘由许多,这里就不表述了)。前端假如手动宣布的话须要经由以下步骤:
把一切静态资本压缩成一个 tgz 包
把压缩包 scp 到跳板机
ssh 到跳板机
把压缩包从跳板机 scp 到静态资本的目的主机
ssh 到目的主机
解压缩压缩包到指定目次
实行 py 剧本,宣布到 cdn
从上面的步骤能够看出假如手动宣布一个服务器,也许须要经由7个步骤,每次宣布都须要最少 4-5 分钟时刻守候(我们有 12 台须要宣布的机械,每次宣布都须要 4(从第 3 步最先反复 12 次) * 12 分钟),而且假如收集不太好的话,守候的时刻就更长了;更不要说手动宣布的时刻会常常忘了步骤且更轻易出错了,每次宣布都彷佛回到了原始时代。
万幸的是 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 语法,就能够经由过程自动化剧本节省了大批的时刻去泡妹子,好开心。