expect工具,expect脚本,实现全自动免交互登录ssh,shell脚本和expect结合使用,在多台服务器上创建1个用户【linux】

📅 2026/6/15 20:18:15
expect工具,expect脚本,实现全自动免交互登录ssh,shell脚本和expect结合使用,在多台服务器上创建1个用户【linux】
#!/usr/bin/expect是专门处理交互的脚本解释器适合自动响应 SSH、FTP 等需要手动输入的命令#安装工具 sudo dnf install expect -y通常用于自动化 SSH 登录、安装脚本、密码输入等需要用户交互的任务。expect 脚本一般包含以下几个基本元素spawn用于启动需要自动化的命令或程序。expect定义程序期望看到的输出expect 会等待输出内容符合条件时再进行下一步。send向程序发送字符串如输入命令或确认。interact允许用户和脚本的交互通常在脚本末尾使用以保持会话打开。来看一个ssh自动登录脚本先把之前的免密登录文件删除rm -rf ~/.ssh/*#!/bin/expect #设置变量 set timeout 10 set name root set password 123456 #启动命令 spawn ssh root192.168.88.102 #匹配期望的输出 expect{ yes/no{ send yes\r exp_continue } password:{ send $password\r } } #保持会话交互 interactset timeout 10设置超时时间为 10 秒如果 10 秒内没匹配到password:提示脚本会自动退出避免卡住。set password 123456把服务器密码存到变量里后面自动发送。spawn是expect的核心命令用来启动一个交互进程这里就是启动ssh登录服务器expect { password: { ... } }等待 SSH 输出包含password:的提示。exp_continue是expect脚本里的内置命令作用是当前分支匹配完成后继续监听下一个 expect 分支而不是直接退出 expect 块。send $password\r匹配到提示后自动发送变量里的密码\r模拟按下回车键。interact这行是关键它会把登录后的控制权交还给你让你能正常操作服务器。如果没有这行脚本登录成功后会直接退出全自动免交互 SSH 登录脚本2上一个是“固定服务器专用版”这个是 “通用参数版”。参数版适合需要频繁切换服务器、批量登录的场景。#!/bin/expect set timeout 10 #0代表第一个参数 set name [ lindex $argv 0 ] set ip [ lindex $argv1 ] set password [ lindex $argv 2 ] #开始执行命令 spawn ssh $name$ip #开始匹配要交互的行的关键字 expect{ yes/no{ send yes\r exp_continue } password:{ sent $password\r } } #保持交互状态 interact命令行参数的索引从 0 开始$argv 0是脚本的第 1 个参数$argv 1是第 2 个以此类推。传参的时候的格式是./ssh_login.exp 用户名 服务器IP 密码ssh_login.exp你自己保存的名字密码需要用双引号包起来shell脚本和expect结合使用在多台服务器上创建1个用户以#!/bin/bash开头expect的交互脚本必须写在-EOF和EOF这两个标记之间。-EOF表示 “接下来的内容直到遇到EOF标记为止都作为expect命令的输入”。结尾的EOF是结束标记告诉 Shell 「Here Document」的内容到这里结束。中间的所有代码都会被直接传给expect去执行实现自动化交互。完整场景解析多服务器批量创建用户这是一个典型的bash expect组合脚本用来在多台服务器上批量创建用户逻辑是bash 部分读取data.txt里的服务器信息IP、用户名、密码。循环每一行解析出ip、name、pwd1变量。expect 部分放在-EOF和EOF之间用spawn ssh $name$ip发起 SSH 连接。自动处理交互比如yes/no主机确认、密码输入。在远程服务器上执行useradd yh1命令创建用户。# 注意:bash中定义的变量在expect中可以使用但是expect定义的变量bash不能用1在管理机上写一个服务器列表文件vim data.txt给脚本用的「服务器清单」里面写的是要管理的所有服务器的信息192.168.10.10 root 123456 192.168.10.11 root 123456 192.168.10.12 root 123456这个文件不用写在脚本里是因为服务器信息可能会变比如新增 / 下线服务器、改了密码直接改文件比改脚本方便太多。脚本是通用的换一批服务器只要换个data.txt就行不用改代码。