无论如何使用phpseclib或任何其他方法将sftp与私钥和ftp密码连接起来。
答案 0 :(得分:7)
SFTP服务器同时使用密码和公钥认证很少见。我的猜测是你最有可能拥有密码保护的私钥。如果是这样,你可以这样登录:
<?php
include('Net/SFTP.php');
include('Crypt/RSA.php');
$sftp = new Net_SFTP('www.domain.tld');
$key = new Crypt_RSA();
$key->setPassword('whatever');
$key->loadKey(file_get_contents('privatekey'));
if (!$sftp->login('username', $key)) {
exit('Login Failed');
}
print_r($sftp->nlist());
?>
如果您的服务器确实在做两件事,那么以下情况应该有效:
<?php
include('Net/SFTP.php');
include('Crypt/RSA.php');
$sftp = new Net_SFTP('www.domain.tld');
$key = new Crypt_RSA();
$key->setPassword('whatever');
$key->loadKey(file_get_contents('privatekey'));
if (!$sftp->login('username', $key) && !$sftp->login('username', 'password')) {
exit('Login Failed');
}
print_r($sftp->nlist());
?>
答案 1 :(得分:2)
我会说只是尝试密码验证。
以下是每个日志发生的事情。
phpseclib向服务器发送SSH_MSG_SERVICE_REQUEST,有效地说“嘿 - 我想认证 - 那好吗?”
服务器以SSH_MSG_SERVICE_ACCEPT响应,有效地说“确定 - 发给我你的东西!”
然后phpseclib发送一个SSH_MSG_USERAUTH_REQUEST,其中包含与您的私钥对应的公钥,实际上是说“确定 - 让我用我的私钥验证 - 确保您接受它......这是您的白名单中的公钥?“
服务器然后用一条NET_SSH2_MSG_USERAUTH_PK_OK消息回复,有效地说,“是的 - 我们对密钥没问题 - 请立即用它签署服务器标识符”。
phpseclib做到这一点,然后服务器就像“没关系!我记得 - 我唯一的auth类型是基于密码的auth!”
phpseclib去了“meh”大声笑然后发送另一个SSH_MSG_SERVICE_REQUEST,再次要求auth,服务器就像“什么!?为什么要求授权!”
似乎phpseclib可能不应该发送第二条SSH_MSG_SERVICE_REQUEST消息 - 它应该直接发送到SSH_MSG_USERAUTH_REQUEST - 但是它目前没有这样做。我将尝试更新代码库以执行此操作并向作者提交拉取请求。
谢谢!