因為一些原因,團隊會經常改密碼,但不是全部服務器都要改密碼,這就造成登錄時候要試多次密碼
所以,就想到能否讓腳本自動匹配密碼,畢竟密碼就是固定的那幾個。
剛開始想到用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
