需求
需要对云空间的一批Linux虚拟机的配置文件A进行配置信息修改,同时有一行配置信息要求根据IP信息改变而改变
前提条件
windows系统已安装openSSH,详情参照微软官方教程
代码
直接上代码,由于第一次写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
执行
- 复制代码下来保存为.vbs
- 因为代码中用的是相对路径,在vbs同级文件夹新建userInfo.txt,ip.txt,config.txt,下面是举例,请根据自己的情况配置
- 双击.vbs运行就会调用控制台执行
注意:vbs脚本会占用Windows输入设备,请等程序运行完毕再进行其他操作
参考资料
VS调试Visual Basic Script
如何用Visual Studio调试 VBS、JScript等脚本_穿女装的程序员的博客-CSDN博客
vbs没有方法可以直接在配置文件config.txt中插入IP信息,采取了折中的方法,同时参考了以下的函数
VBS 如何向Txt文档中指定行插入内容_weixin_33834628的博客-CSDN博客
vbs如何定义动态数组下标为变量Microsoft VBScript 编译器错误 (0x800A0402) 缺少整型常数的解决办法-网有卖
vbs字符串拼接
VBS过程解释
VBS基础篇 - VBScript过程(使用sub 与 Function定义函数)_vbs_脚本之家
VBS循环结构