在远程机器上运行bash脚本的php方法

5
我在想是否有办法使用php在远程机器上运行已存在的bash脚本。Php服务器可以访问exec。我曾听说过您可以使用ssh,但我不知道它是否已安装在Web服务器上。我确实需要将参数传递给远程脚本。
澄清一下:
我有两个服务器,A和B A是一个具有php exec但没有ssh客户端的Web主机 B是Amazon EC2,我拥有完全的root访问权限,但没有配置Web服务器
是否有一种方法可以使用A服务器上的php脚本调用B服务器上的bash脚本?
编辑:我确认Web服务器上没有ssh。
11个回答

5

4

一种可能的方法是在服务器B上创建一个守护进程,然后检查mysql(或其他数据库)中更新的表,并在行存在时运行bash脚本,同时您只需向远程数据库添加一行命令以执行bash脚本,例如:

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

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

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


4
有多种解决方案,它们都依赖于配置B,因为您拥有root访问权限。
例如,在B上安装一个Web服务器。每当页面(runBash.php)被访问时,它会运行bash脚本。然后从A中使用wget或curl获取该页面。如果您非常熟练,可以添加错误检查以确认它是否正确运行。;)
如果您不能/不想安装Web服务器,则必须决定如何连接到B。流行的选项包括ssh、telnet、ftp、sftp等。一个小技巧是通过ftp上传文件到B,并在bash脚本中观察该文件。当检测到它时,运行脚本,删除文件并重复。或者您可以监视来自Web服务器的ping(假设静态IP),并在此触发bash脚本。
有很多选项可以完成这个任务;我认为最简单的方法是在B上安装Web服务器。如果您告诉我们B上的操作系统,我们可以更好地建议如何安装Web服务器。

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

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

1
@mazzzzz:在远程服务器上生成密钥对,然后将其身份(私钥)复制到Web主机。 只要ssh知道它在哪里(请参见“-i”选项),我认为密钥不需要位于任何特定目录中。 - Jeremiah Willcock
1
嗯,我没有ssh :/,这个问题变得有点棘手了。 - Jess
@mazzzzz:哪一端没有ssh?远程服务器还是Web主机?您能在Web主机上安装软件(非root用户)吗? - Jeremiah Willcock
@Jeremiah 网络主机不行,远程服务器可以。 而且我不能在网络主机上安装ssh(只有luck exec被允许)。 - Jess
@mazzzzz:你确定在Web主机上不能在你的主目录中安装东西吗?我猜你可以使用http://phpseclib.sourceforge.net/代替,但我对它一无所知。 - Jeremiah Willcock
显示剩余2条评论

3
从Web服务器到目标机器启用ssh访问并不是解决问题的好方法,即使在考虑安装客户端之前也是如此。您没有提供有关作业频率或未经授权用户运行该作业的影响的任何信息 - 但您确实应该将在要运行bash脚本的机器上的曝光最小限度地限制在必要的绝对最低限度。如果是我的话,我会编写一个通过[x]inetd在要运行脚本的机器上运行的脚本(使用[x]inetd意味着它不需要专用守护程序,而且它们通常编译了tcpwrappers支持或类似的内容),并实现基于挑战的身份验证机制(还需要发送的任何参数附带可验证/不可重放哈希)。这样,如果请求端被攻击,则最糟糕的情况就是可以为未知参数再次运行脚本。这并不是什么高深的技术 - 但需要一些代码。

2

如果只能通过SSH访问B服务器,而您在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。


2
你可以尝试使用Python的socket客户端服务器结构来完成此任务...使用Python很容易实现。

想要更轻松地使用PHP,请从这里开始:http://docs.python.org/library/socketserver.html。这是快速入门指南:http://setahost.com/python-quickstart-guide.php。 - Conex

2

1

PHP有一个SSH库,但如果您的Web服务器上甚至没有安装SSH客户端,我认为您将无法使用该库-但您应该检查一下。

如果没有-正如您所说,服务器A上没有SSH客户端-因此您无法建立与服务器B的SSH连接。

但是您还说您完全拥有服务器B的root访问权限-那么为什么不在服务器B上设置一个Web服务器呢?

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接