nikoo
V2EX  ›  问与答

一台服务器通知另一台服务器上脚本执行的方法是什么?

  •  
  •   nikoo · May 20, 2018 · 3255 views
    This topic created in 3007 days ago, the information mentioned may be changed or developed.
    例如在服务器 A 上运行着一个检测服务可用性的脚本,当发现服务不可用时,通过什么方式可以通知执行服务器 B 上的脚本(例如 /usr/local/bin/reboot.sh )

    目前使用的方法非常笨拙,需要在 B 服务器上搭建 nginx+php,然后 A 服务器去调用 http://B/reboot.php 然后这个 php 文件去执行这个脚本

    所以针对这个需求应该如何解决呢?
    17 replies    2018-05-21 03:33:16 +08:00
    CloudnuY
        1
    CloudnuY  
       May 20, 2018   ❤️ 1
    RPC ?
    huclengyue
        2
    huclengyue  
       May 20, 2018 via Android   ❤️ 1
    RPC
    ys0290
        3
    ys0290  
       May 20, 2018 via iPhone   ❤️ 1
    ssh 免密登陆
    nikoo
        4
    nikoo  
    OP
       May 20, 2018
    @CloudnuY @huclengyue 谢谢,能否简单叙述下如何实现?

    @ys0290 意思时让 A 服务器 SSH 到 B 然后执行 B 上的脚本?那 B SSH 的私钥要存在 A 服务器里?
    CloudnuY
        5
    CloudnuY  
       May 20, 2018   ❤️ 1
    @nikoo #4 RPC 需要做服务端和客户端开发; SSH 调用只需要把 A 的公钥存在 B 服务器里
    Jakesoft
        6
    Jakesoft  
       May 20, 2018 via iPhone   ❤️ 1
    ssh root@hostb '/usr/local/bin/reboot.sh'
    Jakesoft
        7
    Jakesoft  
       May 20, 2018 via iPhone
    先手动把 key 发过去,只要操作一次即可:ssh-copy-id root@hostb
    nikoo
        8
    nikoo  
    OP
       May 20, 2018
    @CloudnuY @Jakesoft 非常感谢! SSH 这个方案优雅的一匹
    jssyxzy
        9
    jssyxzy  
       May 20, 2018
    写个 shell
    expect
    nikoo
        10
    nikoo  
    OP
       May 20, 2018
    @jssyxzy 谢谢,不太明白,可稍微解释一下?
    clino
        11
    clino  
       May 20, 2018 via Android
    简单就 ssh
    比较多这种情况又复杂可以用 jenkins
    defunct9
        12
    defunct9  
       May 20, 2018 via iPhone
    开 ssh,让我上去弄
    defunct9
        13
    defunct9  
       May 20, 2018 via iPhone
    免密 ssh 有些问题,就是密钥爆露后对 B 机基本是为所欲为了。搭消息服务器,比如 rabbitmq,两机认证登陆消息服务器,且限定 B 执行的内容,我是这么做得。
    defunct9
        14
    defunct9  
       May 20, 2018 via iPhone
    jenkins 也有问题,如果需要执行 root 权限的命令,那么 jenkins 需要配 sudo 权限,无形中放大了 jenkins 的权限。
    symons
        15
    symons  
       May 20, 2018
    socket 通信
    Arnie97
        16
    Arnie97  
       May 21, 2018 via Android
    @defunct9 正是如此。楼主自己的方案问题在于所有人都能随便重启 B,而 #5 和 #7 的方案会使 A 能完全控制 B 的一切,也不合适。
    ysc3839
        17
    ysc3839  
       May 21, 2018
    我觉得 http 的方式没什么问题吧?要记得做身份验证,比如加个密码,最好能换成 https。
    如果觉得 PHP 太大的话可以直接用 CGI 调用 shell 脚本。需要注意的是 nginx 不支持传统 CGI,只支持 FastCGI,可以用 fcgiwrap 来支持。
    或者考虑用 Python 等语言直接运行一个 http 服务器。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   4318 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 10:06 · PVG 18:06 · LAX 03:06 · JFK 06:06
    ♥ Do have faith in what you're doing.