@MartinPrikryl による免責事項: phpseclib が多要素認証をネイティブにサポートするようになったため、このソリューションは廃止されました。@BoukeVersteeghおよび@neubertによる回答も参照してください。
phpseclib を使用しているプロジェクトの 1 つで、同じ問題に遭遇しました。私はいくつかの提案を試してみましたが、うまくいかず、最終的に自分でライブラリ コードを調査しました。大したことではありませんが、最終的に変更しました。
SSH2.php のプライベート メソッド '_privatekey_login' (キーがある場合にログイン メソッドから呼び出される) では、メソッドの最後に認証失敗を処理するコードがあります。
extract(unpack('Ctype', $this->_string_shift($response, 1)));
switch ($type) {
case NET_SSH2_MSG_USERAUTH_FAILURE:
// either the login is bad or the server employs multi-factor authentication
return false;
case NET_SSH2_MSG_USERAUTH_SUCCESS:
$this->bitmap |= NET_SSH2_MASK_LOGIN;
return true;
}
いくつかのログを入力した後、サーバーから返された応答が実際に「password,keyboard-interactive」であることがわかりました。
すべてのログイン メソッド (SFTP クラスと SSH2 クラスの両方) を変更して、2 番目のパスワードを取得し、それを '_privatekey_login' メソッドに渡しました。次に、上記のセクションを次のように変更しました。
extract(unpack('Ctype', $this->_string_shift($response, 1)));
switch ($type) {
case NET_SSH2_MSG_USERAUTH_FAILURE:
// Possible multi-factor authentication.
if ($password && $this->_keyboard_interactive_login($username, $password)) {
$this->bitmap |= NET_SSH2_MASK_LOGIN;
return true;
}
// the login is bad.
return false;
case NET_SSH2_MSG_USERAUTH_SUCCESS:
$this->bitmap |= NET_SSH2_MASK_LOGIN;
return true;
}
コードの別の部分からキーボードの対話型呼び出しをコピーしたので、その一部は完全には必要ないかもしれません。すべてのサーバーに当てはまるわけではありませんが、私の場合はうまく機能しました。