拓扑结构是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地址。这是我需要但却无法实现的价值。
答案 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工作,在这里发布日志也应该有所帮助。