命令行交互性三个级别及其自动化解决方案
创始人
2024-02-17 09:31:56
0

目录

级别一

级别二

级别三

尽量减少交互难度


级别一

固定的一个或者几个prompt。对策:定义prompt,执行命令后等待prompt的出现。可以使用正则表达式来匹配prompt。比如用于匹配linux prompt的正则表达式可以是#|\\$或者(@.*#)|(@.*\\$)。

级别二

以固定的方式进行交互。比如执行命令后,出现“password:”时,输入密码,出现“y/n”时,输入y表示同意继续。

对策:1、按顺序wait指定的内容,可以是正则匹配,然后输入相应内容。2、扩展描述prompt的正则表达式,包含所有可能出现的标志性提示,按顺序输入相应内容。

例如:

测试需求:

SSL VPN tunnel测试时,需要在互联网终端上运行SSL VPN的客户端工具来建立隧道,然后在这个互联网终端上ping ssl vpn站点内部的vm。

交互需求:

SSH登录互联网终端,sudo su之后运行SSL VPN的客户端,sudo su之后,出现password for user:时要输入密码。

运行SSL VPN的客户端后,当输出中出现“Password for VPN:”时要,输入vpn密码,当输出中出现“(Y/N)”时,输入“y”,当输出中出现“STATUS::Tunnel running”,说明隧道建立完成,可以进行后续操作了。因为这个程序在前台一直运行着,所以不会出现prompt。

解决办法(使用robot示意代码):

这里提前封装了关键字Send Command,用于在ssh连接上执行一条命令,参数regexp指明该关键字中read until regexp中等待的模式。

方式一:wait指定的内容

set_client_configuration       prompt=REGEXP:#|\\$

Send Command     sudo su    regexp=password\\sfor\\suser:

Send Command     ${internet_client_password}​​    

Send Command     /home/sslvpnclient --server ${​​f1}​​​​​​​​​[floating_ip_address]:${​​​​​​​​​service_port}​​​​​​​​​ --vpnuser ${​​​​​​​​​sslvpn_username} --keepalive ​​​​​​​​​    regexp=Password\\sfor\\sVPN:

Send Command     ${​​​​​​​​​sslvpn_password}​​​​​​​​​     regexp=\\(Y/N\\)

Send Command     y      regexp=STATUS::Tunnel\\srunning

方式二:扩展描述prompt的正则表达式

set_client_configuration       prompt=REGEXP:#|\\$|(Password\\sfor\\sVPN:)|\\(Y/N\\)|(STATUS::Tunnel\\srunning)|(password\\sfor\\suser:

Send Command     sudo su

Send Command     ${internet_client_password}​​​​​​​​​

Send Command

    ...    /home/sslvpnclient --server ${​​​​​​​​​f1}​​​​​​​​​[floating_ip_address]:${​​​​​​​​​service_port}​​​​​​​​​ --vpnuser ${​​​​​​​​​sslvpn_username} --keepalive

​​Send Command     ${​​​​​​​​​sslvpn_password}​​​​​​​​​

Send Command     y

    

级别三

不确定下一步将会要求输入什么,比如,可能要求输入密码,也可能要求输入y进行确定。这个时候需要根据提示来决定输入的内容。

例如ssh登录到一台设备后,在这台设备上再通过ssh命令登录另一台设备,客户端没有key或者服务端的key更新后,登陆时会提示“yes/no?”,否者只会提示输入密码“password:”。

TCL的expect包非常擅长处理这种场景,支持匹配列表和内置循环匹配功能。

现在来说一下python的解决方案。

Python有pexpect包,它支持用于匹配的列表,但是没有内置的循环匹配功能,所以需要自己写循环。

可以不使用pexpect,我们只需要将可能的提示都扩展到描述prompt的正则表达式中。循环中写几个if分支,通过当前的特征性提示内容,决定下一步操作。代码如下:

这里提前封装了一个函数send_command,用于在ssh连接上执行一条命令。s: SSHLibrary instance。log是logging.getLogger()返回的logger。在这里,这两个参数不是重点,大家可以忽略它们。

def ssh_connect (s, log, host, port, username, password):#扩展prompt的正则表达式s.set_client_configuration(prompt="REGEXP:#|\\$|password:|\\(yes/no.*\\?")output = send_command(s,log,f'ssh -p {port} {username}@{host}')while True:if 'password:' in output:output = send_command(s,log,password)breakelif 'yes/no' in output:output = send_command(s,log,'yes')#恢复prompt的正则表达式s.set_client_configuration(prompt="REGEXP:#|\\$")

尽量减少交互难度

为了避免麻烦,应该尽量减少困难交互场景的出现。如果执行命令时加上某个参数就可以不用额外交互,那就带上这个参数。比如执行命令时同时就输入密码,执行命令时要求不进行某种确认。比如ssh命令使用选项-o StrictHostKeyChecking=no就可以避免出现提示“continue connecting (yes/no/[fingerprint])?”。比如ssh登录时如果没有条件输入密码,则可以配置使用免密登录方式。

相关内容

热门资讯

央行发布一次性信用修复政策 新京报讯 12月22日,中国人民银行发布关于实施一次性信用修复政策有关安排的通知。 中国人民银行上海...
爱看头评 | “体重立法”引热... 经浙江省人大常委会批准,《杭州市全民健康促进条例》(以下简称“《条例》”)将于明年1月1日起正式施行...
美日央行政策分化 国内方面,11月经济数据呈现“生产端稳中修复、需求端分化加剧”格局。工业生产方面,规模以上工业增加值...
一次性信用修复政策来了 央视新闻 今天(22日),中国人民银行发布通知,实施一次性信用修复政策,支持信用受损但积极还款的个人...
陕西:公检法联合集中打击拒执犯... 本报讯 (记者 刘辉 通讯员 赵玲)“依法打击拒不执行判决、裁定犯罪,是解决执行难问题的一项有力措施...
卓然股份被证监会立案调查,律师... 雷达财经雷助吧出品 文|周慧 编|深海 12月19日,卓然股份发布了《关于公司及实际控制人收到立案告...
公牛集团回应宣传语争议:起诉家... 日前,公牛集团就“10户中国家庭,7户用公牛”宣传语引发的争议作出回应。近日,广东中山市家的电器有限...
一次性信用修复政策来了!细则详... 今天(22日),中国人民银行发布通知,实施一次性信用修复政策,支持信用受损但积极还款的个人高效便捷重...
《中国人民银行关于实施一次性信... 1.符合哪些条件的逾期信息可以适用一次性信用修复政策,作不予展示处理? 一次性信用修复政策主要有四个...