Я использую phpseclib и я пытаюсь войти в систему с помощью ключа RSA:Войти с ключом RSA в phpseclib терпит неудачу (раз уходит)
$ssh = new SSH2('<server_domain_name>');
$key = new RSA();
$key->load(file_get_contents('<private_key_path>'));
if($ssh->login('root',$key)){
echo "Logged In!!!";
} else {
echo "Login failed!";
}
но Логин не удается! Заглядывая в класс SSH2, я вижу, что вход в систему с ключом RSA происходит в функции _login_helper() (правильно, если я ошибаюсь), который вызывается функцией _login(), вызываемой функцией login() (при обстоятельствах).
Логин() -> _login() -> _login_helper()
Но этот кусок кода:
if (!($this->bitmap & self::MASK_CONSTRUCTOR)) {
if (!$this->_connect()) {
return false;
}
}
в _login() функция всегда возвращает ложь и таким образом, исполнение никогда не достигает _login_helper(). Причина выше части кода возвращающейся фальши значение по умолчанию этих переменных/констант:
var $bitmap = 0;
const MASK_CONNECTED = 0x00000002;
Я немного разочарован. Я что-то упускаю?
EDIT: Я забыл упомянуть, что логин возвращается/не работает через несколько секунд. Добавляя несколько ECHO в методе _connect(), я вижу, что метод истекает во время ожидания данных сервера. Во время выполнения этого цикла:
while (!feof($this->fsock) && !preg_match('#(.*)^(SSH-(\d\.\d+).*)#ms', $data, $matches))
сервера выходов только одну строку: «SSH-2.0-OpenSSH_4.3», а затем (во второй раз, цикл выполняется), то раз здесь:
if ([email protected]_select($read, $write, $except, $sec, $usec) && !count($read)) {
EDIT 2: SSH-журналы стороны, что я пытаюсь подключиться сказать:
Соединение закрыто THE_SSH_SERVER_IP
4 ноября 23:09:58 web1 SSHD [10316]: не получил Опознавательный cation string fromTHE_ WEB_SERVER_IP
Какими бы полезными были журналы SSH. Вы можете получить их, выполнив 'define ('NET_SSH2_LOGGING', 2)' вверху, а затем 'echo $ ssh-> getLog()' после неудачного входа. Вместо этого ... кто знает. Возможно, PHP не может читать ваш закрытый ключ из-за разрешений. Возможно, ваш закрытый ключ не соответствует открытому ключу в файлах ~/.ssh/authorized_keys для пользователя, которого вы пытаетесь войти в систему. – neubert
getLog() возвращает пустую строку. Ключ можно прочитать с помощью file_get_contents, и я могу успешно использовать его через консоль. На самом деле, если я использую ssh2_auth_pubkey_file() с этим ключом, он отлично работает. Если функция, которая делает аутентификацию RSA, действительно является _privatekey_login(), то значения $ bitmask и MASK_CONNECTED никогда не позволят коду получить в этой точке. –