Обновить server/motd-info.sh
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# Скрипт установки кастомного sysinfo MOTD со статистикой логинов
|
# Скрипт установки кастомного sysinfo MOTD со статистикой логинов и ключей
|
||||||
|
|
||||||
TARGET_PATH="/etc/update-motd.d/zzzzz-motd-sysinfo"
|
TARGET_PATH="/etc/update-motd.d/zzzzz-motd-sysinfo"
|
||||||
|
|
||||||
@@ -14,6 +14,7 @@ BLUE="\033[1;34m"
|
|||||||
CYAN="\033[0;36m"
|
CYAN="\033[0;36m"
|
||||||
RESET="\033[0m"
|
RESET="\033[0m"
|
||||||
|
|
||||||
|
# Системная статистика
|
||||||
MEM_STAT=$(free -m | awk '/^Mem:/{printf "%.1f/%.1f МБ", $3, $2}')
|
MEM_STAT=$(free -m | awk '/^Mem:/{printf "%.1f/%.1f МБ", $3, $2}')
|
||||||
LOAD_AVG=$(awk '{print $1 " " $2 " " $3}' /proc/loadavg)
|
LOAD_AVG=$(awk '{print $1 " " $2 " " $3}' /proc/loadavg)
|
||||||
if command -v sensors &>/dev/null && sensors | grep -iP "Core|temp1" >/dev/null; then
|
if command -v sensors &>/dev/null && sensors | grep -iP "Core|temp1" >/dev/null; then
|
||||||
@@ -26,7 +27,7 @@ else
|
|||||||
fi
|
fi
|
||||||
DISK_STAT=$(df -h / | awk 'NR==2{printf "%s/%s (свободно/всего)", $4, $2}')
|
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")
|
DATE_24H_AGO=$(LC_TIME=C date --date="24 hours ago" "+%b %-d")
|
||||||
CURRENT_DATE=$(LC_TIME=C date "+%b %-d")
|
CURRENT_DATE=$(LC_TIME=C date "+%b %-d")
|
||||||
HOUR_24H_AGO=$(date --date="24 hours ago" "+%H")
|
HOUR_24H_AGO=$(date --date="24 hours ago" "+%H")
|
||||||
@@ -63,28 +64,37 @@ get_recent_logs() {
|
|||||||
|
|
||||||
RECENT_LOG=$(get_recent_logs)
|
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}')
|
# 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}')
|
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}')
|
||||||
|
|
||||||
|
# 3. Входы по ключам (Publickey)
|
||||||
|
KEY_LOGINS=$(echo "$RECENT_LOG" | grep "Accepted publickey" | awk '{
|
||||||
|
user="?"; ip="?"; key="?";
|
||||||
|
for(i=1;i<NF;i++) {
|
||||||
|
if($i=="for") user=$(i+1);
|
||||||
|
if($i=="from") ip=$(i+1);
|
||||||
|
if($i=="ssh2:") key=$(i+1);
|
||||||
|
}
|
||||||
|
print user " [" ip "] " key
|
||||||
|
}' | sort | uniq -c | sort -nr | head -n 5 | awk '{$1=$1; print $0 " раз(а)"}')
|
||||||
|
|
||||||
echo -e "\n\n${BLUE}============ Состояние сервера ============${RESET}"
|
echo -e "\n\n${BLUE}============ Состояние сервера ============${RESET}"
|
||||||
echo -e "${YELLOW}ОЗУ: ${GREEN}${MEM_STAT}${RESET}"
|
echo -e "${YELLOW}ОЗУ: ${GREEN}${MEM_STAT}${RESET}"
|
||||||
echo -e "${YELLOW}Нагрузка: ${GREEN}${LOAD_AVG}${RESET} (1/5/15 мин)"
|
echo -e "${YELLOW}Нагрузка: ${GREEN}${LOAD_AVG}${RESET}"
|
||||||
echo -e "${YELLOW}Диск: ${GREEN}${DISK_STAT}${RESET}"
|
echo -e "${YELLOW}Диск: ${GREEN}${DISK_STAT}${RESET}"
|
||||||
echo -e "${YELLOW}CPU: ${GREEN}${CPU_TEMP}${RESET}"
|
echo -e "${YELLOW}CPU: ${GREEN}${CPU_TEMP}${RESET}"
|
||||||
|
|
||||||
echo -e "\n${BLUE}--- Неудачные попытки входа за 24ч (IP: попытки) ---${RESET}"
|
echo -e "\n${BLUE}--- Неудачные попытки за 24ч (IP: кол-во) ---${RESET}"
|
||||||
if [[ -n "$FAILED_IPS" ]]; then
|
[[ -n "$FAILED_IPS" ]] && echo -e "${RED}${FAILED_IPS}${RESET}" || echo "Нет данных."
|
||||||
echo -e "${RED}${FAILED_IPS}${RESET}"
|
|
||||||
else
|
|
||||||
echo "Нет неудачных попыток за 24 часа."
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo -e "\n${BLUE}--- Успешные входы за 24ч (IP: раз) ---${RESET}"
|
echo -e "\n${BLUE}--- Успешные входы за 24ч (IP: кол-во) ---${RESET}"
|
||||||
if [[ -n "$SUCCESS_IPS" ]]; then
|
[[ -n "$SUCCESS_IPS" ]] && echo -e "${GREEN}${SUCCESS_IPS}${RESET}" || echo "Нет данных."
|
||||||
echo -e "${GREEN}${SUCCESS_IPS}${RESET}"
|
|
||||||
else
|
echo -e "\n${BLUE}--- Детали входа по КЛЮЧАМ (User [IP] Fingerprint) ---${RESET}"
|
||||||
echo "Нет успешных входов за 24 часа."
|
[[ -n "$KEY_LOGINS" ]] && echo -e "${CYAN}${KEY_LOGINS}${RESET}" || echo "Входов по ключам не зафиксировано."
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -n "$SSH_CONNECTION" ]]; then
|
if [[ -n "$SSH_CONNECTION" ]]; then
|
||||||
CURRENT_IP=$(echo $SSH_CONNECTION | awk '{print $1}')
|
CURRENT_IP=$(echo $SSH_CONNECTION | awk '{print $1}')
|
||||||
@@ -98,6 +108,5 @@ EOF
|
|||||||
|
|
||||||
chmod +x "$TARGET_PATH"
|
chmod +x "$TARGET_PATH"
|
||||||
|
|
||||||
echo "===> Скрипт MOTD установлен сюда: $TARGET_PATH"
|
echo "===> Скрипт MOTD обновлен: $TARGET_PATH"
|
||||||
echo "===> Пробуем пример вывода:"
|
|
||||||
bash "$TARGET_PATH"
|
bash "$TARGET_PATH"
|
||||||
Reference in New Issue
Block a user