更一般地,如果你得到這個錯誤,你應該嘗試用的paramiko的確切參數ssh方式連接正在嘗試使用:
我發現有太多的SSH密鑰導致某些(但不是全部)我的結構SSH連接失敗,因爲所有密鑰都提供給遠程主機。在過去,格式不正確的密鑰也爲我提出了此錯誤消息(您可以通過從~/.ssh/
中刪除密鑰來檢測它們,一次只能一個。)
不幸的是,Fabric不尊重您的.ssh/config設置。如果你想調試這一點,你可以運行以下命令:
#!/usr/bin/env python
import paramiko
paramiko.util.log_to_file("/tmp/paramiko.log")
ssh = paramiko.SSHClient()
# Run this if you get host key errors: see later
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect("example.com", username="myuser", password="mypassword")
,並檢查輸出/tmp/paramiko.log
- 你可能會看到類似這樣的:
INF [20120904-16:58:52.155] thr=1 paramiko.transport: Disconnect (code 2): Too many authentication failures for myuser
您可以set no_keys on the Fabric env environment:
env.no_keys = True
但是你需要告訴Fabric爲特定的主機使用特定的密鑰。正如上文所述,你可以做你的fabfile有:
from fabric.api import env
env.key_filename = "/path/to/.ssh/ssk_non_public_key"
更一般here's a function to parse your .ssh config and pull out selective keys - 在這個鍵,SSH密鑰使用。對於這個自動工作,你需要IdentityFile添加到~/.ssh/config
:
Host example.com
IdentityFile /home/jp/.ssh/id_rsa_example
失敗的另一個原因可能是paramiko does not recognize all host key types。這有點更成問題:paramiko悄悄忽略了~/.ssh/known_hosts
中的主機密鑰,因爲它不是它理解的主機密鑰格式。嘗試的ssh-ING與-v看看SSH說什麼線發現主機密鑰匹配:
debug1: Host '1.2.3.4' is known and matches the RSA host key.
debug1: Found key in /home/jp/.ssh/known_hosts:105
你可以嘗試刪除這條線,然後再次做ssh和接受(新?)主機密鑰,並然後看看paramiko是否開心。如果這是問題,但這並不能解決問題,那麼我就不會看到明確的解決方案。
你的ssh會話有些奇怪的事情發生。服務器運行的是什麼操作系統?試試'ssh -o「PreferredAuthentications = password」'看看它是否拒絕你的訪問。 – JimB 2011-03-09 14:50:48
這剛剛開始工作。除了停止虛擬機並重新啓動虛擬機之外,我沒有改變任何我能記得的事情,但我認爲我之前已經完成了......無論如何,感謝所有這些想法。 – verbatim 2011-03-10 15:08:00