博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python实现命令行交互
阅读量:5912 次
发布时间:2019-06-19

本文共 2218 字,大约阅读时间需要 7 分钟。

背景:

最近因为工作需求在写自动化测试脚本,主要目的是测试代码功能的完整性,然而在使用SSHLibrary库进行远程SSH交互的时候总是出现问题,比如说遇到需要输入密码的交互,总是不能成功,还有遇到一直保持运行并实时输出的命令,也无法读取其中的输出。所以就只能使用python实现脚本进行交互,和SSH解耦合。使用的库subprocess和argparse;

代码1:由于命令行执行之后,进程一直在运行,不停的出块,所以我将出块的内容写入到文件中。

import subprocessimport sysimport argparseclass TimeoutError(Exception):    pass def excuteCmd(cmd):        popen = subprocess.Popen(cmd,stderr=subprocess.PIPE, stdout=subprocess.PIPE, shell = True)         while True:            buff = popen.stdout.readline()            fh = open("/home/ubuntu/bottos/bottos.txt", 'a+')            fh.write(buff)            sys.stdout.write(buff)            if buff == '' and popen.poll() != None:                break    if __name__ == '__main__':        ''' self test '''         parser = argparse.ArgumentParser(description='manual to this script')        parser.add_argument('--delegate', type=str,default=None)        args = parser.parse_args()        try:             bottos = "/home/ubuntu/bottos/bottos "            cmd = bottos + "--delegate " + args.delegate + " --enable-wallet"            ret = excuteCmd(cmd)            print ret         except TimeoutError, e:             print repr(e)

代码2:实现输入密码的功能

import subprocessimport argparseclass TimeoutError(Exception):    pass def excuteCmd(cmd, passwd, timeout = 1):        s = subprocess.Popen(cmd,stdin=subprocess.PIPE, stdout=subprocess.PIPE, shell = True)         s.stdin.write(passwd+'\n')        out, err = s.communicate()        if err is not None:            return err            return out    if __name__ == '__main__':        ''' self test '''         parser = argparse.ArgumentParser(description='manual to this script')        parser.add_argument('--name', type=str,default=None)        parser.add_argument('--passwd', type=str,default=None)        args = parser.parse_args()        try:             unlock = "/home/ubuntu/bottos/bcli wallet unlock "            cmd = unlock + "--account " + args.name            ret = excuteCmd(cmd,args.passwd,5)            print ret         except TimeoutError, e:             print repr(e)

临时解救用的脚本,有几个问题

  • 在使用popen.stdout.read()读取不出来内容,只能使用popen.stdout.readline()
  • 在使用stdout.read()stdin.write() communicate()不能同时使用,原因可能是需要用stdout.readline(),不过我没有尝试。

转载地址:http://lvmpx.baihongyu.com/

你可能感兴趣的文章
JavaScript里的数组转化新方法Array.From
查看>>
修改eclipse下maven项目的java文件编译目录路径
查看>>
直接启动tomcat时为tomcat指定JDK 而不是读取环境变量中的配置
查看>>
ubuntu 安装 chef安装
查看>>
需求整理步骤规范
查看>>
《JAVA面向对象的特征 》
查看>>
mongodb基础(1)
查看>>
httpd
查看>>
php 笔试题汇总
查看>>
能冒泡的事件
查看>>
easyui-tree 修改图标
查看>>
变频电源老化测试重要吗?需要做老化测试吗
查看>>
Linux下Nginx源码安装
查看>>
一文带你快速了解,python是如何解析XML文件
查看>>
如何用30分钟快速优化家中Wi-Fi?阿里工程师有绝招
查看>>
云越发展,锁定问题就会越严重?
查看>>
什么样人适合学平面设计?零门槛入门工具收藏
查看>>
用户访问网页的流程原理
查看>>
FastDfs 文件系统迁移
查看>>
Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again
查看>>