Home  >  Q&A  >  body text

php - linux中如何编写shell脚本才能在本地一键发布在远程服务器上的代码?

由于前段时间gitlat的服务器误操作导致数据大量丢失事件,让我深深感到了在服务器上直接敲命令的风险,所以我想尽量减少登上服务器的次数,由此引出这个问题。

场景:现在我发布 服务器的代码都是直接登上服务器然后运行发布脚本(publish.sh)文件才完成新代码的发布的,那我如何将这个操作转移到我本地呢,系统OS X。

我的想法是写一个脚本文件,然后ssh命令连上服务器,然事呢有个问题,通常ssh连上后是交互界面,我想完成的是直接就本地一步发布 如: /usr/local/publish xxx项目 。 但是我在shell没看到完成类似需求的命令。

并且我还有一个问题,我如何在本地直接对线上数据库进行一个操作呢(查询/更新/新增),因为线上数据库通常有做安全IP校验,所以通常只能直接登录上服务器去敲sql命令,但是这也是风险很大的一个操作,如果不小心delete from table 就不是那么好了(虽然有热恢复数据工具),如何更安全的,通过脚本传参(或类似)的方式操作数据库呢?

阿神阿神2716 days ago521

reply all(9)I'll reply

  • 巴扎黑

    巴扎黑2017-04-11 10:29:53

    这是我们简单部署时候喜欢用的脚本:

    function run_script() {
        ssh -i ${SSH_CERT} -p 22 ${REMOTE_USER}@${REMOTE_HOST} "$@"
        return $?
    }
    
    function upload_file() {
        scp -i ${SSH_CERT} -P 22 "$1" ${REMOTE_USER}@${REMOTE_HOST}:"$2"
        return $?
    }
    
    function upload_dir() {
        scp -i ${SSH_CERT} -P 22 -r "$1" ${REMOTE_USER}@${REMOTE_HOST}:"$2"
        return $?
    }
    
    upload_file "本地文件路径" "远端文件路径" || exit 1
    upload_dir "本地目录路径" "远端父目录路径(目录会存于该路径下)" || exit 1
    run_script "远端执行脚本" || exit 1
    

    reply
    0
  • 黄舟

    黄舟2017-04-11 10:29:53

    发布代码

    可以利用github的webhook,检测到有push动作,就自动拉取代码。

    权限最小

    你登录服务器/数据库的是一个普通用户,压根没有rm/drop权限,怎么会删除文件/数据呢……

    备份

    • 尝试危险操作之前,先备份;

    • 每隔一段时间,就全量/增量备份;

    • 还要确认备份可用。

    reply
    0
  • ringa_lee

    ringa_lee2017-04-11 10:29:53

    ssh user@host '/usr/local/publish xxx'
    # 通过 ssh 连接到远程主机,并执行 /usr/local/publish xxx

    reply
    0
  • ringa_lee

    ringa_lee2017-04-11 10:29:53

    为什么不用ansible

    reply
    0
  • 巴扎黑

    巴扎黑2017-04-11 10:29:53

    不知道回答得对不对

    ssh user@host ls ~

    是可以得到字面意思的结果的.

    同样的,

    ssh user@host /somewhere/publish.sh
    

    不知道可不可以?

    下面与题主无关:
    呵呵, 不知道哪块料给我点的减号.
    有本事点减号, 咱们出来聊聊?

    reply
    0
  • 大家讲道理

    大家讲道理2017-04-11 10:29:53

    一楼给的方案不错
    我给楼主推荐一个发版工具 http://www.walle-web.io/docs/ (PHP写的支持git svn)

    reply
    0
  • 阿神

    阿神2017-04-11 10:29:53

    我一般都把要删除的拉到tmp

    reply
    0
  • 怪我咯

    怪我咯2017-04-11 10:29:53

    可以看看ansible,
    另外用jenkins基本的功能都能实现 配置也简单

    关于问题2: 用ssh隧道进行端口转发(命令行或securecrt等工具也可以),或给数据库装个web客户端

    reply
    0
  • 天蓬老师

    天蓬老师2017-04-11 10:29:53

    线上发布我一般使用服务器上git 的 post-receive hook
    http://krisjordan.com/essays/...

    数据库我们应该一般只做结构同步,我一般使用navcat上带的结构同步工具,来跟本地数据库同步结构。

    reply
    0
  • Cancelreply