• 弃坑pexpect,入坑paramiko


    弃坑pexpect,入坑paramiko

     

    上文书说到,ssh库pexpect的使用,简直就是个“月亮公主”——满眼全是坑。勉强把程序写好了,跑起来的时候发现了一个新坑,让我不可抗拒的把它弃掉了——经常莫名其妙的连不上服务器!开线程连接14台服务器,总有1到3台连不上,还查不到原因。这还了得!一怒之下把写好的pexpect封装库删掉了,用paramiko重新写起。其实这个库也是有一些坑的,这个放在后面说。先介绍一下这个库的用法。

    安装方法:没有什么新鲜的

    pip install paramiko

    或者下载源码编译。需要事先安装一下PyCrypto库,同样可以pip安装。

    使用方法:

    import paramiko

    之后,首先可以先建立一个全局的log(非必需)

    paramiko.util.log_to_file('paramiko.log')

    创建一个实例

    s = paramiko.SSHClient()

    设置一个balabala(好吧我解释不清这是什么,密钥之类的东西)

    s.set_missing_host_key_policy(paramiko.AutoAddPolicy())

    然后连接

    s.connect(hostname=hostname, username=username, password=password)

    注意连接方法并没有返回值。

    接下来发送一条命令

    stdin, stdout, stderr = s.exec_command('ls -l')

    paramiko所使用的shell是bash,即使在Ubuntu里面也没有ll这个命令,只能用ls -l。

    然后这里就有趣了。这里返回了三个流:stdin(标准输入)、stdout(标准输出)和strerr(标准错误),流是不可以直接读的,得像打开一个文件那样读取,用read()或readlines()。并且,这两个函数都是一次性的,也就是说,read()一次,再次read()时候结果为None,因此,需要有缓存来接住这个流:

    sin, sout, serr = stdin.readlines(), stdout.readlines(), stderr.readlines()

    read和readline的区别跟读文件一样,read是把所有值读进一个字符串,自己处理;readlines是得到一个列表,按行分隔,可直接for i in out.readlines()也可以自己处理列表内容。

    一般的情况,发送命令的返回结果都在out中,有这么几种特殊情况:

    1、执行错误。这时候out是一个空列表,而错误写在了err中。

    2、执行正确,但是本来命令就没有什么返回值。这时候out和err都为空。

    3、执行正确,但是由于某些特殊坑命令,返回值是在err中给出,out为空。

    初次发现这个问题的时候我整个人是懵逼的,大概是这么个表情:

    卧槽这特么要怎么判断执行结果?后来想了些办法,迂回来看了。比如wget就是这样。解决方案是在命令结束后再发送一个ls命令,查看一下现在文件是否存在。

    4、sudo命令。这特么就是个万年大坑,不管是pexpect还是paramiko,我都栽在sudo上面好久。血泪史我就不说了,直接说解决方法吧:

    首先,sudo后面要加一个-S选项,表示从标准输入接收密码。标准输入?咋么听起来那么耳熟?没错,就是stdin,发送完命令之后要再发个密码;然后,命令的最后要加上’ ’作为命令的结束,如果没有加,那么恭喜你,服务器以为你没有结束命令,还在等待,而你不知道服务器的状态,在等待它给你反馈。于是

    “我的心,在等待,永远在等待哎哎~~”
    “你知不知道,你知不知道,我等到花儿也谢了嗷嗷~~”
    “等下一个天亮,去上次牵手赏花那里散步好吗~”
    。。。。。。

    咳咳,回来。总的来说sudo就是这样的:

    stdin, stdout, stderr = s.exec_command(‘sudo -S %s
    ’ % cmd)
    stdin.write(‘%s
    ’ % password)
    stdin.flush()
    out = stdout.readlines()

    这样就可以了。

    最后的最后,别忘了退出

    s.close()

    我使用的就是这么多了。其他的有send和recv函数,可以跟pexpect一样发送命令,接收命令;有RSA等加密方法;还有很多方便的函数。平胸而论,不对,平心而论,这个库应该是蛮不错的,可以做一个交互式的ssh shell,而且据说windows下也可以用,比pexpect不知道高到哪里去了。只是我时间太仓促,晚上加班几个小时内学一个新库,又把200多行代码完全推倒重写,任谁都会有点怨言是吧。以后如果需要的话(学乖了,不说有时间的话)还可以继续深入研究一下。

    这次就先到这里了。

  • 相关阅读:
    典型并发任务
    第九章使用共享变量实现并发
    第八章goroutine和通道
    第七章接口
    第六章方法
    第一章
    第四章复合数据类型
    第三章基础数据类型
    Django其他
    VUE学习日记(五) ---- 组件定义 component
  • 原文地址:https://www.cnblogs.com/chenxiaoyong/p/6271016.html
Copyright © 2020-2023  润新知