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

  

  

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM