php通过无密码ipv6 ssh隧道将脚本写入php以获取值

时间:2013-08-30 19:17:25

标签: php linux bash shell ipv6

拓扑结构是server1 - > IPv6 ssh隧道 - > server2(秘密酱= $ ip_addr) 代码逻辑遵循相同的路径php cgi script - > shell脚本 - >检索秘密酱$ ip_addr并回显它。 我试图从server2检索$ ip_addr值并将其显示在启动服务器1上。

网络服务器上的

** * * 代码需要从邮件服务器回显的值$ ip_addr *

<?php

$addr['ip_addr'] = shell_exec('sudo /home/wemail1/cgi-bin/ip_addr_stats');
$ip = $_POST['ip_addr'];
#echo "<pre>$ip['ip_addr']</pre>";
echo $ip['ip_addr'];
var_dump($_POST);


?>

** * ** shell脚本是从上面执行以调用mailserver上的php脚本 *

#!/bin/bash
ssh -p 22 -6 2600:3c01:e000:44::14 "php /var/www/localhost/cgi-bin/postUser2master.php  .ssh;"
邮件服务器上的

** * ** * *** 脚本检索$ ip_addr * ***

<?php
#require_once('auth.php');
$master = fopen('/etc/postfix/master.cf', 'a+');
$id = 'bob';
$ip_addr = '2600:3c01:e000:44:0:0:0:10';
$valid = false;
while (($buffer = file_get_contents('/etc/postfix/master.cf')) !== false) {
    if (strpos($buffer,$id) !== false) {
        $valid = TRUE;
        echo $ip_addr;
        break;
    }else{
        fwrite($master,
            "\r\n".$id." unix -       -       n       -       -       smtp \n
-o syslog_name=postfix-".$id."\n
-o smtp_bind_address6=".$ip_addr."\n"
            );

    }
echo $ip_addr;
}
fclose($master);

?>

** * ** * ** * 的来自第一个脚本的 * * 错误 * ** * ** * ** * ** *

var_dump($_POST); -->  Arrayarray(0) { }

Undefined index: ip_addr

** * ** * ** * 的** 注意: * ** * ** * ** * * * * *** 我有另一个脚本,通过相同的路径恢复统计信息,基本相同的代码完美地工作。唯一的区别是,我调用另一个PHP脚本,而不是调用pslogsumm。因此,没有网络错误可以与之抗争或任何奇怪的事情。就好像他们在局域网上一样。

** * ** * ** * 的*** 更新 ** * ** * ** * ** * * 此命令在命令行上完美运行:

emailer1 cgi-bin # /usr/bin/ssh -p 22 -6 2600:3c01:e000:44::14 '/usr/bin/php /var/www/localhost/cgi-bin/postUser2master.php .ssh'
2600:3c01:e000:44:0:0:0:10emailer1 cgi-bin #

As does this one:

dev-box-201 www # /home/wemail1/cgi-bin/ip_addr_stats
+ ssh -p 22 -6 2600:3c01:e000:44::14 'php /var/www/localhost/cgi-bin/postUser2master.php  .ssh'
2600:3c01:e000:44:0:0:0:10dev-box-201 www #

它完美地吐出了ip地址。这是我需要但却无法实现的价值。

3 个答案:

答案 0 :(得分:0)

您似乎对变量名称和代码流非常困惑。

让我们仔细看看你的代码。

$addr['ip_addr'] = shell_exec('sudo /home/wemail1/cgi-bin/ip_addr_stats');

在这里,您将此shell命令的输出分配给变量$addr['ip_addr']。到目前为止一切都很好。

$ip = $_POST['ip_addr'];

在这里,您将POST变量分配给变量$ip。我不知道你为什么要这样做;没有为它提供任何背景,没有明显的理由去做。

echo $ip['ip_addr'];

最后,您尝试回显数组成员$ip['ip_addr']的值,这当然是您之前从POST变量获得的。当然,这个值不是一个开头的数组(可能甚至不存在)所以你得到的信息是:

Notice: Undefined index: ip_addr in /home/wemail1/www/index.php on line 147

最后:

var_dump($_POST);

当然会返回一个空的Array。正如我所怀疑的那样,你没有完成POST请求。


所以,你说你想要shell命令的输出。您已将其分配给$addr['ip_addr']。为什么不使用它并删除所有这些无关紧要的混乱?

答案 1 :(得分:0)

事实证明它实际上是一个主机密钥问题。 还在整理它。

答案 2 :(得分:0)

这样的事情(使用phpseclib, a pure PHP SSH2 implementation)?:

<?php
include('Net/SSH2.php');

$ssh = new Net_SSH2('tcp://[2600:3c01:e000:44]:14', 22);
$ssh->login();

echo $ssh->exec('php /var/www/localhost/cgi-bin/postUser2master.php  .ssh');

在没有任何参数的情况下调用login应该进行无密码验证。

phpseclib,imho的一个优点是,如果它不起作用,你可以获得有助于诊断的日志。因此,即使不是phpseclib工作,在这里发布日志也应该有所帮助。