🤖 Python-скрипт: Проверяем сроки действия SSL-сертификатов
Забыть продлить SSL — классический факап, после которого "лежит" прод. Давайте автоматизируем проверку.
Этот скрипт проверяет список доменов и пишет в Telegram, если сертификат истекает меньше чем через 7 дней.
Код (ssl_checker.py):
Как запустить:
* Получите токен у @BotFather.
* Вставьте свои домены.
* Добавьте в Systemd Timer (как мы учили в прошлом посте 😉) или в Cron на ежедневный запуск.
Теперь вы узнаете о просроченном сертификате раньше, чем ваши пользователи.
#python #ssl #automation #scripting #ai4admin
Забыть продлить SSL — классический факап, после которого "лежит" прод. Давайте автоматизируем проверку.
Этот скрипт проверяет список доменов и пишет в Telegram, если сертификат истекает меньше чем через 7 дней.
Код (ssl_checker.py):
import ssl
import socket
import datetime
import requests
# Настройки
DOMAINS = ['google.com', 'yoursite.ru']
TG_TOKEN = 'ВАШ_ТОКЕН_БОТА'
CHAT_ID = 'ВАШ_CHAT_ID'
DAYS_ALERT = 7
def send_tg(message):
url = f"https://api.telegram.org/bot{TG_TOKEN}/sendMessage"
requests.post(url, data={"chat_id": CHAT_ID, "text": message})
def check_ssl(domain):
context = ssl.create_default_context()
conn = context.wrap_socket(socket.socket(socket.AF_INET), server_hostname=domain)
conn.connect((domain, 443))
cert = conn.getpeercert()
expire_date = datetime.datetime.strptime(cert['notAfter'], r"%b %d %H:%M:%S %Y %Z")
days_left = (expire_date - datetime.datetime.now()).days
if days_left < DAYS_ALERT:
return f"⚠️ {domain}: осталось {days_left} дн!"
return None
report = []
for d in DOMAINS:
try:
res = check_ssl(d)
if res: report.append(res)
except Exception as e:
report.append(f"❌ Ошибка {d}: {str(e)}")
if report:
send_tg("\n".join(report))
Как запустить:
* Получите токен у @BotFather.
* Вставьте свои домены.
* Добавьте в Systemd Timer (как мы учили в прошлом посте 😉) или в Cron на ежедневный запуск.
Теперь вы узнаете о просроченном сертификате раньше, чем ваши пользователи.
#python #ssl #automation #scripting #ai4admin
🥴2
🕵️♂️ PowerShell: Кто ждет перезагрузки?
В контексте разговоров о патчах и Hotpatching, важно знать правду: действительно ли ваши серверы применили обновления? Часто сервер висит в статусе PendingReboot неделями, оставаясь уязвимым.
Скрипт проверяет 4 места в реестре, где Windows прячет флаг "хочу ребут".
Код:
📌 Задача: Добавьте этот чек в свой утренний мониторинг. Сервер, ожидающий перезагрузки — это не защищенный сервер.
#powershell #scripting #windowsupdate #automation #security
В контексте разговоров о патчах и Hotpatching, важно знать правду: действительно ли ваши серверы применили обновления? Часто сервер висит в статусе PendingReboot неделями, оставаясь уязвимым.
Скрипт проверяет 4 места в реестре, где Windows прячет флаг "хочу ребут".
Код:
function Get-PendingReboot {
param([string]$ComputerName = "localhost")
$HKLM = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $ComputerName)
# 1. Component Based Servicing
$CBS = $HKLM.OpenSubKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending')
# 2. Windows Update
$WU = $HKLM.OpenSubKey('SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired')
# 3. File Rename Operations
$SM = $HKLM.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager')
$Rename = $SM.GetValue('PendingFileRenameOperations')
# Итог
[PSCustomObject]@{
Computer = $ComputerName
CBSPending = [bool]$CBS
WUPending = [bool]$WU
FileRenamePending = [bool]$Rename
IS_REBOOT_REQUIRED = ([bool]$CBS -or [bool]$WU -or [bool]$Rename)
}
}
# Использование:
# Get-PendingReboot -ComputerName "SRV-AD01"
📌 Задача: Добавьте этот чек в свой утренний мониторинг. Сервер, ожидающий перезагрузки — это не защищенный сервер.
#powershell #scripting #windowsupdate #automation #security
🗑 Bash: Правильная ротация бэкапов
Сделать бэкап легко. Сложно сделать так, чтобы через полгода диск не забился старыми архивами. Многие пишут сложные скрипты на Python, но старый добрый find умеет это делать одной строкой.
Задача:
Оставить бэкапы за последние 7 дней.
Всё, что старше — удалить.
Скрипт (cleanup.sh):
🔥 Pro-Tip: Перед тем как ставить флаг -delete в cron, запустите команду без него (просто с -print), чтобы убедиться, что find нашел именно то, что вы хотите удалить. rm в Linux не прощает ошибок.
#linux #bash #backup #scripting #automation #чеклисты
Сделать бэкап легко. Сложно сделать так, чтобы через полгода диск не забился старыми архивами. Многие пишут сложные скрипты на Python, но старый добрый find умеет это делать одной строкой.
Задача:
Оставить бэкапы за последние 7 дней.
Всё, что старше — удалить.
Скрипт (cleanup.sh):
#!/bin/bash
BACKUP_DIR="/var/backups/db"
DAYS_TO_KEEP=7
# Проверяем, что директория существует (защита от дурака)
if [ -d "$BACKUP_DIR" ]; then
echo "🧹 Очистка старых бэкапов в $BACKUP_DIR..."
# Находим файлы старше N дней и удаляем
# -mtime +$DAYS_TO_KEEP -> старше дней
# -name "*.gz" -> только архивы (чтобы не удалить лишнее!)
# -delete -> удаляет без вопросов
find "$BACKUP_DIR" -type f -name "*.tar.gz" -mtime +$DAYS_TO_KEEP -print -delete
echo "✅ Готово."
else
echo "❌ Ошибка: Директория $BACKUP_DIR не найдена."
exit 1
fi
🔥 Pro-Tip: Перед тем как ставить флаг -delete в cron, запустите команду без него (просто с -print), чтобы убедиться, что find нашел именно то, что вы хотите удалить. rm в Linux не прощает ошибок.
#linux #bash #backup #scripting #automation #чеклисты
👍2
📋 PowerShell: Утренний репорт сервисов
В понедельник важно убедиться, что критические службы Active Directory и Exchange (или ваши бизнес-приложения) живы. Вместо того чтобы кликать по оснасткам services.msc, запускаем скрипт.
Скрипт проверяет статус и аптайм служб:
Если видите STOPPED или Uptime 0d 0h (значит, перезапускался утром) — это повод копнуть глубже.
#windows #powershell #monitoring #scripting #automation
В понедельник важно убедиться, что критические службы Active Directory и Exchange (или ваши бизнес-приложения) живы. Вместо того чтобы кликать по оснасткам services.msc, запускаем скрипт.
Скрипт проверяет статус и аптайм служб:
$Services = "DNS", "ADWS", "LanmanServer", "Spooler" # Добавьте свои
Get-Service -Name $Services | Select-Object Name, Status, @{
Name="Uptime";
Expression={
if ($_.Status -eq 'Running') {
# Получаем PID и время старта процесса
$proc = Get-CimInstance Win32_Process -Filter "ProcessId = $((Get-CimInstance Win32_Service -Filter "Name='$($_.Name)'").ProcessId)"
if ($proc) {
$span = New-TimeSpan -Start $proc.CreationDate -End (Get-Date)
"{0}d {1}h" -f $span.Days, $span.Hours
} else { "N/A" }
} else { "STOPPED" }
}
} | Format-Table -AutoSize
Если видите STOPPED или Uptime 0d 0h (значит, перезапускался утром) — это повод копнуть глубже.
#windows #powershell #monitoring #scripting #automation
👮♂️ PowerShell: Кто в админах?
Банальная, но критичная задача. Часто техподдержка дает права локального админа пользователю "на 5 минут, чтобы поставить программу", и забывает убрать. Через полгода у вас половина офиса — админы.
Скрипт для инвентаризации группы Administrators на удаленных ПК.
Код:
Что искать в отчете:
Доменных пользователей (кроме админов домена и техподдержки).
Левые локальные учетки.
Чистота прав доступа — залог спокойного сна.
#powershell #security #audit #windows #scripting
Банальная, но критичная задача. Часто техподдержка дает права локального админа пользователю "на 5 минут, чтобы поставить программу", и забывает убрать. Через полгода у вас половина офиса — админы.
Скрипт для инвентаризации группы Administrators на удаленных ПК.
Код:
$Computers = Get-Content "C:\servers.txt" # Или список из AD
foreach ($PC in $Computers) {
Try {
$Admins = Invoke-Command -ComputerName $PC -ScriptBlock {
Get-LocalGroupMember -Group "Administrators" |
Select-Object -ExpandProperty Name
} -ErrorAction Stop
[PSCustomObject]@{
Server = $PC
LocalAdmins = ($Admins -join ", ")
}
} Catch {
Write-Warning "Не удалось подключиться к $PC"
}
}
Что искать в отчете:
Доменных пользователей (кроме админов домена и техподдержки).
Левые локальные учетки.
Чистота прав доступа — залог спокойного сна.
#powershell #security #audit #windows #scripting
🔥2
🔔 Bash: Уведомление в Telegram при входе по SSH
Хотите знать, если кто-то (или вы сами) зашел на критический сервер? Простой скрипт, который отправляет алерт в Telegram при каждой успешной SSH-сессии.
1. Создаем скрипт /usr/local/bin/ssh-alert.sh:
Не забудьте: chmod +x /usr/local/bin/ssh-alert.sh
2. Добавляем в глобальный профиль: Открываем /etc/profile (сработает для всех юзеров) и добавляем в конец:
Теперь, если кто-то подберет пароль или украдет ключ — вы узнаете об этом первым (и успеете дернуть рубильник).
#linux #security #ssh #telegram #scripting #monitoring
Хотите знать, если кто-то (или вы сами) зашел на критический сервер? Простой скрипт, который отправляет алерт в Telegram при каждой успешной SSH-сессии.
1. Создаем скрипт /usr/local/bin/ssh-alert.sh:
#!/bin/bash
TOKEN="ВАШ_БОТ_ТОКЕН"
CHAT_ID="ВАШ_ID"
URL="https://api.telegram.org/bot$TOKEN/sendMessage"
MSG="🚨 SSH Login: $USER from $SSH_CLIENT on $(hostname) at $(date)"
curl -s -X POST $URL -d chat_id=$CHAT_ID -d text="$MSG" > /dev/null
Не забудьте: chmod +x /usr/local/bin/ssh-alert.sh
2. Добавляем в глобальный профиль: Открываем /etc/profile (сработает для всех юзеров) и добавляем в конец:
/usr/local/bin/ssh-alert.sh
Теперь, если кто-то подберет пароль или украдет ключ — вы узнаете об этом первым (и успеете дернуть рубильник).
#linux #security #ssh #telegram #scripting #monitoring
👍1
🎅 PowerShell: Спасаем пользователей от блокировки в Новый год
Декабрь. Пользователи уходят в отпуск на 2-3 недели. Сценарий фильма ужасов: у сотрудника истекает пароль 3 января. Он пытается подключиться к VPN/почте из дома, получает ошибку «Password Expired» и звонит вам в праздники.
Давайте найдем всех, у кого пароль протухнет в ближайшие 30 дней, и предупредим их.
Скрипт:
Запустите сегодня. Это спасет ваши новогодние каникулы.
#powershell #activedirectory #scripting #automation #newyear
Декабрь. Пользователи уходят в отпуск на 2-3 недели. Сценарий фильма ужасов: у сотрудника истекает пароль 3 января. Он пытается подключиться к VPN/почте из дома, получает ошибку «Password Expired» и звонит вам в праздники.
Давайте найдем всех, у кого пароль протухнет в ближайшие 30 дней, и предупредим их.
Скрипт:
$DaysToWarn = 30
$Users = Get-ADUser -Filter {Enabled -eq $True -and PasswordNeverExpires -eq $False} -Properties msDS-UserPasswordExpiryTimeComputed, EmailAddress
foreach ($User in $Users) {
$ExpiryDate = [datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed")
$DaysLeft = ($ExpiryDate - (Get-Date)).Days
if ($DaysLeft -ge 0 -and $DaysLeft -lt $DaysToWarn) {
Write-Host "⚠️ $($User.Name): Пароль истекает через $DaysLeft дн. ($ExpiryDate)" -ForegroundColor Yellow
# Тут можно раскомментировать отправку письма
# Send-MailMessage -To $User.EmailAddress -Subject "Смените пароль!" ...
}
}
Запустите сегодня. Это спасет ваши новогодние каникулы.
#powershell #activedirectory #scripting #automation #newyear
🚀 PowerShell: Ускоряем чтение логов в 100 раз (XPath)
Задача: Найти в Event Log событие блокировки пользователя (ID 4740) за последний час. Обычный админ пишет так:
Проблема: PowerShell сначала выкачивает ВСЕ миллион событий из журнала к себе в память, и только потом отсеивает нужные. Это вешает сервер.
Сеньор использует Server-side filtering (XPath):
Результат: Вместо 2 минут команда отрабатывает за 0.3 секунды. Фильтруйте данные на источнике, а не в пайплайне.
#powershell #windows #performance #scripting #optimization #xml
Задача: Найти в Event Log событие блокировки пользователя (ID 4740) за последний час. Обычный админ пишет так:
# 🐢 Медленно (Client-side filtering)
Get-WinEvent -LogName Security |
Where-Object { $_.Id -eq 4740 -and $_.TimeCreated -gt (Get-Date).AddHours(-1) }
Проблема: PowerShell сначала выкачивает ВСЕ миллион событий из журнала к себе в память, и только потом отсеивает нужные. Это вешает сервер.
Сеньор использует Server-side filtering (XPath):
# 🐇 Быстро (Фильтрация на уровне движка Windows)
$XML = "*[System[(EventID=4740) and TimeCreated[timediff(@SystemTime) <= 3600000]]]"
Get-WinEvent -LogName Security -FilterXPath $XML
Результат: Вместо 2 минут команда отрабатывает за 0.3 секунды. Фильтруйте данные на источнике, а не в пайплайне.
#powershell #windows #performance #scripting #optimization #xml
💣 Bash: Защита от «Ой, я запустил это на Проде»
У вас есть скрипт cleanup.sh или reset-db.sh. Однажды вы, уставший, случайно запустите его не на тестовом сервере, а на srv-prod-01.
Добавьте этот Safety Check в начало любого опасного скрипта. Он спасет вам карьеру.
Этот простой if заставляет мозг проснуться перед тем, как нажать Enter.
#bash #scripting #safety #production #failsafe #devops
У вас есть скрипт cleanup.sh или reset-db.sh. Однажды вы, уставший, случайно запустите его не на тестовом сервере, а на srv-prod-01.
Добавьте этот Safety Check в начало любого опасного скрипта. Он спасет вам карьеру.
#!/bin/bash
# 1. Получаем имя хоста
CURRENT_HOST=$(hostname)
# 2. Проверяем, есть ли "prod" в имени
if [[ "$CURRENT_HOST" == *"prod"* ]]; then
echo "⚠️ ВНИМАНИЕ! Вы запускаете опасный скрипт на ПРОДАКШЕНЕ ($CURRENT_HOST)!"
echo "Введите 'YES', чтобы продолжить, или что угодно для отмены:"
read -r CONFIRM
if [ "$CONFIRM" != "YES" ]; then
echo "❌ Отмена операции."
exit 1
fi
fi
echo "🚀 Поехали..."
# Дальше идет ваша логика
Этот простой if заставляет мозг проснуться перед тем, как нажать Enter.
#bash #scripting #safety #production #failsafe #devops
🧹 PowerShell: Чистим AD от "мертвых" компьютеров
Конец года — лучшее время для инвентаризации. В Active Directory часто копятся записи компьютеров, которые уже год как на свалке. Это дыра в безопасности и мусор в отчетах.
Найдем компьютеры, которые не входили в сеть более 180 дней.
Нюанс: Мы используем свойство LastLogonDate. Оно реплицируется между контроллерами (в отличие от LastLogon), но с задержкой в 14 дней. Для поиска "старья" (180+ дней) эта погрешность неважна.
Скрипт:
Задача: Запустите в режиме "только чтение". Вы удивитесь, сколько у вас в домене машин с Windows 7, которых физически уже не существует.
#windows #activedirectory #powershell #cleanup #security #scripting
Конец года — лучшее время для инвентаризации. В Active Directory часто копятся записи компьютеров, которые уже год как на свалке. Это дыра в безопасности и мусор в отчетах.
Найдем компьютеры, которые не входили в сеть более 180 дней.
Нюанс: Мы используем свойство LastLogonDate. Оно реплицируется между контроллерами (в отличие от LastLogon), но с задержкой в 14 дней. Для поиска "старья" (180+ дней) эта погрешность неважна.
Скрипт:
$DaysInactive = 180
$TimeLimit = (Get-Date).AddDays(-$DaysInactive)
Get-ADComputer -Filter {LastLogonDate -lt $TimeLimit -and Enabled -eq $true} -Properties LastLogonDate, OperatingSystem |
Select-Object Name, LastLogonDate, OperatingSystem |
Sort-Object LastLogonDate |
Format-Table -AutoSize
# Хотите сразу отключить их? Раскомментируйте:
# | Disable-ADAccount -WhatIf
Задача: Запустите в режиме "только чтение". Вы удивитесь, сколько у вас в домене машин с Windows 7, которых физически уже не существует.
#windows #activedirectory #powershell #cleanup #security #scripting
👍3
🗣 PowerShell: Заставь сервер поздравить тебя голосом
В Windows встроен мощный движок синтеза речи (TTS), который доступен из консоли без установки стороннего софта. Разыграйте коллегу или просто поднимите себе настроение, заставив сервер произнести тост.
Скрипт (копируй и вставляй):
Идея: Добавьте это в Login Script через GPO. Утром 1 января первый вошедший админ услышит голос сервера. 😈
#windows #powershell #fun #tts #scripting #adminlife
В Windows встроен мощный движок синтеза речи (TTS), который доступен из консоли без установки стороннего софта. Разыграйте коллегу или просто поднимите себе настроение, заставив сервер произнести тост.
Скрипт (копируй и вставляй):
# Подключаем сборку речи
Add-Type -AssemblyName System.Speech
# Создаем объект синтезатора
$synth = New-Object System.Speech.Synthesis.SpeechSynthesizer
# Настраиваем громкость (0-100)
$synth.Volume = 100
# Говорим! (На английском говорит отлично, на русском - зависит от установленных языковых пакетов)
$synth.Speak("Merry Christmas, Administrator. All systems are operational.")
Идея: Добавьте это в Login Script через GPO. Утром 1 января первый вошедший админ услышит голос сервера. 😈
#windows #powershell #fun #tts #scripting #adminlife
💾 PowerShell: Удаленная инвентаризация (Серийники)
Нужно собрать серийные номера серверов или ПК для гарантии/учета. Идти в серверную или просить пользователей лезть под стол не нужно. Используем CIM (современный аналог WMI).
Скрипт (сбор данных со списка компьютеров):
Pro Tip: Если нужно узнать модель материнской платы, поменяйте класс на
#windows #powershell #inventory #cim #scripting
Нужно собрать серийные номера серверов или ПК для гарантии/учета. Идти в серверную или просить пользователей лезть под стол не нужно. Используем CIM (современный аналог WMI).
Скрипт (сбор данных со списка компьютеров):
$Computers = "Server01", "Server02", "PC-Office-05"
foreach ($PC in $Computers) {
try {
$Bios = Get-CimInstance -ClassName Win32_Bios -ComputerName $PC -ErrorAction Stop
[PSCustomObject]@{
ComputerName = $PC
Serial = $Bios.SerialNumber
Manufacturer = $Bios.Manufacturer
Version = $Bios.SMBIOSBIOSVersion
}
} catch {
Write-Warning "Не удалось подключиться к $PC"
}
}
Pro Tip: Если нужно узнать модель материнской платы, поменяйте класс на
Win32_BaseBoard и запросите свойство Product .#windows #powershell #inventory #cim #scripting
🔄 PowerShell: Требует ли сервер перезагрузки?
Вы установили обновления или поменяли настройки, но не уверены, применились ли они.
Или планируете Maintenance Window и хотите знать, какие серверы нуждаются в рестарте. Windows прячет флаг "Pending Reboot" в реестре.
Простой скрипт, чтобы проверить это без GUI.
Команда:
Pro Tip: Оберните это в Invoke-Command -ComputerName (Get-Content servers.txt), чтобы проверить сразу всю инфраструктуру перед уходом на каникулы.
#windows #powershell #updates #maintenance #scripting #adminlife
Вы установили обновления или поменяли настройки, но не уверены, применились ли они.
Или планируете Maintenance Window и хотите знать, какие серверы нуждаются в рестарте. Windows прячет флаг "Pending Reboot" в реестре.
Простой скрипт, чтобы проверить это без GUI.
Команда:
$Reboot = Test-Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired"
$CBS = Test-Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending"
$Pending = $Reboot -or $CBS
if ($Pending) {
Write-Host "⚠️ ВНИМАНИЕ: Сервер ожидает перезагрузки!" -ForegroundColor Red
} else {
Write-Host "✅ Перезагрузка не требуется." -ForegroundColor Green
}
Pro Tip: Оберните это в Invoke-Command -ComputerName (Get-Content servers.txt), чтобы проверить сразу всю инфраструктуру перед уходом на каникулы.
#windows #powershell #updates #maintenance #scripting #adminlife
❤2
🪟 PowerShell: Краткая сводка происшествий за праздники
Листать Event Viewer за 10 дней выходных — это боль. Вам нужно знать только одно: были ли критические ошибки?
Скрипт, который покажет только "Красные" события (Errors & Critical) за время праздников, сгруппированные по источникам.
Команда:
Результат: Вы увидите таблицу вроде:
* Disk — 5 ошибок (Стоит проверить RAID!)
* TermService — 1 ошибка (Ерунда)
Экономит часы кликанья мышкой.
#windows #powershell #eventlog #audit #monitoring #scripting
Листать Event Viewer за 10 дней выходных — это боль. Вам нужно знать только одно: были ли критические ошибки?
Скрипт, который покажет только "Красные" события (Errors & Critical) за время праздников, сгруппированные по источникам.
Команда:
# Проверяем последние 7 дней
$Date = (Get-Date).AddDays(-7)
Get-WinEvent -FilterHashtable @{LogName='System'; Level=1,2; StartTime=$Date} -ErrorAction SilentlyContinue |
Group-Object ProviderName |
Select-Object Count, Name |
Sort-Object Count -Descending |
Format-Table -AutoSize
Результат: Вы увидите таблицу вроде:
* Disk — 5 ошибок (Стоит проверить RAID!)
* TermService — 1 ошибка (Ерунда)
Экономит часы кликанья мышкой.
#windows #powershell #eventlog #audit #monitoring #scripting
⏱️ PowerShell: Сколько сервер не перезагружался?
Босс спрашивает: "Когда последний раз патчили Exchange?" или "Почему сервер тормозит, может память утекла за месяц?". Заходить на каждый сервер по RDP, чтобы открыть диспетчер задач — это путь джуна.
Скрипт Архитектора, который покажет Uptime сразу по списку машин.
Скрипт:
Результат: SRV-DC01 : 45 дн. 12 ч. SRV-SQL01 : 0 дн. 4 ч.
Быстро, чисто, без лишних движений.
#windows #powershell #uptime #monitoring #scripting #adminlife
Босс спрашивает: "Когда последний раз патчили Exchange?" или "Почему сервер тормозит, может память утекла за месяц?". Заходить на каждый сервер по RDP, чтобы открыть диспетчер задач — это путь джуна.
Скрипт Архитектора, который покажет Uptime сразу по списку машин.
Скрипт:
$Servers = "SRV-DC01", "SRV-SQL01", "PC-Admin"
foreach ($S in $Servers) {
$OS = Get-CimInstance Win32_OperatingSystem -ComputerName $S -ErrorAction SilentlyContinue
if ($OS) {
$Uptime = (Get-Date) - $OS.LastBootUpTime
Write-Host "$S : $($Uptime.Days) дн. $($Uptime.Hours) ч." -ForegroundColor Green
} else {
Write-Host "$S : Недоступен" -ForegroundColor Red
}
}
Результат: SRV-DC01 : 45 дн. 12 ч. SRV-SQL01 : 0 дн. 4 ч.
Быстро, чисто, без лишних движений.
#windows #powershell #uptime #monitoring #scripting #adminlife
🐚 Bash: Шаблон «Пуленепробиваемого» скрипта
90% админских скриптов падают молча.
Например, cd /wrong/path не сработал, а следующая команда rm -rf * удалила всё в корне (утрирую, но суть ясна). В 2026 году мы используем Bash Strict Mode и Traps.
Код для начала любого скрипта:
Разбор магии:
1. set -e: Скрипт умрет сразу, если любая команда вернет ошибку.
2. set -u: Запрещает использовать пустые переменные (спасает от rm -rf /$UNDEFINED_VAR).
3. set -o pipefail: Ловит ошибки даже в середине конвейера (grep | awk).
4. trap: Гарантированно выполнит функцию cleanup, даже если скрипт упадет с ошибкой.
Это база. Не пишите в прод без этого хедера.
#linux #bash #scripting #devops #bestpractices #automation
90% админских скриптов падают молча.
Например, cd /wrong/path не сработал, а следующая команда rm -rf * удалила всё в корне (утрирую, но суть ясна). В 2026 году мы используем Bash Strict Mode и Traps.
Код для начала любого скрипта:
#!/bin/bash
set -euo pipefail
IFS=$'\n\t'
# Функция очистки при выходе (даже аварийном)
cleanup() {
echo "🧹 Убираем мусор..."
rm -f /tmp/temp_*.txt
}
# Trap ловит сигналы выхода (EXIT, ошибка, Ctrl+C)
trap cleanup EXIT
echo "🚀 Начинаем работу..."
# Ваш код
Разбор магии:
1. set -e: Скрипт умрет сразу, если любая команда вернет ошибку.
2. set -u: Запрещает использовать пустые переменные (спасает от rm -rf /$UNDEFINED_VAR).
3. set -o pipefail: Ловит ошибки даже в середине конвейера (grep | awk).
4. trap: Гарантированно выполнит функцию cleanup, даже если скрипт упадет с ошибкой.
Это база. Не пишите в прод без этого хедера.
#linux #bash #scripting #devops #bestpractices #automation
⚡ PowerShell: Настоящая многопоточность с -Parallel
В старых версиях PowerShell (5.1) мы страдали с Start-Job (медленно) или Runspaces (сложно).
В PowerShell 7+ (который к 2026 году должен стоять везде) циклы ускоряются в 10-50 раз одной опцией.
Задача: Пингaнуть 100 серверов или проверить службу.
Обычный foreach будет делать это последовательно 5 минут.
Решение 2026 года:
Фишка: Параметр -ThrottleLimit регулирует нагрузку на вашу машину.
Это самый простой способ ускорить рутину админа.
#windows #powershell #scripting #performance #automation #sysadmin
В старых версиях PowerShell (5.1) мы страдали с Start-Job (медленно) или Runspaces (сложно).
В PowerShell 7+ (который к 2026 году должен стоять везде) циклы ускоряются в 10-50 раз одной опцией.
Задача: Пингaнуть 100 серверов или проверить службу.
Обычный foreach будет делать это последовательно 5 минут.
Решение 2026 года:
$servers = 1..100 | ForEach-Object { "Server-$_" }
# Запускаем в 10 потоков одновременно
$results = $servers | ForEach-Object -Parallel {
# Внутри этого блока - отдельный поток
$s = $_
$check = Test-NetConnection -ComputerName $s -Port 443 -WarningAction SilentlyContinue
# Возвращаем объект (а не текст!)
[PSCustomObject]@{
Server = $s
Port443 = $check.TcpTestSucceeded
Time = (Get-Date).ToString("HH:mm:ss")
}
} -ThrottleLimit 10
# Красивый вывод
$results | Format-Table -AutoSize
Фишка: Параметр -ThrottleLimit регулирует нагрузку на вашу машину.
Это самый простой способ ускорить рутину админа.
#windows #powershell #scripting #performance #automation #sysadmin
🐧 Bash: Параллельный запуск задач без боли и GNU Parallel
Многие админы не знают, что для параллельного выполнения задач в скриптах не обязательно ставить тяжелые утилиты. В Bash есть встроенный механизм управления фоновыми процессами через wait. Это маст-хэв, когда нужно, например, одновременно проверить доступность 50 хостов или сжать 20 папок с логами. 📦
Пример «умного» скрипта:
Почему это OK:
1. Скорость: Скрипт выполняется за время самого долгого пинга, а не по очереди.
2. Простота: Никаких лишних зависимостей.
3. Контроль: Команда wait гарантирует, что скрипт не пойдет дальше, пока все «хвосты» не закроются.
#linux #bash #automation #sysadmin #performance #scripting 🛠️
Многие админы не знают, что для параллельного выполнения задач в скриптах не обязательно ставить тяжелые утилиты. В Bash есть встроенный механизм управления фоновыми процессами через wait. Это маст-хэв, когда нужно, например, одновременно проверить доступность 50 хостов или сжать 20 папок с логами. 📦
Пример «умного» скрипта:
#!/bin/bash
targets=("192.168.1.1" "192.168.1.2" "192.168.1.3") # и так далее
for ip in "${targets[@]}"; do
(
if ping -c 1 -W 1 "$ip" > /dev/null; then
echo "✅ $ip доступен"
else
echo "❌ $ip лежит"
fi
) & # Запуск в фоне
done
wait # Ждем завершения всех фоновых задач
echo "🎯 Все проверки завершены!"
Почему это OK:
1. Скорость: Скрипт выполняется за время самого долгого пинга, а не по очереди.
2. Простота: Никаких лишних зависимостей.
3. Контроль: Команда wait гарантирует, что скрипт не пойдет дальше, пока все «хвосты» не закроются.
#linux #bash #automation #sysadmin #performance #scripting 🛠️
🪟 Windows: Операторы && и || в PowerShell 7 — наконец-то как в Bash! ⛓️
Если ты перешел на PowerShell 7+ (а в 2026-м это стандарт), перестань писать громоздкие конструкции if ($?) { ... }. Теперь у нас есть Pipeline Chain Operators, которые работают так же, как в Linux.
Было (старый стиль):
Стало (Admin Future стиль):
Почему это важно: Скрипты становятся читаемыми в одну строку. Это идеально для быстрых фиксов и админских задач "на лету". ⚡
#windows #powershell #scripting #devops #automation #sysadmin #pwsh
Если ты перешел на PowerShell 7+ (а в 2026-м это стандарт), перестань писать громоздкие конструкции if ($?) { ... }. Теперь у нас есть Pipeline Chain Operators, которые работают так же, как в Linux.
Было (старый стиль):
Stop-Service "Spooler"
if ($?) { Start-Service "Spooler" }
Стало (Admin Future стиль):
# Выполнится ТОЛЬКО если первая команда успешна
Stop-Service "Spooler" && Start-Service "Spooler"
# Выполнится, если первая команда УПАЛА (обработка ошибок)
Connect-MgGraph || Write-Warning "Не удалось подключиться к облаку!"
Почему это важно: Скрипты становятся читаемыми в одну строку. Это идеально для быстрых фиксов и админских задач "на лету". ⚡
#windows #powershell #scripting #devops #automation #sysadmin #pwsh
👍1🔥1👏1
🪟 Windows: История команд PowerShell — твой личный бортовой самописец 📝
Ты когда-нибудь тратил полчаса на то, чтобы вспомнить ту самую сложную команду с 5-ю фильтрами, которую писал месяц назад?
В PowerShell 7+ есть модуль PSReadLine, который хранит историю всех твоих команд в текстовом файле.
Как найти, где лежит твоя история:
Совет: Чтобы история сохранялась между сессиями и была бесконечной, добавь в
#windows #powershell #productivity #sysadmin #scripting #terminal #tips
Ты когда-нибудь тратил полчаса на то, чтобы вспомнить ту самую сложную команду с 5-ю фильтрами, которую писал месяц назад?
В PowerShell 7+ есть модуль PSReadLine, который хранит историю всех твоих команд в текстовом файле.
Как найти, где лежит твоя история:
(Get-PSReadLineOption).HistorySavePath
Лайфхак: поиск по истории как в Bash (Ctrl+R):
Нажми Ctrl+R в терминале и начни вводить часть команды — PowerShell сам найдет её в истории.
Совет: Чтобы история сохранялась между сессиями и была бесконечной, добавь в
$PROFILE: Set-PSReadLineOption -HistorySaveStyle SaveIncrementally
#windows #powershell #productivity #sysadmin #scripting #terminal #tips
🔥3👍1👏1