1

拓扑是 server1 -> IPv6 ssh 隧道 -> server2 (secret sauce = $ip_addr) 代码逻辑遵循相同的路径 php cgi script -> shell script -> 检索 secret sauce $ip_addr 并回显它。我正在尝试从 server2 检索 $ip_addr 值并将其显示在启动 server1 上。

** * * 需要从邮件服务器回显的值 $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);


?>

** * **从上面执行以调用邮件服务器上的 php 脚本的 shell 脚本*

#!/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地址。那是我需要但无法达到的价值。

4

3 回答 3

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']. 为什么不直接使用它并删除所有这些无关紧要的东西呢?

于 2013-08-30T22:38:55.597 回答
0

it has actually turned out to be a hostkey issue. Still sorting it out.

于 2013-09-01T07:17:14.957 回答
0

像这样的东西怎么样(使用phpseclib,一个纯 PHP SSH2 实现)?:

<?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');

不带任何参数调用登录应该进行无密码身份验证。

恕我直言,phpseclib 的一个优点是,如果它不起作用,您可以获得有助于诊断的日志。因此,即使 phpseclib 无法在此处发布日志也应该会有所帮助。

于 2013-09-04T12:56:26.227 回答