因为一些原因,团队会经常改密码,但不是全部服务器都要改密码,这就造成登录时候要试多次密码
所以,就想到能否让脚本自动匹配密码,毕竟密码就是固定的那几个。
刚开始想到用expect来做,但是在网上又找到了另外一个sshpass软件
0x00: 安装
方法一: 联网状态
# yum -y install sshpass
方法二:没有网络,就用编译安装包,下面是下载地址
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下才有权安装。
# tar -zxvf sshpass-1.06.tar.gz # cd sshpass-1.06/ # ./configure # make # make install
基本环节搭建好了,内容摘抄其他博客,原文链接在最下面
0x01:安装expect命令
# yum -y install expect
* 下面脚本里 的中文注释是为了方便阅读,实际使用时请删除,否则在某些系统环境可能报错。
0x02:写shell脚本来循环匹配,文件名get_password.sh
#!/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[ succ ] 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
#!/bin/bash ##file name : l_get_password.sh ## 用expect调用exp脚本连接远程50服务器,传参过去 expect 50_get_password.exp $1
文件:50_get_password.exp (因为IP里带50,所以文件名前面加了50好区分)
#!/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" ## 用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:使用
本地使用:
# sh get_password.sh 192.168.1.66
远程调用:
# sh l_get_password.sh 192.168.1.66
https://blog.csdn.net/weixin_34402090/article/details/89779335
https://blog.csdn.net/qq_30553235/article/details/78711491