无论如何使用 phpseclib 或任何其他方法将 sftp 与私钥和 ftp 密码连接起来。
2 回答
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());
?>
我会说自己尝试密码验证。
这是根据日志发生的情况。
phpseclib 向服务器发送一个 SSH_MSG_SERVICE_REQUEST,实际上是在说“嘿-我想验证-可以吗?”
服务器以 SSH_MSG_SERVICE_ACCEPT 响应,实际上是在说“确定 - 将你得到的发送给我!”
然后 phpseclib 发送一个 SSH_MSG_USERAUTH_REQUEST 与对应于你的私钥的公钥,有效地说“好的 - 让我们用我的私钥进行身份验证 - 以确保你会接受它......这个公钥在你的白名单中吗?”
然后服务器以 NET_SSH2_MSG_USERAUTH_PK_OK 消息响应,有效地说,“是的 - 我们可以使用密钥 - 请现在用它签署服务器标识符”。
phpseclib 这样做,然后服务器就像“没关系!我只是记得 - 我做的唯一类型的身份验证是基于密码的身份验证!”
phpseclib 去“meh”大声笑,然后发送另一个 SSH_MSG_SERVICE_REQUEST,再次请求身份验证,服务器就像“什么!?你为什么要求身份验证!?”
似乎 phpseclib 可能不应该发送第二个 SSH_MSG_SERVICE_REQUEST 消息 - 它应该直接发送到 SSH_MSG_USERAUTH_REQUEST - 但可惜它目前没有这样做。我将尝试更新代码库来做到这一点,并将向作者提交拉取请求。
谢谢!