php到shell脚本到php,通过无密码的ipv6 ssh隧道获取值


php to shell script to php for a value via passwordless ipv6 ssh tunnel

拓扑是server1->IPv6 ssh隧道->server2(secret酱=$ip_addr)代码逻辑遵循相同的路径php-cgi-script->shell脚本->检索secret酱$ipaddr并echo将其输出。我正在尝试从服务器2检索$ip_addr值,并将其显示在启动服务器1上。

****Web服务器上需要值$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脚本,用于调用邮件服务器上的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

*********注意:*********我有另一个脚本,它通过相同的路径和基本上相同的代码来恢复统计数据,并且运行良好。唯一的区别是,我不是调用pslogsumm,而是调用另一个php脚本。因此,没有网络错误需要应对或任何奇怪的事情。就好像它们在局域网上一样。

*********更新这个命令在命令行上非常有效:

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地址。这是我需要但无法达到的值。

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

让我们仔细研究一下您的代码。

$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']。为什么不直接使用它并去除所有这些无关的杂物呢?

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

这样的东西(使用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,imho的一个优点是,如果它不起作用,您可以获得有助于诊断的日志。因此,如果phpseclib不起作用,那么在这里发布日志应该会有所帮助。