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

时间:2011-02-19 01:54:47

标签: php linux bash

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

澄清一下:我有两台服务器,A&乙
A是带有php exec的webhost,没有ssh客户端
B是亚马逊ec2,我有完全root访问权限,但它没有配置网络服务器 有没有办法在服务器B上使用服务器A上的php脚本调用bash脚本

感谢您的帮助, 最大

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

11 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

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

答案 2 :(得分:4)

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

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

如果您不能/不会安装网络服务器,您必须决定如何连接到B.流行的选项是ssh,telnet,f​​tp,sftp等。有点黑客是上传文件到B通过ftp,并在bash脚本中查看该文件。检测到后,运行脚本,删除文件,然后重复。或者您可以监视来自Web服务器的ping(假设是静态IP),并在其上触发bash脚本。

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

答案 3 :(得分:4)

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

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

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

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

答案 4 :(得分:3)

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

您没有提供有关作业频率的任何信息,也没有提供未经授权的用户运行的影响 - 但您应该将运行bash脚本的计算机上的曝光限制在绝对最小值必要的工作。

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

这样,如果请求端被泄露,可能发生的最坏情况是脚本可以针对未知参数运行额外的时间。

这不是火箭的讽刺 - 但需要一些代码。

答案 5 :(得分:2)

你可以为这个任务尝试python套接字客户端服务器结构......使用python

可以轻松完成

答案 6 :(得分:2)

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

您需要libssh2才能使用它(请参阅http://www.php.net/manual/en/intro.ssh2.php

答案 7 :(得分:2)

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

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

OR:

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

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

答案 8 :(得分:2)

只需使用一些远程执行工具。您可能已经在服务器B上安装了python。您可以非常轻松地在python中创建一个小的XMLRPC服务器,这需要大约。 20行代码。

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

你只需要确保使用digest auth或其他东西来保护它,也许还需要ssl。

答案 9 :(得分:1)

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

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

“本地服务器”:

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

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

<? exec("bash_command"); ?>

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

答案 10 :(得分:1)

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

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

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

您可以在服务器A上执行PHP脚本,该服务器向服务器B发出HTTP请求并执行PHP脚本,这可以启动您的bash脚本。您可以保护呼叫bei HTTPS并另外使用PHP加密呼叫。