利用python完成连接ssh

连接ssh,为了完成控制台交互使用第三方模块,pexpect能够实现程序交互,等待屏幕输出,作出响应。

我们首先要了解 SSH连接的命令是: SSH user@ip
然后我们需要发送这个命令 利用的方法是command=pecpect.spawn( “SSH”+ user+”@”+ip)
接下来 我们会获得一个响应,我们用command.expect方法来匹配响应num=command.expect([‘1′,’2′,’3’]),如果我们获得的响应是1,那么就返回给num结果0,如果2就返回1,是返回相应的list位置,这样我们可以用条件语句来判断返回值是什么.
收到响应后发送数据一般用sendline,sendline在发送后会加一个回车,能够模拟对命令行的输入.

检测connect()函数,函数接受包括用户名主机名和密码。返回进行的ssh连接结果,然后利用pexpect库来做出不同的响应。一般可能有三种输出:超市,表示主机使用一个新的公钥信息和输入密码的提示,如果出现超时,那么session.expect()返回0,用下面的判断语句打印一个错误信息后返回,如果获得了ssh_newkey信息,他则会返回1,使他发送一个yes(ssh连接中有需要输入yes/no),然后发送ssh的密码。

更多解释在注释中。

源码如下:

#coding=utf-8
import pexpect
PROMPT = ['#','>>>', '>', '\$'] #如果直接是PROMPT中存在的字符,说明直接登录上去了。
def send_command(child, cmd):
    child.sendline(cmd)
    child.expect(PROMPT)
    print child.before
def connect(user, host, password):
    ssh_newkey = 'Are you sure you want to continue connecting'
    connStr = 'ssh ' + user + '@' +host
    child = pexpect.spawn(connStr)
    ret = child.expect([pexpect.TIMEOUT, ssh_newkey, '[P|p]assword:'])
    if ret == 0:
        print '[-] Error Connecting'
        return
    if ret == 1:
        child.sendline('y')
        ret = child.expect([pexpect.TIMEOUT,'[P|p]assword:'])
    if ret == 0:
        print '[-] Error Connecting'
        return
    child.sendline(password)
    child.expect(PROMPT)
    return child
    #     利用spawn创建会话之后,利用expect匹配可能存在的返回结果,
    #     如果匹配'Are you sure you want to continue connecting'
    #      说明需要确认认证信息,如果直接返回password或者Password
    #      这里利用[p|P]assword正则来匹配,说明需要输入密码,如果直接是
    #      PROMPT中存在的字符,说明直接登录上去了.
    #     通过验证,我们可以使用单独的command函数在ssh中发送命令
    #     command函数需要接受的是ssh回话和命令字符串,然后他想回话发送命令字符串,并等待命令提示符再次出现,并将获得的结果打印出来。
def main():
    host = '192.168.1.108'
    user = 'root'
    password = 'suxxxx'
    child = connect(user,host,password)
    send_command(child, 'cat /etc/passwd |grep root')
if __name__ == '__main__':
    main()

main()

0

Related Posts

Comments

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据