check-ips.sh
· 7.0 KiB · Bash
原始檔案
#!/bin/bash
#==============================================================================
# Proxmox IP Scanner
# Описание: Сканира всички LXC контейнери и VM за IP адреси, проверява за
# дублирани IP и показва отворени портове
#
# Употреба:
# ./check-ips.sh - Основна проверка на IP адресите
# ./check-ips.sh -p - Показва и отворените портове
# ./check-ips.sh -o report.txt - Записва резултата във файл
# ./check-ips.sh -p -o report.txt - Показва портове И записва във файл
# ./check-ips.sh -h - Показва помощта
#
# Параметри:
# -p, --ports Показва отворените портове на работещите контейнери
# -o, --output Записва резултата във файл (презаписва файла ако съществува)
# -h, --help Показва помощната информация
#
# Примери:
# ./check-ips.sh -p # Проверка с портове
# ./check-ips.sh -o /root/ip-report.txt # Запис в /root/
# ./check-ips.sh --ports --output scan.txt # Пълен скан със запис
#==============================================================================
# Цветове за терминала
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
OUTPUT_FILE=""
SHOW_PORTS=false
# Обработка на параметри
while [[ $# -gt 0 ]]; do
case $1 in
-o|--output)
OUTPUT_FILE="$2"
shift 2
;;
-p|--ports)
SHOW_PORTS=true
shift
;;
-h|--help)
echo "Употреба: $0 [-o файл] [-p]"
echo " -o, --output FILE Записва резултата във файл"
echo " -p, --ports Показва отворените портове"
echo " -h, --help Показва тази помощ"
exit 0
;;
*)
echo "Непознат параметър: $1"
exit 1
;;
esac
done
# Функция за запис и показване
log() {
echo -e "$1"
if [ -n "$OUTPUT_FILE" ]; then
echo -e "$1" | sed 's/\x1b\[[0-9;]*m//g' >> "$OUTPUT_FILE"
fi
}
# Изчистване на файла ако съществува
if [ -n "$OUTPUT_FILE" ]; then
> "$OUTPUT_FILE"
fi
log "${BLUE}=== Proxmox IP Проверка ===${NC}"
log "Дата: $(date '+%Y-%m-%d %H:%M:%S')\n"
# Масив за съхранение на IP адреси
declare -A ip_list
declare -A ip_owners
# Обхождане на всички LXC контейнери
log "${GREEN}Сканиране на LXC контейнери...${NC}\n"
for ctid in $(pct list | awk 'NR>1 {print $1}'); do
name=$(pct list | grep "^$ctid" | awk '{print $3}')
status=$(pct status $ctid | awk '{print $2}')
log "${YELLOW}CT $ctid${NC} - $name [$status]"
# Четене на конфигурацията
config_file="/etc/pve/lxc/${ctid}.conf"
if [ -f "$config_file" ]; then
# Извличане на IP адреси от конфигурацията
ips=$(grep -E "^net[0-9]+:" "$config_file" | grep -oP 'ip=\K[^/,]+' | sort -u)
if [ -n "$ips" ]; then
while IFS= read -r ip; do
if [ "$ip" != "dhcp" ]; then
log " IP: ${GREEN}$ip${NC}"
# Проверка за дублиране
if [ -n "${ip_list[$ip]}" ]; then
ip_list[$ip]="${ip_list[$ip]}, CT$ctid($name)"
else
ip_list[$ip]="CT$ctid($name)"
fi
ip_owners[$ip]+="CT$ctid($name) "
# Проверка на портове ако контейнера работи
if [ "$status" = "running" ] && [ "$SHOW_PORTS" = true ]; then
ports=$(pct exec $ctid -- ss -tlnp 2>/dev/null | awk 'NR>1 {print $4}' | grep -oP ':\K[0-9]+$' | sort -u | tr '\n' ' ')
if [ -n "$ports" ]; then
log " Портове: ${BLUE}$ports${NC}"
fi
fi
fi
done <<< "$ips"
else
log " ${YELLOW}Няма намерени IP адреси${NC}"
fi
fi
log ""
done
# Проверка за VM (опционално)
log "${GREEN}Сканиране на VM...${NC}\n"
for vmid in $(qm list | awk 'NR>1 {print $1}'); do
name=$(qm list | grep "^$vmid" | awk '{print $2}')
status=$(qm status $vmid | awk '{print $2}')
log "${YELLOW}VM $vmid${NC} - $name [$status]"
config_file="/etc/pve/qemu-server/${vmid}.conf"
if [ -f "$config_file" ]; then
# Извличане на IP от конфигурацията (ако е зададен статично)
ips=$(grep -oP 'ip=\K[^/,]+' "$config_file" 2>/dev/null | sort -u)
if [ -n "$ips" ]; then
while IFS= read -r ip; do
log " IP: ${GREEN}$ip${NC}"
if [ -n "${ip_list[$ip]}" ]; then
ip_list[$ip]="${ip_list[$ip]}, VM$vmid($name)"
else
ip_list[$ip]="VM$vmid($name)"
fi
ip_owners[$ip]+="VM$vmid($name) "
done <<< "$ips"
else
log " ${YELLOW}Няма статични IP (DHCP или config празен)${NC}"
fi
fi
log ""
done
# Проверка за дублирани IP
log "\n${BLUE}=== Анализ на IP адреси ===${NC}\n"
duplicate_found=false
for ip in "${!ip_list[@]}"; do
count=$(echo "${ip_owners[$ip]}" | wc -w)
if [ $count -gt 1 ]; then
duplicate_found=true
log "${RED}⚠ ДУБЛИРАН IP: $ip${NC}"
log " Използва се от: ${ip_owners[$ip]}"
log ""
fi
done
if [ "$duplicate_found" = false ]; then
log "${GREEN}✓ Няма дублирани IP адреси${NC}\n"
fi
# Обобщена таблица
log "${BLUE}=== Всички IP адреси ===${NC}"
log "$(printf '%-18s | %s' 'IP Адрес' 'Собственик')"
log "$(printf '%s' '-------------------+----------------------------------------')"
for ip in $(echo "${!ip_list[@]}" | tr ' ' '\n' | sort -V); do
count=$(echo "${ip_owners[$ip]}" | wc -w)
if [ $count -gt 1 ]; then
color=$RED
else
color=$NC
fi
log "${color}$(printf '%-18s | %s' "$ip" "${ip_list[$ip]}")${NC}"
done
if [ -n "$OUTPUT_FILE" ]; then
log "\n${GREEN}Резултатът е записан във: $OUTPUT_FILE${NC}"
fi
| 1 | #!/bin/bash |
| 2 | |
| 3 | #============================================================================== |
| 4 | # Proxmox IP Scanner |
| 5 | # Описание: Сканира всички LXC контейнери и VM за IP адреси, проверява за |
| 6 | # дублирани IP и показва отворени портове |
| 7 | # |
| 8 | # Употреба: |
| 9 | # ./check-ips.sh - Основна проверка на IP адресите |
| 10 | # ./check-ips.sh -p - Показва и отворените портове |
| 11 | # ./check-ips.sh -o report.txt - Записва резултата във файл |
| 12 | # ./check-ips.sh -p -o report.txt - Показва портове И записва във файл |
| 13 | # ./check-ips.sh -h - Показва помощта |
| 14 | # |
| 15 | # Параметри: |
| 16 | # -p, --ports Показва отворените портове на работещите контейнери |
| 17 | # -o, --output Записва резултата във файл (презаписва файла ако съществува) |
| 18 | # -h, --help Показва помощната информация |
| 19 | # |
| 20 | # Примери: |
| 21 | # ./check-ips.sh -p # Проверка с портове |
| 22 | # ./check-ips.sh -o /root/ip-report.txt # Запис в /root/ |
| 23 | # ./check-ips.sh --ports --output scan.txt # Пълен скан със запис |
| 24 | #============================================================================== |
| 25 | |
| 26 | # Цветове за терминала |
| 27 | RED='\033[0;31m' |
| 28 | GREEN='\033[0;32m' |
| 29 | YELLOW='\033[1;33m' |
| 30 | BLUE='\033[0;34m' |
| 31 | NC='\033[0m' # No Color |
| 32 | |
| 33 | OUTPUT_FILE="" |
| 34 | SHOW_PORTS=false |
| 35 | |
| 36 | # Обработка на параметри |
| 37 | while [[ $# -gt 0 ]]; do |
| 38 | case $1 in |
| 39 | -o|--output) |
| 40 | OUTPUT_FILE="$2" |
| 41 | shift 2 |
| 42 | ;; |
| 43 | -p|--ports) |
| 44 | SHOW_PORTS=true |
| 45 | shift |
| 46 | ;; |
| 47 | -h|--help) |
| 48 | echo "Употреба: $0 [-o файл] [-p]" |
| 49 | echo " -o, --output FILE Записва резултата във файл" |
| 50 | echo " -p, --ports Показва отворените портове" |
| 51 | echo " -h, --help Показва тази помощ" |
| 52 | exit 0 |
| 53 | ;; |
| 54 | *) |
| 55 | echo "Непознат параметър: $1" |
| 56 | exit 1 |
| 57 | ;; |
| 58 | esac |
| 59 | done |
| 60 | |
| 61 | # Функция за запис и показване |
| 62 | log() { |
| 63 | echo -e "$1" |
| 64 | if [ -n "$OUTPUT_FILE" ]; then |
| 65 | echo -e "$1" | sed 's/\x1b\[[0-9;]*m//g' >> "$OUTPUT_FILE" |
| 66 | fi |
| 67 | } |
| 68 | |
| 69 | # Изчистване на файла ако съществува |
| 70 | if [ -n "$OUTPUT_FILE" ]; then |
| 71 | > "$OUTPUT_FILE" |
| 72 | fi |
| 73 | |
| 74 | log "${BLUE}=== Proxmox IP Проверка ===${NC}" |
| 75 | log "Дата: $(date '+%Y-%m-%d %H:%M:%S')\n" |
| 76 | |
| 77 | # Масив за съхранение на IP адреси |
| 78 | declare -A ip_list |
| 79 | declare -A ip_owners |
| 80 | |
| 81 | # Обхождане на всички LXC контейнери |
| 82 | log "${GREEN}Сканиране на LXC контейнери...${NC}\n" |
| 83 | |
| 84 | for ctid in $(pct list | awk 'NR>1 {print $1}'); do |
| 85 | name=$(pct list | grep "^$ctid" | awk '{print $3}') |
| 86 | status=$(pct status $ctid | awk '{print $2}') |
| 87 | |
| 88 | log "${YELLOW}CT $ctid${NC} - $name [$status]" |
| 89 | |
| 90 | # Четене на конфигурацията |
| 91 | config_file="/etc/pve/lxc/${ctid}.conf" |
| 92 | |
| 93 | if [ -f "$config_file" ]; then |
| 94 | # Извличане на IP адреси от конфигурацията |
| 95 | ips=$(grep -E "^net[0-9]+:" "$config_file" | grep -oP 'ip=\K[^/,]+' | sort -u) |
| 96 | |
| 97 | if [ -n "$ips" ]; then |
| 98 | while IFS= read -r ip; do |
| 99 | if [ "$ip" != "dhcp" ]; then |
| 100 | log " IP: ${GREEN}$ip${NC}" |
| 101 | |
| 102 | # Проверка за дублиране |
| 103 | if [ -n "${ip_list[$ip]}" ]; then |
| 104 | ip_list[$ip]="${ip_list[$ip]}, CT$ctid($name)" |
| 105 | else |
| 106 | ip_list[$ip]="CT$ctid($name)" |
| 107 | fi |
| 108 | |
| 109 | ip_owners[$ip]+="CT$ctid($name) " |
| 110 | |
| 111 | # Проверка на портове ако контейнера работи |
| 112 | if [ "$status" = "running" ] && [ "$SHOW_PORTS" = true ]; then |
| 113 | ports=$(pct exec $ctid -- ss -tlnp 2>/dev/null | awk 'NR>1 {print $4}' | grep -oP ':\K[0-9]+$' | sort -u | tr '\n' ' ') |
| 114 | if [ -n "$ports" ]; then |
| 115 | log " Портове: ${BLUE}$ports${NC}" |
| 116 | fi |
| 117 | fi |
| 118 | fi |
| 119 | done <<< "$ips" |
| 120 | else |
| 121 | log " ${YELLOW}Няма намерени IP адреси${NC}" |
| 122 | fi |
| 123 | fi |
| 124 | log "" |
| 125 | done |
| 126 | |
| 127 | # Проверка за VM (опционално) |
| 128 | log "${GREEN}Сканиране на VM...${NC}\n" |
| 129 | |
| 130 | for vmid in $(qm list | awk 'NR>1 {print $1}'); do |
| 131 | name=$(qm list | grep "^$vmid" | awk '{print $2}') |
| 132 | status=$(qm status $vmid | awk '{print $2}') |
| 133 | |
| 134 | log "${YELLOW}VM $vmid${NC} - $name [$status]" |
| 135 | |
| 136 | config_file="/etc/pve/qemu-server/${vmid}.conf" |
| 137 | |
| 138 | if [ -f "$config_file" ]; then |
| 139 | # Извличане на IP от конфигурацията (ако е зададен статично) |
| 140 | ips=$(grep -oP 'ip=\K[^/,]+' "$config_file" 2>/dev/null | sort -u) |
| 141 | |
| 142 | if [ -n "$ips" ]; then |
| 143 | while IFS= read -r ip; do |
| 144 | log " IP: ${GREEN}$ip${NC}" |
| 145 | |
| 146 | if [ -n "${ip_list[$ip]}" ]; then |
| 147 | ip_list[$ip]="${ip_list[$ip]}, VM$vmid($name)" |
| 148 | else |
| 149 | ip_list[$ip]="VM$vmid($name)" |
| 150 | fi |
| 151 | |
| 152 | ip_owners[$ip]+="VM$vmid($name) " |
| 153 | done <<< "$ips" |
| 154 | else |
| 155 | log " ${YELLOW}Няма статични IP (DHCP или config празен)${NC}" |
| 156 | fi |
| 157 | fi |
| 158 | log "" |
| 159 | done |
| 160 | |
| 161 | # Проверка за дублирани IP |
| 162 | log "\n${BLUE}=== Анализ на IP адреси ===${NC}\n" |
| 163 | |
| 164 | duplicate_found=false |
| 165 | for ip in "${!ip_list[@]}"; do |
| 166 | count=$(echo "${ip_owners[$ip]}" | wc -w) |
| 167 | if [ $count -gt 1 ]; then |
| 168 | duplicate_found=true |
| 169 | log "${RED}⚠ ДУБЛИРАН IP: $ip${NC}" |
| 170 | log " Използва се от: ${ip_owners[$ip]}" |
| 171 | log "" |
| 172 | fi |
| 173 | done |
| 174 | |
| 175 | if [ "$duplicate_found" = false ]; then |
| 176 | log "${GREEN}✓ Няма дублирани IP адреси${NC}\n" |
| 177 | fi |
| 178 | |
| 179 | # Обобщена таблица |
| 180 | log "${BLUE}=== Всички IP адреси ===${NC}" |
| 181 | log "$(printf '%-18s | %s' 'IP Адрес' 'Собственик')" |
| 182 | log "$(printf '%s' '-------------------+----------------------------------------')" |
| 183 | |
| 184 | for ip in $(echo "${!ip_list[@]}" | tr ' ' '\n' | sort -V); do |
| 185 | count=$(echo "${ip_owners[$ip]}" | wc -w) |
| 186 | if [ $count -gt 1 ]; then |
| 187 | color=$RED |
| 188 | else |
| 189 | color=$NC |
| 190 | fi |
| 191 | log "${color}$(printf '%-18s | %s' "$ip" "${ip_list[$ip]}")${NC}" |
| 192 | done |
| 193 | |
| 194 | if [ -n "$OUTPUT_FILE" ]; then |
| 195 | log "\n${GREEN}Резултатът е записан във: $OUTPUT_FILE${NC}" |
| 196 | fi |
proxmox.png
· 120 KiB · Image (PNG)
原始檔案