前言日常运维中有一个很真实的场景公司新上了20台Web服务器需要逐台做环境初始化——改hostname、关防火墙、装Docker、配NTP时间同步。如果手动一台一台敲命令半天就过去了敲到后面手酸眼酸还容易出错。Xshell除了当终端用其实内置了一套完整的脚本引擎支持VBScript、JavaScript和Python三种语言。配合「快速命令集」和「撰写栏」可以把重复性运维工作压缩到一键执行。这篇文章不讲Xshell怎么安装和新建会话专注聊三个自动化的玩法多服务器一键批量执行命令用快速命令集把高频操作做成按钮写一个完整的无人值守环境初始化脚本一、多服务器一键批量执行命令1.1 准备环境先把你要操作的所有服务器连接在Xshell里打开建议放在同一个文件夹下用会话管理器统一管理。打开撰写栏查看 → 撰写栏Xshell底部会出现一个输入条。1.2 一次性查看所有服务器的磁盘状态在撰写栏输入以下命令然后点右侧图标 → 选择「发送到全部会话」echo$(hostname)df-h|grep-vtmpfs所有连接着的服务器会同时执行这条命令输出结果一目了然 web-01 /dev/sda1 50G 18G 30G 38% / web-02 /dev/sda1 50G 12G 36G 26% / ...要知道这个操作如果手动做20台服务器你最少要切20次标签页、敲20次命令。1.3 注意事项避免危险命令rm -rf、shutdown、reboot这类命令不要发给所有会话先确认连接的是哪些机器确认输出不同机器命令输出可能不同如果某台报错了不要直接忽略先在一台上验证复杂命令先在单个会话上试一下确认没问题再群发二、用快速命令集把常用操作做成按钮有些命令你每天敲几十遍可以做成按钮放在侧边栏点一下就行。2.1 创建快速命令集查看 → 快速命令右侧会出现快速命令面板。点击「新建」→ 选择「添加命令」在弹窗中填写标签查看Nginx日志命令tail -f /var/log/nginx/error.log点确定后右侧面板会出现一个「查看Nginx日志」按钮。点一下就相当于在这台机器上执行了tail -f。2.2 绑定快捷键在快速命令属性中可以为每个命令绑定快捷键CtrlShift1 → 查看Nginx日志CtrlShift2 → 重启Nginxsystemctl restart nginxCtrlShift3 → 查看CPU负载top -bn1 | head -5这几个快捷键肌肉记忆之后运维效率提升非常明显。三、手写一个Xshell自动化脚本VBScript前面的批量执行和快速命令适合简单操作遇到需要判断、循环、等待结果的高级场景就需要写脚本了。Xshell支持三种脚本语言我习惯用VBScript不需要额外装运行环境。3.1 脚本基础结构新建一个.vbs文件基本骨架如下Sub Main 1.打开一个会话 xsh.Session.Open C:\...\Sessions\web-01.xsh 2.等待连接建立 xsh.Session.Sleep 2000 3.发送命令 xsh.Screen.Send hostname xsh.Screen.Send VbCr 4.等待命令执行完成等提示符出现 xsh.Screen.WaitForString $ 5.获取输出 Dim n n xsh.Screen.CurrentRow Dim output output xsh.Screen.Get(0, 1, n, 40) xsh.Dialog.MsgBox 输出结果 vbCrLf output End Sub关键点xsh.Screen.Send VbCr相当于按下回车键xsh.Screen.WaitForString $ 等待命令提示符$出现确保上一条命令执行完了再执行下一条不要用Sleep代替WaitForString——Sleep 是固定等待万一上条命令执行超过了你等的时间后续命令就会出错3.2 多台服务器循环操作下面是遍历多个会话执行相同操作的脚本Sub Main Dim sessions(3) sessions(0) C:\Users\admin\Documents\NetSarang\Xshell\Sessions\web-01.xsh sessions(1) C:\Users\admin\Documents\NetSarang\Xshell\Sessions\web-02.xsh sessions(2) C:\Users\admin\Documents\NetSarang\Xshell\Sessions\web-03.xsh Dim i For i 0 To UBound(sessions) 打开会话 xsh.Session.Open sessions(i) xsh.Session.Sleep 3000 发送检查命令 xsh.Screen.Send echo Checking sessions(i) xsh.Screen.Send VbCr xsh.Screen.WaitForString $ xsh.Screen.Send uptime xsh.Screen.Send VbCr xsh.Screen.WaitForString $ xsh.Screen.Send df -h / xsh.Screen.Send VbCr xsh.Screen.WaitForString $ 关闭会话 xsh.Session.Close xsh.Session.Sleep 1000 Next xsh.Dialog.MsgBox 所有服务器检查完毕 End Sub3.3 运行脚本在Xshell中工具 → 脚本 → 运行选择你写的.vbs文件即可执行。也可以把它加到快速命令集中快速命令 → 新建 → 添加命令 → 类型选「运行脚本」→ 选择脚本文件。四、实战20台服务器的环境初始化脚本下面是一个生产环境可用的完整脚本用于新服务器的初始化。包含以下步骤关闭SELinux和防火墙安装常用工具包配置NTP时间同步安装Docker写一份操作日志Sub Main Dim sessions, i, logFile logFile C:\ops_logs\init_ Year(Now) Month(Now) Day(Now) .txt 初始化日志文件 LogToFile logFile, 服务器初始化开始 Now vbCrLf 会话列表 sessions Array( _ C:\Users\admin\Documents\NetSarang\Xshell\Sessions\web-01.xsh, _ C:\Users\admin\Documents\NetSarang\Xshell\Sessions\web-02.xsh, _ C:\Users\admin\Documents\NetSarang\Xshell\Sessions\web-03.xsh _ ) For i 0 To UBound(sessions) LogToFile logFile, 开始处理: sessions(i) 连接 xsh.Session.Open sessions(i) If Not WaitForConnection(10000) Then LogToFile logFile, !!!连接失败: sessions(i) xsh.Session.Close Continue End If 1.关闭防火墙 ExecuteCommand systemctl stop firewalld systemctl disable firewalld, logFile 2.关闭SELinux ExecuteCommand sed -i s/SELINUXenforcing/SELINUXdisabled/ /etc/selinux/config, logFile 3.安装基础包 ExecuteCommand yum install -y vim wget net-tools telnet lrzsz, logFile 4.配置NTP ExecuteCommand yum install -y chrony systemctl start chronyd systemctl enable chronyd, logFile 5.安装Docker ExecuteCommand curl -fsSL https://get.docker.com | bash, logFile ExecuteCommand systemctl start docker systemctl enable docker, logFile 6.验证 ExecuteCommand docker --version, logFile LogToFile logFile, sessions(i) 处理完成 vbCrLf xsh.Session.Close xsh.Session.Sleep 1000 Next LogToFile logFile, 全部服务器初始化完成 Now xsh.Dialog.MsgBox 全部服务器初始化完成日志文件 logFile End Sub 等待连接建立 Function WaitForConnection(timeout) Dim elapsed elapsed 0 Do While elapsed timeout If xsh.Session.Connected Then WaitForConnection True Exit Function End If xsh.Session.Sleep 500 elapsed elapsed 500 Loop WaitForConnection False End Function 发送命令并等待执行完毕 Sub ExecuteCommand(cmd, logFile) xsh.Screen.Send cmd xsh.Screen.Send VbCr xsh.Screen.WaitForString $ Dim row row xsh.Screen.CurrentRow Dim output output xsh.Screen.Get(row - 3, 0, row, 200) LogToFile logFile, [CMD] cmd vbCrLf output End Sub 写日志文件 Sub LogToFile(filePath, content) Dim fso, file Set fso CreateObject(Scripting.FileSystemObject) Set file fso.OpenTextFile(filePath, 8, True) file.WriteLine content file.Close End Sub执行这个脚本后C:\ops_logs\目录下会生成带日期的日志文件记录每台服务器上每条命令的执行输出方便回溯和审计。五、一个易踩的坑用WaitForString等提示符的时候要注意不同服务器的提示符可能不一样CentOS/RHEL默认是$或#Ubuntu可能末尾是$有些定制过的服务器提示符可能是、#或者自定义字符串如果WaitForString始终等不到预期的字符串脚本会卡死。建议用正则匹配例如 匹配 # 或 $ 结尾的提示符 xsh.Screen.WaitForString [#$] , True True表示启用正则总结Xshell的脚本引擎虽然界面朴素但功能非常扎实。三个层次递进使用批量执行 → 搞简单重复操作快速命令集 → 把高频命令固化成按钮快捷键手写脚本 → 复杂流程无人值守这三层熟练之后管50台服务器和管5台服务器的体力消耗是一样的——区别只在于你会不会写脚本。下载Xshell免费版xshell.ijinshan.com