Linux shell脚本批量测试ssh密码

 因为一些原因,团队会经常改密码,但不是全部服务器都要改密码,这就造成登录时候要试多次密码

所以,就想到能否让脚本自动匹配密码,毕竟密码就是固定的那几个。

刚开始想到用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[ 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

#!/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"
## 超时,必须设置时间(秒数根据具体情况设置),否则探测过程中自动退出
set timeout 45
## 用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

  

相关阅读  Python100天学习计划:第42天: paramiko模块

  

0x04:使用

本地使用:

# sh get_password.sh 192.168.1.66  

远程调用:

# sh l_get_password.sh 192.168.1.66

  

0x05:调试

如果使用中遇到问题,可以加参数来观察脚本的值

sh文件

# sh -x get_password.sh 192.168.1.66

exp文件

expect -d 50_get_password.exp

  

 

https://blog.csdn.net/weixin_34402090/article/details/89779335

https://blog.csdn.net/qq_30553235/article/details/78711491