当前位置: 首页 > news >正文

告别手动输入密码!用Linux Expect脚本批量管理服务器,5分钟搞定SSH免密登录

告别手动输入密码用Linux Expect脚本批量管理服务器5分钟搞定SSH免密登录每次面对几十台新服务器需要配置SSH免密登录时手动逐台输入密码就像在键盘上跑马拉松。我曾亲眼目睹同事因为输错一个字符不得不重头开始整个流程的绝望表情。这种重复劳动不仅消耗时间更消磨工程师的创造力。Expect脚本正是为解放双手而生。它能模拟人类交互行为自动处理密码输入、首次连接确认等繁琐步骤。结合Shell循环我们可以在5分钟内完成过去需要数小时的工作。更重要的是这套方案具备生产级可靠性——错误重试机制、超时控制、日志记录一应俱全。1. 环境准备与基础配置1.1 安装Expect工具链主流Linux发行版通常只需一条命令即可完成安装。对于基于RPM的系统sudo yum install -y expect tclDebian/Ubuntu用户则使用sudo apt-get update sudo apt-get install -y expect验证安装是否成功which expect expect -v1.2 服务器清单规范化管理创建server_list.txt文件管理目标服务器信息建议采用以下格式192.168.1.101 root Pssw0rd1 192.168.1.102 admin Secure#123 10.0.0.15 ubuntu Ubuntu!2023各字段含义IP地址服务器网络标识用户名SSH登录账号密码对应账号的认证凭证安全提示务必设置该文件权限为600避免密码泄露chmod 600 server_list.txt2. 核心脚本开发2.1 基础版免密登录脚本创建auto_ssh_copy_id.exp文件#!/usr/bin/expect set ip [lindex $argv 0] set user [lindex $argv 1] set password [lindex $argv 2] set timeout 15 spawn ssh-copy-id $user$ip expect { # 处理首次连接确认 yes/no { send yes\r exp_continue } # 匹配密码提示 password: { send $password\r } # 处理已存在密钥的情况 already exist { send_user Key already exists on $ip\n exit 0 } timeout { send_user Connection to $ip timed out\n exit 1 } } expect { Now try logging into the machine { send_user Successfully configured $ip\n } eof }2.2 增强版批量处理脚本创建batch_ssh_setup.sh作为主控脚本#!/bin/bash LOG_FILEssh_setup_$(date %Y%m%d).log SERVER_LISTserver_list.txt { echo Batch SSH Setup Started at $(date) total$(wc -l $SERVER_LIST) success0 fail0 while read -r line || [[ -n $line ]]; do ip$(echo $line | awk {print $1}) user$(echo $line | awk {print $2}) password$(echo $line | awk {print $3}) echo Processing $ip... if ./auto_ssh_copy_id.exp $ip $user $password; then echo $ip: Configuration successful | tee -a $LOG_FILE ((success)) else echo $ip: Configuration failed | tee -a $LOG_FILE ((fail)) fi done $SERVER_LIST echo Summary echo Total servers: $total echo Success: $success echo Failed: $fail echo Detailed log saved to $LOG_FILE } | tee -a $LOG_FILE3. 生产环境增强策略3.1 多因素错误处理机制完善后的Expect脚本应包含以下容错措施#!/usr/bin/expect set max_retry 3 set retry_count 0 set ip [lindex $argv 0] set user [lindex $argv 1] set password [lindex $argv 2] set timeout 20 proc attempt_connection {} { global ip user password retry_count max_retry spawn ssh-copy-id $user$ip expect { yes/no { send yes\r exp_continue } password: { send $password\r exp_continue } Now try logging into the machine { return 0 } Permission denied { if {$retry_count $max_retry} { incr retry_count send_user Retry $retry_count for $ip\n attempt_connection } else { return 1 } } timeout { if {$retry_count $max_retry} { incr retry_count send_user Timeout, retry $retry_count for $ip\n attempt_connection } else { return 1 } } eof } } set result [attempt_connection] if {$result 0} { send_user Successfully configured SSH for $ip\n exit 0 } else { send_user Failed to configure SSH for $ip after $max_retry attempts\n exit 1 }3.2 性能优化技巧当处理大规模服务器集群时考虑以下优化方案优化方向具体措施预期效果并行处理使用GNU parallel或xargs -P参数减少总执行时间连接复用配置SSH ControlMaster降低连接建立开销密钥分发预先生成密钥对并分发避免重复生成密钥网络优化检查并优化网络路由提高传输速度日志分级实现DEBUG/INFO/WARN级别日志便于问题排查并行处理示例cat server_list.txt | parallel -j 10 ./auto_ssh_copy_id.exp {1} {2} {3} :::: -4. 安全与维护最佳实践4.1 安全加固方案密码管理改进使用Ansible Vault或HashiCorp Vault加密存储密码采用临时令牌替代固定密码访问控制强化# 限制SSH密钥使用范围 echo from192.168.1.0/24 ssh-rsa AAAAB3Nza... ~/.ssh/authorized_keys审计日志配置# 记录SSH登录事件 echo SyslogFacility AUTHPRIV /etc/ssh/sshd_config echo LogLevel VERBOSE /etc/ssh/sshd_config4.2 日常维护脚本创建定期检查脚本verify_ssh_access.sh#!/bin/bash SERVER_LISTserver_list.txt TIMEOUT5 CHECK_COMMANDhostname while read -r line; do ip$(echo $line | awk {print $1}) user$(echo $line | awk {print $2}) if ssh -o ConnectTimeout$TIMEOUT -o BatchModeyes $user$ip $CHECK_COMMAND /dev/null 21; then echo $ip: SSH access OK else echo $ip: SSH access FAILED fi done $SERVER_LIST在实际运维中这套方案将服务器初始化时间从平均3小时缩短到5分钟。有个细节值得注意当处理超过50台服务器时建议将超时时间调整为30秒以上避免网络波动导致批量失败。
http://www.zskr.cn/news/1408223.html

相关文章:

  • 从化区搬家公司电话 理赔流程拆解:普通人一看就懂 - 从来都是英雄出少年
  • Unity WebRequest请求HTTPS总报证书错误?手把手教你用CertificateHandler解决Cert verify failed
  • 从三角网格到完美四边形:QRemeshify让你的Blender模型重获新生 [特殊字符]
  • 广州从化区搬家公司推荐 办公室搬迁流程混乱实用维权指南 - 从来都是英雄出少年
  • 2026 全球主流 GEO 优化服务商综合实力盘点 - GEO优化
  • QGIS新手必看:5种添加图层的方法,哪种最快?(附快捷键大全)
  • 告别安装失败!手把手教你用CMD搞定Office 2016专业增强版激活(附一键转换脚本)
  • 从化区搬家拆装损坏推卸责任?维权全攻略 正规公司推荐 - 从来都是英雄出少年
  • 五子棋AI对战平台搭建指南:整合强化学习模型与PyGame可视化界面
  • 别再只写测试步骤了!CPAL脚本中这6个testcase函数,让你的自动化报告更专业
  • 5个理由告诉你:为什么Postman便携版是API测试的最佳选择
  • 基于傅立叶变换的时序信号去噪实战:从理论到Python实现
  • 别再只写测试步骤了!用CPAL这6个testcase函数,让你的自动化测试报告更专业
  • Claude Code 用户应对封号与 token 不足的 Taotoken 解决方案
  • 单相全桥逆变三种SPWM调制方式(单极/双极/倍频)到底怎么选?一篇讲透优缺点与选型
  • 2026 深圳五大 GEO 优化服务商综合实力评估 - GEO优化
  • Taotoken模型广场如何帮助开发者快速进行模型选型与效果对比
  • CAXA 尺寸标注编辑 —— 公差配合
  • 网页如何快速被收录?解决GSC“未建索引”的3个大招
  • 2026 深圳新房装修后除甲醛公司推荐:本地服务商全攻略 + 避坑指南 - 环保除醛知识库
  • 显著物体检测计算方法与其应用【附代码】
  • 新手避坑指南:用CYUSB3KIT-003开发板跑通第一个FX3固件(从驱动安装到LED点亮)
  • 欢聚季报图解:营收5.6亿美元 未来3年回馈股东15亿美元
  • 从入门到精通:大学生高含金量竞赛全攻略与时间线梳理
  • 从游戏角色移动到UI布局:定比分点公式在Unity/Cocos开发中的实战应用
  • GitHub Copilot CLI 接入 Azure AI Foundry 私有云端模型实战指南
  • 从传播路径看日出龙舌兰的记忆点
  • 基于GCN-GRU的LEO卫星信道预测:利用多用户空间相关性对抗信道老化
  • 网关Gateway、DNS域名解析完整配置(网络不通、域名无法访问终极排障)
  • 2026年十大GEO服务商排行榜:全意图GEO领航者增长超人位居榜首, - GEO优化