在PHP中解析SSH2结果

时间:2014-06-23 16:43:40

标签: php phpseclib

我在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());
?>

上面的代码有两个问题:

  1. 如果我省略了setTimeout(10),那么代码永远不会存在下一个$ ssh-&gt;读取。如果我有它,那么代码只在超时后存在,但确实返回结果。
  2. 它返回的结果包括一堆不应该存在的东西:

    [K用户@ PA-3020&GT?;请求密码哈希密码test123 ?[1H = [24;????1H [K $ 1 $ $ dgkhwrxe kddYFmKCq9.zfiBKPAyN61

    [24; 1 H [K [1升&gt;有?用户@ PA-3020&GT;

  3. 我只想要以$ 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);
    

1 个答案:

答案 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 $不会出现在一行的末尾。这就是你的代码无效的原因。