我使用phpseclib 0.3.6在Windows 2003标准32位上运行PHPNTS5.3.28。我正在尝试创建一个脚本,它将连接到Palo网络防火墙,并执行一个命令来散列密码。我有以下代码:
<?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美元开头的行(上面第3行)。我想这和正则表达式有关,但我想不出是什么。
如果我与PuTTY交互地运行该命令,就会得到以下内容:
user@PA-3020> request password-hash password test123
$1$pxqhdlco$MRsVusWtItC3QiMm4W.xZ1
user@PA-3020>更新:
根据下面neubert的建议,将行替换为$output =$ssh->读.使用以下代码工作:
$output = $ssh->read('/\$1\$.*/', NET_SSH2_READ_REGEX);
$output = preg_replace('/.*\$1\$/s','\$1\$', $output);发布于 2014-06-23 19:05:34
它返回的结果包括一堆不该出现的东西: ??[Kuser@PA-3020>请求密码-散列密码test123?[?1h?=?[24;1H?]$1$dgkhwrxe$kddYFmKCq9.zfiBKPAyN 61 ?[24;1H][K?[?1L?>user@PA-3020]
这些是ANSI转义码。您可以使用File_ANSI删除它们。更多信息:
http://phpseclib.sourceforge.net/ssh/examples.html#top
不管怎么说,我猜你需要重新做你的regex。例如:
$output = $ssh->read('/^\$1\$.*$/', NET_SSH2_READ_REGEX);没有这样做,而是这样做:
$output = $ssh->read('/\$1\$/', NET_SSH2_READ_REGEX);问题是..。^匹配在行的开头,$匹配在末尾。通常当你写$ssh->写(.)命令回显返回到您,然后有一个新的行,然后您得到您的输出。这样就不能让^工作了。至于最后的$..。好吧,根据您自己的例子,$1$不会出现在行尾。所以这就是为什么你的代码不能工作。
https://stackoverflow.com/questions/24371104
复制相似问题