python實現命令行交互

背景:

最近由於工做需求在寫自動化測試腳本,主要目的是測試代碼功能的完整性,然而在使用SSHLibrary庫進行遠程SSH交互的時候老是出現問題,好比說遇到須要輸入密碼的交互,老是不能成功,還有遇到一直保持運行並實時輸出的命令,也沒法讀取其中的輸出。因此就只能使用python實現腳本進行交互,和SSH解耦合。
使用的庫subprocess和argparse;

代碼1:因爲命令行執行以後,進程一直在運行,不停的出塊,因此我將出塊的內容寫入到文件中。python

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:實現輸入密碼的功能shell

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)

臨時解救用的腳本,有幾個問題ubuntu

  • 在使用popen.stdout.read()讀取不出來內容,只能使用popen.stdout.readline()
  • 在使用stdout.read()stdin.write() communicate()不能同時使用,緣由多是須要用stdout.readline(),不過我沒有嘗試。
相關文章
相關標籤/搜索