V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
nikoo
V2EX  ›  问与答

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

  •  
  •   nikoo · 2018-05-20 01:03:36 +08:00 · 2668 次点击
    这是一个创建于 2140 天前的主题,其中的信息可能已经有所发展或是发生改变。
    例如在服务器 A 上运行着一个检测服务可用性的脚本,当发现服务不可用时,通过什么方式可以通知执行服务器 B 上的脚本(例如 /usr/local/bin/reboot.sh )

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

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

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