[英]phpseclib - Can I connect using username, key and password (not a key passphrase)
抱歉,如果我在文檔中錯過了此功能,但是可以使用私鑰和密碼(而不是我的私鑰密碼)連接到SFTP服務器。
這些示例顯示了用戶名/密碼,用戶名/密鑰和用戶名/密鑰/密鑰密碼驗證類型。
通過命令行連接時,系統會提示我輸入密碼...
user @ xxxx的密碼:
希望這個圖書館能處理這個嗎?
否則,是否還有其他基於PHP的解決方案可能支持用戶名/密鑰和服務器密碼身份驗證? 我在這里非常靈活,可以根據需要安裝模塊。
編輯
感謝到目前為止的幫助...我已經嘗試過您提到的諾伊伯特,但這似乎沒有用。 為了驗證連接到服務器的必要條件,我在命令行上對此進行了測試。
sftp key user@ip
提示輸入密碼
sftp user@ip
提示輸入密碼,但輸入正確時會告訴我“部分成功通過身份驗證”。
我認為,如果我可以先使用密鑰再使用密碼,則對目錄和密鑰的許可應該很好。
我開始認為該庫不支持我所需要的。
phpseclib 支持多因素身份驗證 。 這是一個如何做的例子:
<?php
include('Net/SSH2.php');
include('Crypt/RSA.php')
$rsa = new Crypt_RSA();
$rsa->loadKey(file_get_contents('/path/to/key.pem'));
$ssh = new Net_SSH2('www.domain.tld');
if (!$ssh->login('username', 'pass1', $rsa)) {
exit('Login failed');
}
// this does the same thing as the above
//if (!$ssh->login($username, 'pass1') && !$ssh->login('username', $rsa)) {
// exit('Login failed');
//}
echo $ssh->exec('pwd');
echo $ssh->exec('ls -la');
?>
但是要記住一點:很多人將受密碼保護的私鑰混淆為多因素(密碼和公鑰),而實際上卻並非如此。 至少就SSH而言並非如此。
@MartinPrikryl的免責聲明:此解決方案已過時,因為phpseclib原生支持多因素身份驗證 -另請參閱@BoukeVersteegh和@neubert的答案 。
我在使用phpseclib的項目中遇到了相同的問題。 我嘗試了一些建議都無濟於事,最后我自己對庫代碼進行了一些研究。 我最終修改了它,盡管不是很多。
在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類中)以獲取第二個密碼,並將其一直傳遞給'_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;
}
我從代碼的另一部分復制了鍵盤交互式調用,因此其中某些可能不是完全必要的。 盡管它可能不適用於所有服務器,但在我看來,它的工作效果很好。
簡單簡短的答案:首先使用user + key登錄,然后使用user + pass登錄。
$host = 'ftp.example.com';
$username = 'username';
$password = 'secret';
$key = new RSA();
$key->load(file_get_contents('~/.ssh/private_key.pem'));
$sftp = new SFTP($host);
if ($sftp->login($username, $key) || $sftp->login($username, $secret)) {
// success
} else {
// failed
}
是的,已經提到過這一點,但是長長的注釋使它變得晦澀難懂,看起來很復雜。
我決定刪除其他答案,因為事實證明我錯了。 您可以使用SSH進行多因素登錄,只是這不是一種標准方式。 這些身份驗證方法都不是opensh的本機或內置方法,因此沒有標准的解決方法。 大多數使用Google身份驗證器提供一次性密碼,但是有所不同。 根據本網站的建議,看起來是通過在SSH服務器對用戶進行身份驗證之后調用命令來完成的。 在login()
方法中login()
Net/SSH2.php
中的phpseclib
源代碼,它具有以下代碼:
case NET_SSH2_MSG_USERAUTH_FAILURE:
// can we use keyboard-interactive authentication? if not then either the login is bad or the server employees
// multi-factor authentication
[...]
return false;
甚至phpseclib開發人員也意識到可以進行多因素身份驗證,但是由於缺乏標准,他們沒有費心對其進行編碼。 搜尋您的錯誤代碼
通過部分成功認證
顯示這是您嘗試連接的服務器的設置方式。 如果您想編寫特定於服務器設置的多因素身份驗證代碼,我不知道為什么無法實現。 這是您需要編輯才能執行的文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.