Я использую PHP vc9 NTS 5.3.28 на Windows Server 2003 Standard 32bit с phpseclib 0.3.6. Я пытаюсь создать сценарий, который будет подключаться к брандмауэру 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());
?>
У меня есть две проблемы с приведенным выше кодом:
- Если я пропущу setTimeout(10), тогда код никогда не будет существовать после следующего $ssh->read. Если он у меня есть, то код существует только после тайм-аута, но возвращает результаты.
Результаты, которые он возвращает, включают в себя кучу вещей, которых там быть не должно:
?[Kuser@PA-3020> запрос пароля-хэш-пароля test123 ?[?1h?=?[24;1H?[K $1$dgkhwrxe$kddYFmKCq9.zfiBKPAyN61
?[24;1H?[K?[?1l?>пользователь@PA-3020>
Мне нужна только строка, начинающаяся с $1$ (строка 3 выше). Я полагаю, что это как-то связано с регулярным выражением, но я не могу понять, что.
Если я запускаю команду в интерактивном режиме с PuTTY, я получаю следующее:
user@PA-3020> request password-hash password test123
$1$pxqhdlco$MRsVusWtItC3QiMm4W.xZ1
user@PA-3020>
ОБНОВИТЬ:
В соответствии с предложениями от neubert ниже, замена строки на $output = $ssh->read... следующим кодом работает:
$output = $ssh->read('/\$1\$.*/', NET_SSH2_READ_REGEX);
$output = preg_replace('/.*\$1\$/s','\$1\$', $output);