docker #!/bin/bash # INFO echo -n "./adm.sh hosts.txt" #################################### # VARS INPUT_FILE=$1 OUTPUT_FILE="$HOME/scan_results.csv" ERROR_HOSTS_FILE="$HOME/$0_ssh_error_hosts.txt" LOG_FILE="$HOME/$0.log" PROCESSED_COUNT=0 # FAQ function usage { echo "Usage:" echo "$(basename $0) hosts.txt" echo "The file hosts.txt should be filled with hostnames or IP addresses, each entry on a separate line." } # Проверка аргументов и файла if [[ $# -eq 0 || ! -f "$INPUT_FILE" ]]; then usage exit 1 fi # Обработка ошибок process_error() { echo $1 >> "$ERROR_HOSTS_FILE" echo "ERROR $1: $2" >&2 echo "$(date): Error processing $1 - $2" >> "$LOG_FILE" } # Очистка файлов echo "Host;Account;IP;Path" > "$OUTPUT_FILE" echo -n > "$ERROR_HOSTS_FILE" echo "$(date): Script started" >> "$LOG_FILE" # MAIN CYCLE — подключаемся по SSH и парсим логи на каждом хосте while IFS= read -r server; do echo "Processing $server…" temp_file=$(mktemp) ssh -q -o ConnectTimeout=20 -o StrictHostKeyChecking=no "aparing${server}" /bin/bash << 'EOF' > "$temp_file" 2>> "$HOME/$0-errors.log" # Парсим /var/log/messages — ищем строки с "sys_scan" grep 'sys_scan' /var/log/messages | \ while read -r line; do ACCOUNT=$(echo "$line" | grep -oP '(?<=sys_scan\|)[^|]+') IP=$(echo "$line" | grep -oP '(?<=\|BRANCH\|)[^|]+') PATH=$(echo "$line" | grep -oP '(?<=ok\||access\||allow\||perm\|)[^ ]+' | sed 's!/[^/]*$!!') if [ -n "$ACCOUNT" ] && [ -n "$IP" ] && [ -n "$PATH" ]; then echo "$ACCOUNT;$IP;$PATH" fi done EOF if [[ $? -eq 0 ]]; then # Добавляем хост в начало каждой строки и записываем в общий файл while IFS=; read -r line; do echo "$server;$line" >> "$OUTPUT_FILE" done < "$temp_file" echo "$(date): Successfully processed $server" >> "$LOG_FILE" ((PROCESSED_COUNT++)) else process_error "$server" "SSH connection failed or log parsing error" fi rm -f "$temp_file" done < "$INPUT_FILE" # Убираем дубликаты в итоговом файле (сохраняем уникальность строк) sort "$OUTPUT_FILE" | uniq > "$OUTPUT_FILE.tmp" mv "$OUTPUT_FILE.tmp" "$OUTPUT_FILE" # Финальный вывод echo "Results saved to $OUTPUT_FILE" echo "Processed servers: $PROCESSED_COUNT" echo "Errors logged in $ERROR_HOSTS_FILE" echo "$(date): Script finished. Processed $PROCESSED_COUNT servers." >> "$LOG_FILE"