Cheug's Blog

当前位置:网站首页 / shell / 正文

批量登录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.