[英]How to access a remote host with Paramiko?
我剛剛開始使用 Paramiko 連接到另一台主機。 我可以通過本地網絡中的內部 IP 地址訪問該主機,這工作正常(在 Python 中和通過控制台中的ssh
)。
但是,當我嘗試通過其外部 IP 地址訪問主機時,通過 Paramiko 訪問失敗,而控制台中的ssh
仍然有效。 這里唯一的區別是我使用機器的外部 IP 地址而不是主機的內部 IP 地址。
有人可以幫忙嗎? 難道Paramiko 會以某種方式與我在路由器上配置的端口轉發發生沖突?
到目前為止,這是我的代碼:
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
target_host = 'external.IP'
# target_host = 'internal.IP'
# Internal access port for ssh transfer.
# target_port = 22
# External access port for ssh transfer.
target_port = ABCD
pwd = 'my.password'
un = 'my.username'
ssh.connect( hostname = target_host , username = un, password = pwd )
stdin, stdout, stderr = ssh.exec_command('ls -1 .')
print "STDOUT:\n%s\n\nSTDERR:\n%s\n" %( stdout.read(), stderr.read() )
添加:
收到的完整錯誤消息是:
回溯(最近一次調用):文件“./test.py”,第 25 行,在 ssh.connect( hostname = target_host , username = un, password = pwd ) 文件“/usr/local/lib/python2.7/ site-packages/paramiko/client.py”,第 251 行,在連接 retry_on_signal(lambda: sock.connect(addr)) 文件“/usr/local/lib/python2.7/site-packages/paramiko/util.py”中,第 270 行,在 retry_on_signal 中 return function() 文件“/usr/local/lib/python2.7/site-packages/paramiko/client.py”,第 251 行,在 retry_on_signal(lambda: sock.connect(addr)) 文件中“/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py”,第 224 行,在 meth 中返回 getattr(self._sock,name)( *args) socket.error: [Errno 61] 連接被拒絕
Python 和控制台訪問之間的唯一區別是端口。 難道 Paramiko 總是通過端口 22 訪問 ssh? 如果是這樣,有沒有辦法讓Paramiko通過另一個端口?
使用此更改在我的主機上輸出腳本: stdin, stdout, stderr = ssh.exec_command('ls -1 /root|head -n 5')
文件1.py
:
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
target_host = '127.0.0.1'
target_port = 22
pwd = 'password'
un = 'root'
ssh.connect( hostname = target_host , username = un, password = pwd )
stdin, stdout, stderr = ssh.exec_command('ls -1 /root|head -n 5')
print "STDOUT:\n%s\n\nSTDERR:\n%s\n" %( stdout.read(), stderr.read() )
# For Python3
# print("STDOUT:\n%s\n\nSTDERR:\n%s\n" %( stdout.read(), stderr.read() ))
運行python 1.py
:
STDOUT:
~
1
1421750672-TWya15.png
1.py
7
STDERR:
我認為你需要ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
避免。
The authenticity of host 'localhost (::1)' can't be
established.
RSA key fingerprint is
22:fb:16:3c:24:7f:60:99:4f:f4:57:d6:d1:09:9e:28.
Are you sure you want to continue connecting
(yes/no)?
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(
paramiko.AutoAddPolicy())
ssh.connect('127.0.0.1', username='jesse',
password='lol')
好的...我現在已經解決了這個問題:問題確實是在我的腳本中沒有指定要通過的端口。 因此,Paramiko 默認使用端口 22 - 在我的路由器上未打開。
感謝@betabandido 在這篇文章中提供了完整的方法簽名。
我的問題的解決方法是在connect
語句中包含端口規范,如下所示:
ssh.connect( hostname = target_host, port = target_port, username = un, password = pwd )
感謝所有做出貢獻的人!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.