VBS脚本自动化-利用Windows远程连接Linux虚拟机并批量修改某配置文件信息

需求

需要对云空间的一批Linux虚拟机的配置文件A进行配置信息修改,同时有一行配置信息要求根据IP信息改变而改变

前提条件

windows系统已安装openSSH,详情参照微软官方教程

安装 OpenSSH | Microsoft Learn

代码

直接上代码,由于第一次写VBS,基本都打好注释了,方便查阅

rem 调用控制台程序
Dim WshShell 
Set WshShell=WScript.CreateObject("WScript.Shell") 
WshShell.Run "cmd.exe"
WScript.Sleep 500 

rem 读取用户配置等信息
Set fsUser = CreateObject("scripting.filesystemobject")
Set tsUser = fsUser.OpenTextFile("userInfo.txt",1,true)
Dim info(3)
For i = 0 To 3
	info(i) = tsUser.ReadLine
Next
tsUser.close

rem 读取ip地址文件的总行数
Set fsIP = CreateObject("scripting.filesystemobject")
Set tsIP = fsIP.OpenTextFile("ip.txt",1,true)
lineEnd=tsIP.readall
lineCount = tsIP.line
'MsgBox "总行数:  "&info(0)
tsIP.close

rem 读取ip写入到配置信息中并输入到虚拟机中
'VBS不能直接定义数组长度为变量,只能通过先定义一个动态数组再重新定义
Dim ipArr()
Redim ipArr(lineCount-1)
Set tsIP = fsIP.OpenTextFile("ip.txt",1,true)
For i=0 To lineCount-1 Step 1
    rem 连接Linux并输入密码
    ipArr(i)=tsIP.ReadLine
    WScript.Sleep 500
    WshShell.SendKeys "ssh "&info(0)+"@"&ipArr(i)
    WshShell.SendKeys "{ENTER}"
    WScript.Sleep 500 
    WshShell.SendKeys "yes"
    WshShell.SendKeys "{ENTER}"
    WScript.Sleep 500
    WshShell.SendKeys info(1)
    WshShell.SendKeys "{ENTER}"
    WScript.Sleep 500

    rem 读取配置文件并复写ip
    Set fsConfig = CreateObject("scripting.filesystemobject")
    'Do Until...Loop是循环结构的一种
    'Do Until tsIP.AtEndOfStream	
    ' 调用AddLine过程混合不改动的config配置与改动的IP信息到临时文件
    ' PS,在VBS中,sub是子程序,function是函数,统称为过程
    'MsgBox "IPADDR="&ipArr(i)
    Call AddLine("config.txt",5,"IPADDR="&ipArr(i))
    'Loop
    Set tsConfig = fsConfig.OpenTextFile("tempConfig.txt",1,true)
    contents = tsConfig.readall

    rem 进入到待改写的目录,覆盖数据
    ' 调用ConfigFile过程输入配置信息到指定文件
    Call ConfigFile(info(2),info(3),contents)
    WshShell.SendKeys "systemctl restart network"
    WshShell.SendKeys "{ENTER}"

    rem 退出
    WScript.Sleep 3000 
    WshShell.SendKeys "exit"
    WshShell.SendKeys "{ENTER}"   
    WScript.Sleep 1000
    
Next
tsIP.close



'strPath: 被插入的文件
'intLine: 在第几行后插入数据
'strInput: 插入的数据内容
Function AddLine(strPath,intLine,strInput)
    Dim fso
    Set fso = CreateObject("Scripting.FileSystemObject")
    '以只读的方式打开文件
    Set ReadFile = fso.OpenTextFile(strPath,1,true)
	'以只写的方式打开文件
	Set WriteFile = fso.OpenTextFile("tempConfig.txt",2,true)
    '如果当前的指针不在整个文档的末尾,读取文本的整行内容
    Do Until ReadFile.AtEndOfStream
		WriteFile.WriteLine ReadFile.ReadLine
        intLine = intLine - 1
        '判断光标是否已达到指定行,达到则退出函数        
        If intLine = 0 Then
		   WriteFile.WriteLine strInput
        End If
    Loop
	ReadFile.Close 
	WriteFile.Close 
	Set fso = Nothing 
End Function

'strPath: 被配置文件的路径
'fileName: 被配置文件名
'contents: 需要配置的信息
Function ConfigFile(strPath,fileName,contents)
    WScript.Sleep 500 
    WshShell.SendKeys "cd "&strPath
    WshShell.SendKeys "{ENTER}"
    WshShell.SendKeys "> "&fileName
    WshShell.SendKeys "{ENTER}"
    WScript.Sleep 500 
    WshShell.SendKeys "vi "&fileName
    WshShell.SendKeys "{ENTER}"
    WScript.Sleep 500 
    WshShell.SendKeys "i"
    WshShell.SendKeys contents
    WshShell.SendKeys "{ESC}"
    WScript.Sleep 500
    WshShell.SendKeys ":wq"
    WshShell.SendKeys "{ENTER}"
    WScript.Sleep 500
End Function

执行

  1. 复制代码下来保存为.vbs
  2. 因为代码中用的是相对路径,在vbs同级文件夹新建userInfo.txt,ip.txt,config.txt,下面是举例,请根据自己的情况配置
  3. 双击.vbs运行就会调用控制台执行

注意:vbs脚本会占用Windows输入设备,请等程序运行完毕再进行其他操作

 

参考资料

VS调试Visual Basic Script

如何用Visual Studio调试 VBS、JScript等脚本_穿女装的程序员的博客-CSDN博客

vbs没有方法可以直接在配置文件config.txt中插入IP信息,采取了折中的方法,同时参考了以下的函数

vbs 读取txt是读取特定的行

VBS 如何向Txt文档中指定行插入内容_weixin_33834628的博客-CSDN博客

vbs如何定义动态数组下标为变量Microsoft VBScript 编译器错误 (0x800A0402) 缺少整型常数的解决办法-网有卖

vbs字符串拼接

VB字符串拼接_陌苏湮雪的博客-CSDN博客

VBS过程解释

VBS基础篇 - VBScript过程(使用sub 与 Function定义函数)_vbs_脚本之家

VBS循环结构

VBS基础篇 - 循环(for、Do、While)_vbs_脚本之家

猜你喜欢

转载自blog.csdn.net/qq_33562122/article/details/129839624