Я искал способ использовать SSH2 PHP для создания типа терминал. Чтобы подключиться к Amazon в обычном терминале, вы должны использовать что-то вроде ssh -i path_to/key.pem ec2.ip-555-xxx.com. С другой стороны, в PHP SSH2 имеет функцию ssh2_auth_pubkey_file. Но здесь я наткнулся на небольшую стену, так как Amazon предоставляет мне только 1 файл закрытого ключа (.pem), а функция имеет аргументы как для закрытого, так и для открытого ключа. В конечном итоге я хотел бы, чтобы клиент загружал файл .pem на сервер и мог подключаться к локальному или удаленному серверу SSH с помощью PHP SSH2 на Amazon, используя этот файл .pem.
PHP SSH2 и Amazon EC2 .pem
Ответы (3)
.pem — это сертификат сервера для веб-сервера apache, он не имеет ничего общего с ssh. См.: https://serverfault.com/questions/9708/what-is-a-pem-file-and-how-does-it-differ-from-other-openssl-generated-key-file-f< /а>
Кажется, это также может быть комбинированный файл с открытым и закрытым ключами. В любом случае напрямую по ssh работать не будет, нужно будет конвертировать в обычные файлы.
У вас все равно это наоборот - амазонка не даст вам закрытый ключ, как раз наоборот - вы даете амазонке открытый ключ. Вы создаете пару закрытый/открытый ключ локально, а затем загружаете открытый ключ в файлы .ssh/authorize_keys.
ssh -i mypem.pem [email protected]. Поскольку я все равно создаю псевдоним SSH_config, я просто добавляю файл идентификации для этого файла pem и теперь просто делаю ssh amz в командной строке.
- person Mauvis Ledford; 16.10.2011
Лично я бы рекомендовал использовать phpseclib, чистую реализацию PHP SSH2:
<?php
include('Net/SSH2.php');
$key = new Crypt_RSA();
//$key->setPassword('whatever');
$key->loadKey(file_get_contents('privatekey'));
$ssh = new Net_SSH2('www.domain.tld');
if (!$ssh->login('username', $key)) {
exit('Login Failed');
}
echo $ssh->exec('ls -la');
?>
Вот как вы получаете закрытый и открытый ключи из .pem в php.
$eKey = file_get_contents('/pathto/key.pem');
$key_private = openssl_get_privatekey($eKey);
$keyDet=openssl_pkey_get_details($key_private);
$key_public = openssl_pkey_get_public(array($keyDet['key'],""));
$keyPDet=openssl_pkey_get_details($key_public);