linux技巧

服务器密码尝试登录shell脚本

交接的服务器一堆,密码一堆,密码改来改去,没有对应关系,利用这个脚本逐一探测。(密码保存在pw.txt 每行一个密码, ip地址写在脚本中)

#!/bin/bash

# 配置信息
SERVER_IP="123.123.123.123"
USERNAME="root"
PASS_FILE="pw.txt"

# 检查pw.txt是否存在
if [ ! -f "$PASS_FILE" ]; then
    echo "错误:密码文件 $PASS_FILE 不存在!"
    exit 1
fi

# 检查expect是否安装
if ! command -v expect &> /dev/null; then
    echo "错误:未安装expect工具,请先执行安装(如:yum install expect -y 或 apt install expect -y)"
    exit 1
fi

# 循环读取密码并尝试登录
while IFS= read -r password; do
    # 跳过空行
    [ -z "$password" ] && continue

    echo -e "\n 正在尝试密码:$password"
    
    # 使用expect执行SSH登录尝试(修复语法错误)
    login_result=$(expect -c '
        set timeout 10;  # 超时时间10秒(分号分隔注释)
        spawn ssh -o StrictHostKeyChecking=no '"$USERNAME"'@'"$SERVER_IP"'
        expect {
            "password:" { send "'"$password"'\r"; exp_continue }
            "Permission denied" { exit 1 }
            "Last login:" { exit 0 }
            timeout { exit 2 }
            "Connection refused" { exit 3 }
            "No route to host" { exit 4 }
            eof { exit 5 }
        }
    ')
    
    # 根据expect退出码判断结果
    case $? in
        0)
            echo -e "登录成功!正确密码为:$password"
            exit 0  # 找到正确密码后退出脚本
            ;;
        1)
            echo "登录失败:密码错误"
            ;;
        2)
            echo "登录失败:连接超时"
            ;;
        3)
            echo "登录失败:SSH端口被拒绝(可能端口非22或服务未启动)"
            ;;
        4)
            echo "登录失败:服务器不可达(IP错误或网络问题)"
            exit 1  # 网络问题无需继续尝试
            ;;
        *)
            echo "登录失败:Expect语法错误或未知异常"
            ;;
    esac
done < "$PASS_FILE"

echo -e "\n 所有密码尝试完毕,未找到正确密码!"
exit 1