Files
for-servers/server/motd-info.sh

117 lines
4.3 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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"
RESET="\033[0m"
# ----------------------------
# Системная статистика
# ----------------------------
# Память: занято/всего и %
MEM_USED=$(free -m | awk '/^Mem:/{print $3}')
MEM_TOTAL=$(free -m | awk '/^Mem:/{print $2}')
MEM_PERCENT=$(( MEM_USED * 100 / MEM_TOTAL ))
MEM_STAT="${MEM_USED}/${MEM_TOTAL} МБ (${MEM_PERCENT}%)"
# Нагрузка: проценты относительно всех ядер (Windows-стиль)
CPU_CORES=$(nproc)
read LOAD1 LOAD5 LOAD15 < /proc/loadavg
LOAD1P=$(( $(awk "BEGIN {printf \"%.0f\", $LOAD1/$CPU_CORES*100}") ))
LOAD5P=$(( $(awk "BEGIN {printf \"%.0f\", $LOAD5/$CPU_CORES*100}") ))
LOAD15P=$(( $(awk "BEGIN {printf \"%.0f\", $LOAD15/$CPU_CORES*100}") ))
LOAD_AVG="${LOAD1P}% ${LOAD5P}% ${LOAD15P}% (1мин 5мин 15мин)"
# CPU температура
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}')
# ----------------------------
# Логины за 24 часа
# ----------------------------
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)
# 1. Неудачные попытки
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 5 | awk '{printf "%s: %s\n", $2, $1}')
# 2. Успешные входы
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 5 | 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}"
echo -e "${YELLOW}Диск: ${GREEN}${DISK_STAT}${RESET}"
echo -e "${YELLOW}CPU: ${GREEN}${CPU_TEMP}${RESET}"
echo -e "\n${BLUE}--- Неудачные попытки за 24ч (IP: кол-во) ---${RESET}"
[[ -n "$FAILED_IPS" ]] && echo -e "${RED}${FAILED_IPS}${RESET}" || echo "Нет данных."
echo -e "\n${BLUE}--- Успешные входы за 24ч (IP: кол-во) ---${RESET}"
[[ -n "$SUCCESS_IPS" ]] && echo -e "${GREEN}${SUCCESS_IPS}${RESET}" || echo "Нет данных."
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"
bash "$TARGET_PATH"