python 交互式命令行_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(),不过我没有尝试。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值