簡體   English   中英

如何使用 Paramiko 訪問遠程主機?

[英]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 進行 SSH 編程 | 完全不同

好的...我現在已經解決了這個問題:問題確實是在我的腳本中沒有指定要通過的端口。 因此,Paramiko 默認使用端口 22 - 在我的路由器上未打開。

感謝@betabandido 在這篇文章中提供了完整的方法簽名。

我的問題的解決方法是在connect語句中包含端口規范,如下所示:

ssh.connect( hostname = target_host, port = target_port, username = un, password = pwd )

感謝所有做出貢獻的人!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM