Utoljára aktív 1 month ago

Сканира всички LXC контейнери и VM за IP адреси, проверява за дублирани IP и показва отворени портове

urocibg gist felülvizsgálása 1 month ago. Revízióhoz ugrás

2 files changed, 196 insertions

check-ips.sh(fájl létrehozva)

@@ -0,0 +1,196 @@
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
Újabb Régebbi