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

时间:2015-02-25 15:47:41

标签: python ssh 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行,in     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中     返回功能()   文件" /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     return getattr(self._sock,name)(* args) socket.error:[Errno 61]拒绝连接

Python和控制台访问之间的唯一区别是端口。可能是Paramiko总是通过端口22进入ssh吗?如果是这样,有没有办法指示Paramiko通过另一个港口?

2 个答案:

答案 0 :(得分:5)

使用此更改在我的主机上输出您的脚本: 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
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')

SSH PROGRAMMING WITH PARAMIKO | COMPLETELY DIFFERENT

答案 1 :(得分:0)

好的......我现在已经解决了问题:问题确实是在我的脚本中没有规定要通过的端口。因此,Paramiko默认使用端口22 - 这在我的路由器上没有打开。

感谢@betabandido在this post中提供了完整的方法签名。

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

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

感谢所有贡献者!