103 lines
3.7 KiB
Bash
103 lines
3.7 KiB
Bash
#!/bin/bash
|
||
|
||
# Скрипт установки кастомного sysinfo MOTD со статистикой логинов
|
||
|
||
TARGET_PATH="/etc/update-motd.d/zzzzz-motd-sysinfo"
|
||
|
||
cat > "$TARGET_PATH" <<"EOF"
|
||
#!/bin/bash
|
||
|
||
RED="\033[0;31m"
|
||
GREEN="\033[0;32m"
|
||
YELLOW="\033[1;33m"
|
||
BLUE="\033[1;34m"
|
||
CYAN="\033[0;36m"
|
||
RESET="\033[0m"
|
||
|
||
MEM_STAT=$(free -m | awk '/^Mem:/{printf "%.1f/%.1f МБ", $3, $2}')
|
||
LOAD_AVG=$(awk '{print $1 " " $2 " " $3}' /proc/loadavg)
|
||
if command -v sensors &>/dev/null && sensors | grep -iP "Core|temp1" >/dev/null; then
|
||
CPU_TEMP=$(sensors | grep -iP "Core|temp1" | head -n1 | awk '{print $NF}')
|
||
elif [[ -r /sys/class/thermal/thermal_zone0/temp ]]; then
|
||
TEMP_RAW=$(cat /sys/class/thermal/thermal_zone0/temp)
|
||
CPU_TEMP=$(awk "BEGIN{printf \"%.1f°C\", $TEMP_RAW/1000}")
|
||
else
|
||
CPU_TEMP="N/A"
|
||
fi
|
||
DISK_STAT=$(df -h / | awk 'NR==2{printf "%s/%s (свободно/всего)", $4, $2}')
|
||
|
||
# Английская локаль для дат
|
||
DATE_24H_AGO=$(LC_TIME=C date --date="24 hours ago" "+%b %-d")
|
||
CURRENT_DATE=$(LC_TIME=C date "+%b %-d")
|
||
HOUR_24H_AGO=$(date --date="24 hours ago" "+%H")
|
||
CURRENT_HOUR=$(date "+%H")
|
||
|
||
get_recent_logs() {
|
||
local AUTHLOG=""
|
||
if [[ -f /var/log/auth.log ]]; then
|
||
AUTHLOG="/var/log/auth.log"
|
||
elif [[ -f /var/log/secure ]]; then
|
||
AUTHLOG="/var/log/secure"
|
||
fi
|
||
|
||
if [[ -n "$AUTHLOG" ]]; then
|
||
awk -v d1="$DATE_24H_AGO" -v d2="$CURRENT_DATE" -v h1="$HOUR_24H_AGO" -v h2="$CURRENT_HOUR" '
|
||
{
|
||
line_date = $1 " " $2
|
||
line_hour = substr($3,1,2)
|
||
if (line_date == d1 && line_date != d2) {
|
||
if (line_hour >= h1) print $0
|
||
}
|
||
else if (line_date == d2) {
|
||
if (line_hour <= h2) print $0
|
||
}
|
||
else if (line_date > d1 && line_date < d2) {
|
||
print $0
|
||
}
|
||
}
|
||
' "$AUTHLOG"
|
||
elif command -v journalctl &>/dev/null; then
|
||
journalctl -u ssh -u sshd --since "24 hours ago" --no-pager 2>/dev/null
|
||
fi
|
||
}
|
||
|
||
RECENT_LOG=$(get_recent_logs)
|
||
|
||
FAILED_IPS=$(echo "$RECENT_LOG" | grep "Failed " | awk '{for(i=1;i<NF;i++) if($i=="from") print $(i+1)}' | grep -E '^[0-9]+\.[0-9]+' | sort | uniq -c | sort -nr | head -n 10 | awk '{printf "%s: %s\n", $2, $1}')
|
||
SUCCESS_IPS=$(echo "$RECENT_LOG" | grep "Accepted " | awk '{for(i=1;i<NF;i++) if($i=="from") print $(i+1)}' | grep -E '^[0-9]+\.[0-9]+' | sort | uniq -c | sort -nr | head -n 10 | awk '{printf "%s: %s\n", $2, $1}')
|
||
|
||
echo -e "\n\n${BLUE}============ Состояние сервера ============${RESET}"
|
||
echo -e "${YELLOW}ОЗУ: ${GREEN}${MEM_STAT}${RESET}"
|
||
echo -e "${YELLOW}Нагрузка: ${GREEN}${LOAD_AVG}${RESET} (1/5/15 мин)"
|
||
echo -e "${YELLOW}Диск: ${GREEN}${DISK_STAT}${RESET}"
|
||
echo -e "${YELLOW}CPU: ${GREEN}${CPU_TEMP}${RESET}"
|
||
|
||
echo -e "\n${BLUE}--- Неудачные попытки входа за 24ч (IP: попытки) ---${RESET}"
|
||
if [[ -n "$FAILED_IPS" ]]; then
|
||
echo -e "${RED}${FAILED_IPS}${RESET}"
|
||
else
|
||
echo "Нет неудачных попыток за 24 часа."
|
||
fi
|
||
|
||
echo -e "\n${BLUE}--- Успешные входы за 24ч (IP: раз) ---${RESET}"
|
||
if [[ -n "$SUCCESS_IPS" ]]; then
|
||
echo -e "${GREEN}${SUCCESS_IPS}${RESET}"
|
||
else
|
||
echo "Нет успешных входов за 24 часа."
|
||
fi
|
||
|
||
if [[ -n "$SSH_CONNECTION" ]]; then
|
||
CURRENT_IP=$(echo $SSH_CONNECTION | awk '{print $1}')
|
||
echo -e "\n${GREEN}Вы успешно вошли как ${USER} с IP: ${CURRENT_IP}${RESET}"
|
||
else
|
||
echo -e "\n${GREEN}Вы успешно вошли как ${USER} (Локальный вход)${RESET}"
|
||
fi
|
||
echo -e "${BLUE}=============================================${RESET}"
|
||
|
||
EOF
|
||
|
||
chmod +x "$TARGET_PATH"
|
||
|
||
echo "===> Скрипт MOTD установлен сюда: $TARGET_PATH"
|
||
echo "===> Пробуем пример вывода:"
|
||
bash "$TARGET_PATH" |