Python 如何使用Paramiko访问远程主机?

Python 如何使用Paramiko访问远程主机?,python,ssh,paramiko,Python,Ssh,Paramiko,我刚刚开始使用Paramiko连接到另一台主机。我可以通过本地网络中的内部IP地址访问该主机,这很好(在Python中和通过控制台中的ssh) 但是,当我尝试通过主机的外部IP地址访问主机时,通过Paramiko的访问失败,而控制台中的ssh仍然有效。这里唯一的区别是,我使用的不是主机的内部IP地址,而是机器的外部IP地址 有人能帮忙吗?是否Paramiko与我在路由器上配置的端口转发冲突 以下是我目前的代码: import paramiko ssh = paramiko.SSHClient(

我刚刚开始使用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行,在 connect(主机名=target\u主机,用户名=un,密码=pwd) 文件“/usr/local/lib/python2.7/site packages/paramiko/client.py”,第251行,在connect中 在信号上重试(lambda:sock.connect(addr)) 文件“/usr/local/lib/python2.7/site packages/paramiko/util.py”,第270行,在重试信号中 返回函数() 文件“/usr/local/lib/python2.7/site packages/paramiko/client.py”,第251行,在 在信号上重试(lambda:sock.connect(addr)) 文件“/usr/local/ceral/python/2.7.9/Frameworks/python.framework/Versions/2.7/lib/python2.7/socket.py”,第224行,meth格式 返回getattr(self.\u sock,name)(*args) socket.error:[Errno 61]连接被拒绝


Python和控制台访问之间的唯一区别是端口。是否Paramiko总是通过端口22进行ssh?如果是这样,是否有方法指示Paramiko通过另一个端口?

使用此更改在我的主机上输出脚本:
stdin,stdout,stderr=ssh.exec_命令('ls-1/root | head-n5')

文件
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() )) 
STDOUT:
~
1
1421750672-TWya15.png
1.py
7


STDERR:
运行python 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() )) 
STDOUT:
~
1
1421750672-TWya15.png
1.py
7


STDERR:
我认为您需要
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
avoid

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,这在我的路由器上没有打开

感谢@betabando在中提供了完整的方法签名

解决我的问题的方法是在
connect
语句中包含端口规范,如下所示:

ssh.connect(主机名=target\u主机,端口=target\u端口,用户名=un,密码=pwd)


感谢所有的贡献者

您得到的错误是什么?有消息、超时等吗?
sshd
日志中有什么?哪里定义了
ABCD
以及定义了什么
target\u port=ABCD
将在该代码中引发异常,并且ssh连接将永远不会尝试…通过bash shell实现ssh毫无疑问…@twalberg:我使用
ABCD
来屏蔽实际使用的端口。当然,在我的实现中,我使用了该端口的实际数值。我验证了我可以使用
ssh进入username@host-p ABCD
。很抱歉没有从一开始就说清楚。嗨,对不起。。。我不确定我是否理解你的重要句子
我想你需要ssh。设置\u缺少\u主机\u密钥\u策略(paramiko.AutoAddPolicy())避免
。你能解释一下吗?至于您得到的输出,这正是我在通过本地网络IP地址连接到主机时所期望和得到的。请注意:示例代码指定了一个端口,但从未实际使用该值。是不是帕拉米科总是经过22号港口?这可以解释为什么在我的情况下,外部IP访问失败,因为我的路由器打开了另一个端口。