我一直在尝试使用phpseclib来运行与各种云服务器的简单SSH会话。每次使用密钥登录。
使用没有密码保护的密钥的测试很好:我在标准端口22上尝试了一个,然后在非标准端口上尝试了另一个,并且两者都有效。 (两者都在Amazon EC2,不同地区。)
但我尝试的第一次测试失败了,其中包括:
SSH_MSG_USERAUTH_FAILURE: publickey,password
它有一个受密码保护的密钥,带有非标准端口。这是我的脚本(更改名称以保护无辜者):
include('Net/SSH2.php');
include('Crypt/RSA.php');
$ssh = new Net_SSH2('10.1.2.3', /*port*/999);
$key = new Crypt_RSA();
$key->setPassword('secrets');
$ret = $key->loadKey(file_get_contents('/home/tester/.ssh/my_private_key'));
if(!$ret){
echo "loadKey failed\n";
exit;
}
if (!$ssh->login('ubuntu', $key)) {
print_r($ssh->errors);
exit("Login Failed\n");
}
echo $ssh->exec('pwd');
echo $ssh->exec('ls -la');
我做了ssh-agent -d /home/tester/.ssh/my_private_key
(强制它提示我),然后在命令行上使用了ssh,它运行了。如果我跳过设置密码,loadKey()
将返回false。
所以,现在我想知道是否不支持密钥类型? "坏"钥匙开头是这样的:
-----BEGIN DSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,A541E5B6B9077483BCEF845
YMMV4.....
而"好"键以:
开头-----BEGIN RSA PRIVATE KEY-----
YMMVgIBab54...
我找到了this question,其中Proc-Type和DEK-Info似乎很好,但他的是RSA,而不是DSA。那么DSA问题呢? (但如果是这样的话,当我试图loadKey()
时,phpseclib是否应该投诉?)
有关如何获取有关此问题的更多信息的任何建议? (不在这里发布实际的密钥!)
答案 0 :(得分:3)
要回答我的问题的“如何解决问题”部分,您可以在创建define('NET_SSH2_LOGGING', NET_SSH2_LOG_COMPLEX);
对象之前添加Net_SSH2
。然后在退出之前执行file_put_contents("ssh.log",$ssh->getLog());
(或echo $ssh->getLog()
)。这会记录发送到远程服务器的每个字节以及收到的每个字节。 (完整修改后的脚本如下所示。)
不幸的是,当只支持RSA时,您必须是域专家才能将此问题识别为使用DSA密钥。但是,对于其他问题,这种故障排除方法可能正是您所需要的。
include('Net/SSH2.php');
include('Crypt/RSA.php');
define('NET_SSH2_LOGGING', NET_SSH2_LOG_COMPLEX);
$ssh = new Net_SSH2('10.1.2.3', /*port*/999);
$key = new Crypt_RSA();
$key->setPassword('secrets');
$ret = $key->loadKey(file_get_contents('/home/tester/.ssh/my_private_key'));
if(!$ret){
echo "loadKey failed\n";
file_put_contents("ssh.log",$ssh->getLog());
exit;
}
if (!$ssh->login('ubuntu', $key)) {
print_r($ssh->errors);
file_put_contents("ssh.log",$ssh->getLog());
exit("Login Failed\n");
}
echo $ssh->exec('pwd');
echo $ssh->exec('ls -la');
file_put_contents("ssh.log",$ssh->getLog());
答案 1 :(得分:1)
-----BEGIN DSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,A541E5B6B9077483BCEF845
YMMV4.....
这是DSA密钥。 phpseclib目前仅支持RSA密钥。即使它确实支持DSA密钥,您也可能需要加载一个尚未编写的Crypt_DSA - 而不是Crypt_RSA lol