paramiko 和 python ssh [英] paramiko and python ssh

查看:70
本文介绍了paramiko 和 python ssh的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试与主机建立 ssh 连接.这是我的代码:

def make_connection_paramiko(用户名,密码):ssh = paramiko.SSHClient()主机名 = "用户名@hobbes.cs.ucsb.edu"ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())ssh.load_host_keys(os.path.expanduser(os.path.join("~", ".ssh", "known_hosts")))尝试:ssh.connect(hostname, port = 22, username = ‘username’, password = ‘password’)除了 paramiko.AuthenticationException:打印登录失败!%s\t%s"%(用户名,密码)除了socket.timeout:打印套接字连接失败"#print str(value) +"\t"+ 消息别的:打印登录成功!%s\t%s"%(用户名,密码)ssh.close()

但由于某种原因,我不断收到以下错误:

回溯(最近一次调用最后一次):文件pass_crack.py",第 56 行,在 <module> 中.begin_cracking(词表,用户名)文件pass_crack.py",第 45 行,在 begin_cracking 中make_connection_paramiko(用户名,你好")文件pass_crack.py",第 29 行,在 make_connection_paramiko 中ssh.connect(hostname, port = 3600, username = 'xxxxxx', password = 'xxxxxx')文件/usr/lib/python2.7/dist-packages/paramiko/client.py",第 282 行,在连接中对于 socket.getaddrinfo(hostname, port, socket.AF_UNSPEC, socket.SOCK_STREAM) 中的 (family, socktype, proto, canonname, sockaddr):socket.error: [Errno 2] 没有那个文件或目录

我正在尝试使用 paramiko 和 python 进行连接,我使用的是 Ubuntu 13.04.我不确定出了什么问题,当我尝试使用 pxssh 使用相同的主机名、用户名和密码值进行连接时,连接有效,那么为什么它不能与 paramiko 一起使用?

提前致谢

解决方案

答案

这不是主机名:

hostname = "username@hobbes.cs.ucsb.edu"

相反,这是一个连接字符串.删除 username@ 部分,它应该再次连接.

更多信息

记住,你可以随时查看源代码.在这里,您可以看到主机名被直接传递到原始套接字调用中:

socket.getaddrinfo(hostname, port, socket.AF_UNSPEC, socket.SOCK_STREAM)

查看socket.getaddrinfo的帮助,我们可以看到它正在尝试解析一个实际的主机名,类似于nslookup所需的语法:

<预><代码>>>>打印 socket.getaddrinfo.__doc__getaddrinfo(host, port [, family, socktype, proto, flags])->(family, socktype, proto, canonname, sockaddr) 列表将主机和端口解析为 addrinfo 结构.

最后,我建议考虑在 paramiko 和其他底层库中启用 debugging:

<预><代码>>>>导入日志>>>记录器 = paramiko.util.logging.getLogger()>>>logger.setLevel(logging.DEBUG)

I am trying to connect setup a ssh connection with a host machine. Here is my code:

def make_connection_paramiko(Username, Password):
    ssh = paramiko.SSHClient()
    hostname = "username@hobbes.cs.ucsb.edu"
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.load_host_keys(os.path.expanduser(os.path.join("~", ".ssh", "known_hosts")))
    try:
        ssh.connect(hostname, port = 22, username = 'username', password = 'password')
    except paramiko.AuthenticationException:
        print "Login failed! %s\t%s" %(username, password)
    except socket.timeout:
        print "Socket connection failed"
        #print str(value) +"\t"+ message
    else:
        print "Login Successful! %s\t%s" %(username, password)
    ssh.close()

But for some reason I keep on getting the following error:

Traceback (most recent call last):
  File "pass_crack.py", line 56, in <module>
    begin_cracking(wordlist, username)
  File "pass_crack.py", line 45, in begin_cracking
    make_connection_paramiko(username, "hello")
  File "pass_crack.py", line 29, in make_connection_paramiko
    ssh.connect(hostname, port = 3600, username = 'xxxxxxx', password = 'xxxxxx')
  File "/usr/lib/python2.7/dist-packages/paramiko/client.py", line 282, in connect
    for (family, socktype, proto, canonname, sockaddr) in socket.getaddrinfo(hostname, port, socket.AF_UNSPEC, socket.SOCK_STREAM):
socket.error: [Errno 2] No such file or directory

I am trying to connect using paramiko with python, and I am using Ubuntu 13.04. I am not sure what is wrong, when I have tried to connect using the same values for the hostname, username, and password using pxssh the connection works, so why doesn't it work with paramiko?

Thanks in advance

解决方案

Answer

That's not a hostname:

hostname = "username@hobbes.cs.ucsb.edu"

Instead, that's a connection string. Remove the username@ section, and it should connect again.

Further Information

Remember, you can always look at the source code. Here, you can see that hostname is passed directly into the raw socket call:

socket.getaddrinfo(hostname, port, socket.AF_UNSPEC, socket.SOCK_STREAM)

Looking at the help for socket.getaddrinfo, we can see it's trying to resolve an actual hostname, similar to the syntax required for nslookup:

>>> print socket.getaddrinfo.__doc__
getaddrinfo(host, port [, family, socktype, proto, flags])
    -> list of (family, socktype, proto, canonname, sockaddr)

Resolve host and port into addrinfo struct.

Lastly, I would recommend looking at enabling debugging in paramiko, and other underlying libraries:

>>> import logging
>>> logger = paramiko.util.logging.getLogger()
>>> logger.setLevel(logging.DEBUG)

这篇关于paramiko 和 python ssh的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆