批量登录ssh并执行shell命令
2024-06-21 / shell / 499 次围观 / 0 次吐槽 /#!/bin/bash
>/root/.ssh/known_hosts
# 定义包含IP地址列表和密码的文件
IP_LIST="list.txt"
# 定义输出结果的文件
OUTPUT_FILE="out.csv"
INFO_FILE="info.csv"
# SSH登录的用户名
USER="weihu"
> "$OUTPUT_FILE"
> "$INFO_FILE"
echo "IP1,IP2,system," > "$INFO_FILE"
if [[ ! -f $IP_LIST ]]; then
echo "文件 $IP_LIST 不存在。" | tee -a "$OUTPUT_FILE"
exit 1
fi
is_valid_ip() {
local IP=$1
local VALID_IP_REGEX="^([0-9]{1,3}\.){3}[0-9]{1,3}$"
if [[ $IP =~ $VALID_IP_REGEX ]]; then
# 检查每个八位字节是否在0-255范围内
IFS='.' read -r -a OCTETS <<< "$IP"
for OCTET in "${OCTETS[@]}"; do
if (( OCTET < 0 || OCTET > 255 )); then
return 1
fi
done
return 0
else
return 1
fi
}
# 执行SSH成功登录后的操作
run_shell(){
local IP=$1
echo "success"
#查询网卡绑定IP
#bond1=$(grep 'IPADDR=' /etc/sysconfig/network-scripts/ifcfg-bond1 | awk -F '=' '/^[^#]*IPADDR=/ {print $2}')
#bond0=$(grep 'IPADDR=' /etc/sysconfig/network-scripts/ifcfg-bond0 | awk -F '=' '/^[^#]*IPADDR=/ {print $2}')
ip=$(/sbin/ip addr show | grep -Po 'inet \K[\d.]+' | grep -v -e "^$IP$" -e "127.0.0.1")
#查询系统版本
if [ -f "/etc/redhat-release" ];then
system=$(cat /etc/redhat-release)
else
system=$(cat /etc/*-release | grep '^PRETTY_NAME=' | cut -d'=' -f2- | tr -d '"')
fi
#查询root用户密码是否正确
echo "$root_password" > /tmp/root_passwd.txt
if su -l root < /tmp/root_passwd.txt -c "id"; then
root_password_status="true"
else
root_password_status="false"
fi
rm -f /tmp/root_passwd.txt
/*if echo "$root_password" | su -l root -c "id"; then
root_password_status="true"
else
root_password_status="false"
fi*/
#修改root密码
#echo "$root_password" | su -c "echo '$new_root_passwd' | passwd --stdin root"
#echo "$weihu_password" | sudo -S bash -c "echo '$new_root_passwd' | passwd --stdin root"
status=$?
if [ $status -eq 0 ]; then
passwdstatus="ok"
else
passwdstatus=$status
fi
echo "{$ip,$system}"
exit
}
check_ssh() {
local IP="$1"
local PASSWORD="$2"
local OUTPUT
#run_shell可以传递多个参数如:run_shell \"param1\" \"param2\"
OUTPUT=$(sshpass -p "$PASSWORD" ssh -o StrictHostKeyChecking=no -o ConnectTimeout=5 -n $USER@$IP "$(declare -f run_shell);run_shell \"$IP\" " 2>&1)
#echo "debug:$IP:$OUTPUT"
if echo "$OUTPUT" | grep -q "success"; then
echo "SSH连接成功并且认证正确。" | tee -a "$OUTPUT_FILE"
echo -n "$IP," | tee -a "$INFO_FILE"
echo "$OUTPUT" | grep -o '{[^}]*}' | sed 's/{//;s/}//' | tee -a "$INFO_FILE"
elif echo "$OUTPUT" | grep -q "Permission denied"; then
echo "SSH连接成功,但认证失败。" | tee -a "$OUTPUT_FILE"
elif echo "$OUTPUT" | grep -q "Connection refused"; then
echo "SSH连接失败,连接被拒绝。" | tee -a "$OUTPUT_FILE"
elif echo "$OUTPUT" | grep -q "timed out"; then
echo "SSH连接失败,连接超时。" | tee -a "$OUTPUT_FILE"
elif echo "$OUTPUT" | grep -q "No route to host"; then
echo "SSH连接失败,无路由到主机。" | tee -a "$OUTPUT_FILE"
elif echo "$OUTPUT" | grep -q "Name or service not known"; then
echo "SSH连接失败,名称或服务未知。" | tee -a "$OUTPUT_FILE"
else
echo "SSH连接失败。" | tee -a "$OUTPUT_FILE"
fi
}
while IFS= read -r LINE; do
IP=$(echo "$LINE" | awk '{print $1}')
PASSWORD=$(echo "$LINE" | awk '{print $2}')
if [[ -n "$IP" ]]; then
if is_valid_ip "$IP"; then
echo -n "正在检查"
echo -n "$IP," | tee -a "$OUTPUT_FILE"
if [[ -z "${PASSWORD// /}" ]]; then
echo "密码为空" | tee -a "$OUTPUT_FILE"
else
{ check_ssh "$IP" "$PASSWORD"; } || true
fi
else
echo "$IP,不是一个有效的IP地址。" | tee -a "$OUTPUT_FILE"
fi
fi
done < "$IP_LIST"
echo "SSH扫描完成。" | tee -a "$OUTPUT_FILE"Powered By Cheug's Blog
Copyright Cheug Rights Reserved.