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