Linux shell脚本批量测试ssh密码
因为一些原因,团队会经常改密码,但不是全部服务器都要改密码,这就造成登录时候要试多次密码
所以,就想到能否让脚本自动匹配密码,毕竟密码就是固定的那几个。
刚开始想到用expect来做,但是在网上又找到了另外一个sshpass软件
0x00: 安装
方法一: 联网状态
1 | # yum -y install sshpass |
方法二:没有网络,就用编译安装包,下面是下载地址
1 2 3 4 5 | https: //sourceforge .net /projects/sshpass/files/ or https: //pan .baidu.com /s/1pLNxeLd or wget http: //sourceforge .net /projects/sshpass/files/latest/download -O sshpass. tar .gz |
下载完还要编译安装,要在root下才有权安装。
1 2 3 4 5 | # tar -zxvf sshpass-1.06.tar.gz # cd sshpass-1.06/ # ./configure # make # make install |
基本环节搭建好了,内容摘抄其他博客,原文链接在最下面
0x01:安装expect命令
1 | # yum -y install expect |
* 下面脚本里 的中文注释是为了方便阅读,实际使用时请删除,否则在某些系统环境可能报错。
0x02:写shell脚本来循环匹配,文件名get_password.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | #!/bin/bash ## file name: get_password.sh ## 要测试的IP,是参数传入的 test_ip=$1 ## 密码列表,空格分隔 pwd_lists= "root rootroot test123 password Admin123" ## 记录找到密码的文件 psss_history_file= "pwd_history.txt" ## 判断,如果没有写参数则,提示并退出 if [ $ # -eq 0 ];then echo -e "\nUage: \n\tsh $0 127.0.0.1" exit fi ## 打印历史密码 echo -e "\n----------------- history passwd -----------------" cat ${psss_history_file} | grep ${test_ip} echo -e "----------------- history passwd -----------------\n" ## 循环遍历 for pwd_list in ${pwd_lists} do sshpass -p ${pwd_list} ssh -o StrictHostKeyChecking=no root@${test_ip} "exit" ## 判断sshpass执行是否成功 if [ $? - eq 0 ]; then ## 提示信息,当前正在测试的IP 和密码 echo -e "\n[ Success ] IP=\"$1\" password=\"${pwd_list}\" " ## 将找到的密码保存到文件里 echo "$1:${pwd_list}" >> ${psss_history_file} ## 找到密码后,退出脚本,不是退出循环 exit else ## 提示当前这个密码没有成功 echo "[ Failure ] password=\"${pwd_list}\"" fi done |
0x03: 远程调用
因为某些原因,本地执行脚本访问IP会有限制,比如“安全人员”只允许员工机器登录很少的IP网段,但是服务可以访问所有网段。
我们可把get_password.sh文件放到服务的某个路径下,我们从本地传参给服务器调用。
这里我们把上面的get_password.sh脚本,放到服务器上test用户的"家"目录下,绝对路径/home/test/50_get_password/get_password.sh
文件:l_get_password.sh
1 2 3 4 5 | #!/bin/bash ##file name : l_get_password.sh ## 用expect调用exp脚本连接远程50服务器,传参过去 expect 50_get_password.exp $1 |
文件:50_get_password.exp (因为IP里带50,所以文件名前面加了50好区分)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #!/usr/bin/expect ## file name : 50_get_password.exp ## 接收传入参数,赋值给ip这变量,类似shell脚本的ip=$1语法 set ip [lindex $argv 0] ## 拼接命令,cmd是变量,“”号里是要执行命令,命令必须放到“”里 set cmd "cd 50_get_password && sh get_password.sh $ip" ## 登录的服务器密码的变量 set password "test123" <br> ## 超时,必须设置时间(秒数根据具体情况设置),否则探测过程中自动退出<br>set timeout 45<br> ## 用ssh方式登录服务器,并执行$cmd里的命令 spawn ssh test @192.168.1.50 "$cmd" expect { ## 首次登录时有带yes/no字样的文字提示,就发送yes过去 "yes/no" {send "yes\r" ;exp_continue} ## 登录时有带passwor字样的文字提示,就把密码test123发送过去 "*password*" {send "$passwd\r" } } expect eof |
0x04:使用
本地使用:
1 | # sh get_password.sh 192.168.1.66 |
远程调用:
1 | # sh l_get_password.sh 192.168.1.66 |
0x05:调试
如果使用中遇到问题,可以加参数来观察脚本的值
sh文件
1 | # sh -x get_password.sh 192.168.1.66 |
exp文件
1 | expect -d 50_get_password.exp |
https://blog.csdn.net/weixin_34402090/article/details/89779335
https://blog.csdn.net/qq_30553235/article/details/78711491
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器