我在Windows Server 2003 Standard 32bit上使用phpseclib 0.3.6运行PHP vc9 NTS 5.3.28。我正在尝试创建一个脚本,该脚本将连接到Palo Alto Networks防火墙并执行命令来散列密码。我有以下代码:
<?php
include 'Net/SSH2.php';
define('NET_SSH2_LOGGING', NET_SSH2_LOG_COMPLEX);
$ssh = new Net_SSH2('hostname');
echo ">Logging in...\n";
if (!$ssh->login('user', 'password')) {
exit('Login Failed');
}
echo ">Reading login results...\n";
/*echo $ssh->exec('request password-hash password test123');*/
$output = $ssh->read('user@PA-3020>');
echo $output . "\n";
echo ">Writing request...\n";
$ssh->write("request password-hash password test123\n");
$ssh->setTimeout(10);
echo ">Reading result...\n";
$output = $ssh->read('/^\$1\$.*$/', NET_SSH2_READ_REGEX);
echo $output . "\n";
echo ">Done.\n";
file_put_contents ('E:\PHP53\ssh2.log', $ssh->getLog());
?>
上面的代码有两个问题:
它返回的结果包括一堆不应该存在的东西:
[K用户@ PA-3020&GT?;请求密码哈希密码test123 ?[1H = [24;????1H [K $ 1 $ $ dgkhwrxe kddYFmKCq9.zfiBKPAyN61
[24; 1 H [K [1升&gt;有?用户@ PA-3020&GT;
我只想要以$ 1 $开头的行(上面第3行)。我认为它与正则表达式有关,但我无法弄清楚是什么。
如果我以交互方式使用PuTTY运行命令,我会得到以下内容:
user@PA-3020> request password-hash password test123
$1$pxqhdlco$MRsVusWtItC3QiMm4W.xZ1
user@PA-3020>
更新:
根据以下neubert的建议,使用以下代码替换$ output = $ ssh-&gt; read ...的行:
$output = $ssh->read('/\$1\$.*/', NET_SSH2_READ_REGEX);
$output = preg_replace('/.*\$1\$/s','\$1\$', $output);
答案 0 :(得分:2)
它返回的结果包括一堆不应该的东西 在那里:
[K用户@ PA-3020&GT?;请求密码哈希密码test123 ?[?1h?=?[24; 1H?[K $ 1 $ dgkhwrxe $ kddYFmKCq9.zfiBKPAyN61
[24; 1 H [K [1升&gt;有?用户@ PA-3020&GT;
这些是ANSI转义码。您可以使用File_ANSI删除它们。更多信息:
http://phpseclib.sourceforge.net/ssh/examples.html#top
无论如何,我的猜测是你需要重做你的正则表达式。例如
$output = $ssh->read('/^\$1\$.*$/', NET_SSH2_READ_REGEX);
而不是这样做:
$output = $ssh->read('/\$1\$/', NET_SSH2_READ_REGEX);
事情是... ^在行的开头匹配,在结尾处匹配$。通常当你执行$ ssh-&gt; write(...)时,命令会回显给你,然后有一个新行,然后你得到你的输出。这样就可以防止^工作了。至于最后的$ ..根据你自己的例子,$ 1 $不会出现在一行的末尾。这就是你的代码无效的原因。