本地脚本如何执行远程主机的脚本?

在做vue项目的线上部署,每次本地打包然后上传到远程主机,再解压等等操作太复杂,所以我就在本地写了个shell脚本,想一键处理。
现在已经实现的功能是,本地打包、压缩、上传到远程主机、登陆到远程主机、可以切换到相应目录。
但是接下来的一些操作,比如解压、删除zip包..都实现不了。

最开始是想着在本地的shell脚本执行所有命令,但是到了登陆到远程主机并成功切换到相应目录之后,后面的操作就不执行了。代码如下:

#!/bin/sh
npm run build
cd ./dist
zip -r 'prestom_frontend.zip' './'
scp prestom_frontend.zip app@xxx:/home/app/presto_monitor_frontend
scp prestom_frontend.zip app@xxx:/home/app
ssh app@10.9.46.114 -t 'cd /home/app/presto_monitor_frontend; bash --login'
// 以下操作不执行
ssh app@10.9.46.114 -t 'rm -rf index.html favicon.ico static; bash --login'
ssh app@10.9.46.114 -t 'unzip prestom_frontend.zip; bash --login'
ssh app@10.9.46.114 -t 'rm -rf prestom_frontend.zip; bash --login'

我又想到第二种方式,就是后面的删除等操作,我在远程创建shell脚本,然后我在远程执行是ok的。
但是怎么在本地的脚本里面去执行这个远程脚本呢?如果可以就不用再登陆远程去操作了,求大神指教

阅读 5.7k
6 个回答

你的脚本太复杂了,直接rsync同步到远程的目录下不就完了?

npm run build
# 注意--delete会删除远程目录下多余的文件,确保你的远程目录是对的,防止误删文件
rsync -aPz --delete dist/ root@10.9.46.114:/home/app/presto_monitor_frontend/

这样就搞定了,静态资源替换也不需要重启nginx,所以只要保证你的nginx是运行状态,这样部署就结束了,刷新下页面就可以看到新的版本了。

可以在远程server写一个http接口执行编译和部署操作,本地只要访问接口就可以了

ssh root@ip "cd /dir"
这个 "cd /dir" 就是ssh连接后的在远程计算机上执行的命令

ssh xx@hostname shell脚本完整路径

远程ssh 和本地执行还是有些差异的,类似你这种操作,要么使用代码管理的ci要么使用fibric 都很方便

每一个 ssh 都会建立一个全新的连接。所以你在第一个 ssh 做的对环境的改变(用 cd 改变当前目录)对后续命令没有任何影响。

如果要执行很多东西的话,可以用 bash -c:

ssh user@host bash -c "'
  cd some_directory
  rm some_file
  unzip some_other_file.zip
'"

不过这样写,-c后面的串的参数分割和变量替换会比较复杂。这里用了两层引号把它包起来,就是这个原因。(整个 ssh 命令是被本地 bash 解释的,解释之后 -c 之后串被传到服务器还有再被 bash 解释一遍。)里面有变量的话,很容易变成一团糟。

所以后来改成了这样:

script=$(cat  <<SCRIPT
  cd some_directory
  rm some_file
  unzip some_other_file.zip
SCRIPT
);
ssh user@host bash -c "'$script'";

这里用到了Here Documents。但是也只能略微减轻一点引号转义的烦恼。

(当然最后我们全面转向了 ansible ,自己写脚本还是太复杂了 ...)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题