python实现命令行交互

发布时间:2019-06-07 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了python实现命令行交互脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

背景:

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

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

import subprocess
import Sys
import argparse

class 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 subprocess
import argparse

class 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()不过我没有尝试。

脚本宝典总结

以上是脚本宝典为你收集整理的python实现命令行交互全部内容,希望文章能够帮你解决python实现命令行交互所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。