【问题标题】:Run bash script on remote machine php在远程机器 php 上运行 bash 脚本
【发布时间】:2011-06-30 05:16:12
【问题描述】:

我想知道是否有人知道如何使用 php 运行已经在远程计算机上的 bash 脚本。 php 框可以访问 exec。我听说你可以使用 ssh,但我知道它是否安装在网络服务器上。我确实需要将参数传递给远程脚本。

澄清一下:

  • 我有两台服务器,A 和 B
  • A 是一个带有 php exec 的 webhost,没有 ssh 客户端
  • B 是亚马逊 ec2,我有完全的 root 访问权限,但它没有配置网络服务器

有没有办法用服务器 A 上的 php 脚本调用服务器 B 上的 bash 脚本

编辑:我确认我的网络服务器上没有 ssh。

【问题讨论】:

    标签: php linux bash


    【解决方案1】:

    如果访问服务器 B 的唯一方法是通过 SSH 并且您在服务器 B 上没有任何 SSH 客户端,那么您根本无法做其他事情,然后看着您的 AMI 实例的计费计数器不断增加.

     SERVER A <<-------- SSH ------->> SERVER B
    

    或者:

    您通过PHP AWS API 钻取访问权限。可能是,您可以直接访问您的 AMI。

     SERVER A <<-------- PHP AWS Toolkit ------->> SERVER B
    

    【讨论】:

      【解决方案2】:

      只需使用一些远程执行工具。你可能在服务器 B 上安装了 python。你可以很容易地在 python 中创建一个小的 XMLRPC 服务器,这大约需要。 20行代码。

      http://code.activestate.com/recipes/81549-a-simple-xml-rpc-server/

      你只需要确保你使用摘要身份验证或其他东西来保护它,也许另外还有 ssl。

      【讨论】:

        【解决方案3】:

        一种可能的方法是在服务器 B 上创建一个守护程序,然后检查 mysql(或其他数据库)中的更新表,如果存在一行,则运行 bash 脚本,而您只需将一行添加到远程数据库服务器 b 带有执行 bash 脚本的命令,例如:

        1. 服务器 B 每分钟左右检查一次更新的“命令”数据库、要运行的新脚本和参数……等等。

        2. 服务器 A 将命令添加到远程(或本地)数据库以运行 bash 脚本“/home/mybashscript etc1 etc2”

        3. 由于服务器 B 不断检查新命令,它会自动运行 bash 脚本。

        【讨论】:

          【解决方案4】:

          启用从网络服务器到目标计算机的 ssh 访问不是解决问题的好方法 - 即使在您考虑安装客户端之前也是如此。

          您没有提供有关作业频率的任何信息,也没有提供任何关于未经授权的用户运行它的影响的信息 - 但您确实应该将运行 bash 脚本的机器上的暴露限制在绝对最低限度完成这项工作所必需的。

          如果是我,我会在要运行该脚本的机器上编写一个通过 [x]inetd 运行的脚本(使用 [x]inetd 意味着它不需要专用的守护进程,它们也是'通常使用 tcpwrappers 支持或类似方式编译)并实现基于质询的身份验证机制(并且还要求发送的任何参数都附有可验证/不可重放的哈希)。

          这样,如果请求端受到威胁,最糟糕的情况是脚本可以针对未知参数运行更多次。

          这不是火箭科学 - 但需要一些代码。

          【讨论】:

            【解决方案5】:

            有一个用于 PHP 的 SSH-Lib - 但是如果在您的网络服务器上甚至没有安装 SSH-Client,我认为您不会有 die lib - 但您应该检查一下。

            如果不是——正如你所说,服务器 A 上没有 SSH 客户端——那么你就无法建立到服务器 B 的 SSH 连接。

            但是你也说你对服务器 B 有完全的 root 访问权限 - 那么为什么不在服务器 B 上设置一个网络服务器呢?

            您可以在服务器 A 上执行一个 PHP 脚本,该脚本向服务器 B 发出 HTTP 请求并执行一个 PHP 脚本,该脚本可以启动您的 bash 脚本。您可以通过 HTTPS 保护呼叫,并通过 PHP 对呼叫进行额外加密。

            【讨论】:

              【解决方案6】:

              有许多解决方案,它们都依赖于配置 B,因为您具有 root 访问权限。

              例如,在 B 上安装一个网络服务器。每当一个页面 (runBash.php) 被点击时,它就会运行 bash 脚本。然后从 A 中 wget 或 curl 页面。如果你真的很流畅,你可以添加错误检查以确认它运行正确。 ;)

              如果您不能/不会安装网络服务器,您必须决定如何连接到 B。流行的选项是 ssh、telnet、ftp、sftp 等。一个小技巧是将文件上传到B 通过 ftp,并在 bash 脚本中注意该文件。当它被检测到时,运行脚本,删除文件,然后重复。或者您可以监视来自您的网络服务器的 ping(假设为静态 IP),并在其上触发 bash 脚本。

              有很多选择可以解决这个问题;我认为最简单的是在 B 上安装网络服务器。如果您告诉我们 B 上的操作系统,我们可以就如何安装网络服务器提供更好的建议。

              【讨论】:

              • “在 B 上安装网络服务器”是最干净的解决方案恕我直言。如果需要,直接将脚本作为 CGI 脚本调用 - 参数在 $QUERY_STRING 中。不过,我不建议这样做,因为它很容易出现安全问题。编写一个具有适当参数解码的适当 CGI 包装器,最终调用您的脚本。还至少使用带有用户名和密码的 http 基本身份验证来保护 CGI,或者使用拒绝/允许,以便只有 A 的 IP 可以调用它
              【解决方案7】:

              你可以使用 php ssh2-functions,看看http://www.php.net/manual/en/function.ssh2-exec.php

              你需要 libssh2 才能使用它(见http://www.php.net/manual/en/intro.ssh2.php

              【讨论】:

                【解决方案8】:

                http://phpseclib.sourceforge.net/documentation/net.html - SSH2 支持,外部依赖最少。

                【讨论】:

                  【解决方案9】:

                  你可以尝试这个任务的python套接字客户端服务器结构......用python很容易完成

                  【讨论】:

                  【解决方案10】:

                  我可能遗漏了一些东西,但我的解释是您希望 Php 在服务器上启动 bash 脚本?

                  编辑:您可以通过调用本地服务器上的 Php 脚本或单独调用 lynx 来调用远程服务器上的 Php 文件。 Lynx 是一个命令行浏览器。

                  “本地服务器”:

                  <? exec(lynx -dump http://remoteserver.com/bash_command.php); ?>
                  

                  在远程服务器的 web 目录中放置一个包含类似内容的 php 文件:

                  <? exec("bash_command"); ?>
                  

                  用您的 bash 命令(和参数)替换 bash_command。

                  【讨论】:

                  • 我需要在远程服务器上调用脚本。
                  • 我已经更新了我的答案。它仍然不清楚你的设置是什么。您对“本地服务器”有 root 访问权限吗?您想根据本地服务器上发生的情况每隔一段时间调用 Bash 脚本吗?或者你想启动一次 bash 脚本并让它在“远程服务器”上运行吗?
                  【解决方案11】:

                  如果您有 ssh,只需执行 exec("ssh username@server command -arg1 -arg2 ...");。您需要确保为无密码登录设置了身份验证密钥。您将需要 PHP 服务器上的 ssh 客户端和远程计算机上的 ssh 服务器。如果需要,您应该能够在没有 root 访问权限的情况下安装 ssh 的客户端部分,但这是许多系统的标准配置。

                  【讨论】:

                  • 如何设置密钥对?问题是我没有对虚拟主机的完全访问权限,只有远程服务器..
                  • @mazzzzz:在远程服务器上生成密钥对,然后将其身份(私钥)复制到 Web 主机。我不认为密钥需要在任何特定目录中,只要 ssh 知道它在哪里(请参阅-i 选项)。
                  • 好吧,我没有 ssh :/,这个问题有点棘手
                  • @mazzzzz:哪一端没有ssh?远程服务器还是 Web 主机?您可以在 Web 主机上安装软件(以非 root 用户身份)吗?
                  • @Jeremiah 网络主机没有,远程服务器有。而且我不能将 ssh 放在网络主机上(幸运的是允许执行)
                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2016-11-01
                  • 2016-04-02
                  • 1970-01-01
                  • 2012-09-26
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多