Helcode | Хелкод | Скрипты и автоматизация
993 subscribers
52 photos
34 links
☎️ Контакты для связи: @helcodeadm
Download Telegram
ForEach vs. ForEach-Object: раскладываем по полочкам скорость и применение!

В PowerShell есть два основных способа перебора коллекций, и выбор между ними — это не просто вопрос стиля, а вопрос эффективности и правильного применения. Непонимание разницы может привести к значительному замедлению скриптов, особенно при работе с большими объемами данных.

Давайте разберем два главных участника гонки.

1. ForEach (оператор языка)
Это оператор языка PowerShell. Он работает *быстрее*, но загружает всю коллекцию в память *до начала* обработки.

# Синтаксис оператора ForEach
$result = foreach ($item in $largeCollection) {
# Обработка каждого элемента
$item * 2
}


Плюсы:
- Высокая скорость выполнения. Идеален для операций в памяти.
- Удобочитаемость. Легко читается и понимается.

⛔️ Минусы:
- Потребляет больше памяти. Вся коллекция должна поместиться в оперативной памяти.

2. ForEach-Object (cmdlet в конвейере)
Это cmdlet, который чаще всего используют в конвейере (с символом |). Он обрабатывает элементы *по одному*, что экономит память.

# Синтаксис cmdlet ForEach-Object в конвейере
$result = $largeCollection | ForEach-Object -Process {
# Обработка каждого элемента
$_ * 2
}


Плюсы:
- Экономия памяти. Обрабатывает элементы потоком, не загружая все сразу. Критично для больших данных.
- Интеграция с конвейером. Можно легко встраивать в цепочки обработки.

⛔️ Минусы:
- Относительно медленнее. Из-за накладных расходов на передачу объектов по конвейеру.

🧑‍⚖️ Вердикт:
- Скорость и маленькие коллекции? Выбирайте оператор foreach.
- Большие файлы, результаты командлетов или экономия памяти? Выбирайте ForEach-Object в конвейере.

Наглядный тест:
$testData = 1..10000

Measure-Command { $r1 = foreach ($i in $testData) { $i * 2 } } | Select-Object TotalMilliseconds
Measure-Command { $r2 = $testData | ForEach-Object { $_ * 2 } } | Select-Object TotalMilliseconds

Результаты покажут, что foreach оператор заметно быстрее на таких операциях.

А вы замечали разницу в скорости? Какой метод используете чаще?

1. foreach (оператор) — скорость важнее!
2. ForEach-Object (конвейер) — привычка и удобство конвейера
3. Зависит от ситуации — использую оба, в зависимости от задачи

4. .ForEach({}) метод — есть же еще и третий вариант!

P.S. Есть еще и третий, менее известный способ — метод .ForEach({}) у коллекций. Он быстрее конвейера, но медленнее оператора. Но это уже тема для отдельного поста!


🌐 @helcode | #powershell
2👍1🤔1
3 простых скрипта для автоматизации

1. Мониторинг доступности сайта (Python)
if requests.get("https://example.com").status_code != 200:  
print("Сайт лежит!")



2. Парсинг логов Nginx + алерты в Telegram (Bash)
grep "error" /var/log/nginx/error.log | tail -n 5 | curl -X POST в Telegram...  



3. Автоочистка диска
if [ $(df -h / | awk 'NR==2 {print $5}' | tr -d '%') -ge 90 ]; then  
find /var/log -name "*.log" -mtime +7 -delete
fi



👉 Добавляем в cron — и мониторинг работает сам!

🌐 @helcode | #python #bash #скрипты #автоматизация
👍31
Мониторим CPU и память — простые скрипты для Linux и Windows

🤔 Проблема: Сервер тормозит, но вы не знаете, в чём причина.

Решение: Скрипты для мониторинга нагрузки.

Linux (Bash + Python):
# Загрузка CPU  
top -bn1 | grep "Cpu(s)" | awk '{print "CPU: " 100 - $8 "%"}'


python  
# Загрузка памяти
import psutil
print(f"RAM: {psutil.virtual_memory().percent}%")



Windows (PowerShell):
powershell  
# CPU
Get-CimInstance Win32_Processor | Select LoadPercentage
# Память
Get-CimInstance Win32_OperatingSystem | Select FreePhysicalMemory, TotalVisibleMemorySize



👉 Добавьте алерты в Telegram — и вы всегда будете в курсе перегрузок!

🌐 @helcode | #bash #python #powershell
👍3
Скрипт упал в 3 часа ночи. Как он может сам отправить алерт в Slack или Telegram?

Запустили длинный скрипт на сервере и ушли спать? Автоматизация должна быть не только в выполнении задач, но и в оповещении о результатах. Вместо того чтобы постоянно проверять логи, научим ваши скрипты самим сообщать об успехах, ошибках или просто о завершении работы.

Отправка сообщений через популярные мессенджеры via API — это проще, чем кажется. Вот готовые рецепты.

1. Отправка в Slack через Incoming Webhook

Шаг 1: создаем входящий вебхук в вашем Slack-рабочем пространстве (Settings & administration -> Manage apps -> Incoming Webhooks).

Шаг 2: используем Invoke-RestMethod в PowerShell:

$Uri = "https://hooks.slack.com/services/your/unique/webhook/url" # Ваш URL вебхука
$Body = @{
text = " Скрипт `Backup-Database` успешно завершился на сервере $($env:COMPUTERNAME) в $(Get-Date)"
} | ConvertTo-Json

# Отправляем сообщение
Invoke-RestMethod -Uri $Uri -Method Post -Body $Body -ContentType 'application/json'


2. Отправка в Telegram через Bot API

Шаг 1: создаем бота через @BotFather и получаем его API-токен. Узнаем свой chat_id (можно написать боту, а затем вызвать https://api.telegram.org/bot<YOUR_TOKEN>/getUpdates).

Шаг 2: пишем скрипт для отправки:

$BotToken = "1234567890:Your_Bot_Token_Here"
$ChatID = "123456789" # Ваш chat_id

# Текст сообщения
$Message = "⚠️ Внимание! Скрипт `DataProcessing` на $($env:COMPUTERNAME) завершился с ОШИБКОЙ: $($Error[0].Exception.Message)"

# Формируем URL и отправляем запрос
$TelegramAPIUrl = "https://api.telegram.org/bot$BotToken/sendMessage"
$Body = @{
chat_id = $ChatID
text = $Message
disable_notification = $false
}

Invoke-RestMethod -Uri $TelegramAPIUrl -Method Post -Body $Body -ContentType 'application/x-www-form-urlencoded'


Оба способа используют REST API и встроенный командлет Invoke-RestMethod, который идеально подходит для таких задач. Главное — надежно храните токены и URL вебхуков (например, в переменных окружения или зашифрованных конфигах).

А куда вы отправляете алерты и мониторите выполнение задач?
1. Slack — мой лучший друг по оповещениям
2. Telegram — удобно все получать в телефон
3. Email — старый добрый
Send-MailMessage
4. Microsoft Teams — корпоративный стандарт
5. Другое (Grafana, PagerDuty, etc.) — мониторинг прокачан до предела


P.S. Настроив такие оповещения, вы сможете спокойно пить кофе (или спать), пока ваши скрипты сами докладывают о результатах своей работы. Это следующий уровень автоматизации!


🌐 @helcode | #powershell
👍3
А что если...? Мифы про автоматизацию мониторинга

Миф 1: "Автоматизация — это сложно и дорого".
➜ На самом деле: Bash/Python-скрипты пишутся за 10 минут и работают без лишних затрат.

Миф 2: "Готовые системы (Zabbix) всегда лучше".
➜ На деле: Для 1-5 серверов скрипты часто эффективнее.

Миф 3: "Скрипты ненадёжны".
➜ Реальность: Если их тестировать и добавлять в cron/systemd, они работают годами.

Миф 4: "Telegram-боты — это ненадёжно".
➜ Практика: Боты слабо зависят от инфраструктуры и приходят даже при частичных сбоях.

👉 Вывод: Не бойтесь начинать с малого — даже простые скрипты экономят часы работы!

🌐 @helcode | #миф #автоматизация
🔥4💯1
Почему Out-File и > могут подставить свинью с кодировкой?

Казалось бы, что может быть проще команды Get-Content file.txt | Out-File result.txt или dir > files.txt? Но потом вы открываете файл и видите вместо кириллицы кракозябры � или странные символы. В чем подвох? Всё дело в кодировке, которую PowerShell выбирает по умолчанию.

Проблема кроется в «умолчаниях». PowerShell (до 7-й версии) по умолчанию использует кодировку UTF-16LE (которая в мире Windows часто называется Unicode). Это широко распространенная кодировка, но у нее есть два больших минуса:
1. Она использует два байта на символ, что увеличивает размер файла.
2. Многие внешние инструменты (например, классический notepad.exe, системы Linux) ожидают увидеть кодировку UTF-8 или ASCII.

Пример проблемы:
# Записываем строку с кириллицей
"Привет, мир!" > test.txt

Откройте test.txt в Блокноте (Notepad) — вы увидите текст корректно. Но попробуйте посмотреть его в консоли Linux с помощью cat или обработать другим скриптом — высока вероятность увидеть проблемы.

Как это исправить? Явно указываем кодировку с помощью -Encoding.

1. Для максимальной совместимости (особенно с другими ОС и инструментами) используйте UTF-8:
"Привет, мир!" | Out-File -FilePath .\test.txt -Encoding utf8
# Или для PowerShell 7.2+, где есть UTF-8 без BOM (самый современный вариант):
"Привет, мир!" | Out-File -FilePath .\test.txt -Encoding utf8NoBOM


2. Если вам нужна обратная совместимость со старыми приложениями Windows (например, для файлов конфигурации .ini), используйте ASCII или UTF-8 с BOM:
Get-Process | Out-File proc_list.txt -Encoding ascii # Только англ. символы
Get-Service | Out-File services.txt -Encoding utf8 # UTF-8 с меткой (BOM)


3. Если вы работаете исключительно в среде Windows и вам нужна поддержка Unicode — тогда используйте стандартную кодировку:
# Тот самый вариант по умолчанию
Get-Content input.log | Out-File output.log -Encoding unicode


Метка (BOM) в начале файла помогает редакторам понять кодировку, но некоторые инструменты (например, скрипты на Linux) могут ее не понимать. Поэтому utf8NoBOM — это часто самый универсальный выбор для новых проектов.

А вы сталкивались с проблемами кодировки? Какую предпочитаете использовать?
1.
utf8NoBOM (современно и универсально)
2.
utf8 (с меткой, для уверенности в Windows)
3. ascii (только для английского текста)
4. Не заморачиваюсь, использую стандартную (пока не прижмет) 😅
5. Другая (поделитесь опытом в комментариях!)


P.S. Правильно выбранная кодировка — это как отправить письмо на языке, который адресат точно поймет. Out-File по умолчанию говорит на диалекте, который понимают не все. Всегда указывайте -Encoding для важных файлов!


🌐 @helcode | #powershell
👍3
"А если сервер упадёт?" — Мониторим сам мониторинг

🤔 Проблема: А кто следит за тем, чтобы сами скрипты мониторинга работали?

Решение: Простые проверки:

Проверка, что скрипт запущен (Bash):
if ! pgrep -f "monitor_script.sh"; then  
/path/to/monitor_script.sh &
echo "Скрипт упал и был перезапущен!" | send_to_telegram
fi



Логирование работы скрипта:
*/5 * * * * /path/to/script.sh >> /var/log/monitoring.log 2>&1  



Внешний "наблюдатель" (например, UptimeRobot):
➜ Бесплатно мониторит доступность сервера и шлёт SMS/email, если он не отвечает.

👉 Теперь ваш мониторинг действительно надёжен!

🌐 @helcode | #bash #логи #мониторинг
👍1
Принцип непрерывной автоматизации

⚙️ Автоматизация — это не «написал и забыл».

🛠 Как поддерживать систему:
1. Аудит раз в 3 месяца — что устарело?
2. Ротация секретов — API-ключи, пароли.
3. Изоляция — Docker, venv, чтобы скрипты не ломались после обновлений.

Пример ротации ключей:
OLD_KEY=$(vault read old-key)  
NEW_KEY=$(vault read new-key)
if curl -X POST -H "Key: $OLD_KEY" "https://api.example.com/rotate?new=$NEW_KEY"; then
vault write current-key "$NEW_KEY"
fi



Как часто вы рефакторите старые скрипты?


🌐 @helcode | #автоматизация #поддержка
2
Как автоматизация меняет мышление

🦾 После 50+ скриптов начинаешь видеть мир иначе:
1. Декомпозиция — любая задача = последовательность шагов.
2. Параноидальная проверка ошибок — «А что, если файла нет?»
3. Документирование всего — даже скрипт для кофеварки.

📈 Стадии роста:
*Страх* → *Копирование* → *Адаптация* → *Создание с нуля*

⚙️ Пример PowerShell:
# Стадия 1: Get-Service  
# Стадия 4: Скрипт с алертами и историей
function Get-FailedServices {
$services = Get-Service | Where-Object {
$_.Status -ne 'Running' -and $_.StartType -eq 'Automatic'
}
if ($services.Count -gt 3) { Send-Alert "Сломано: $($services.Count) служб!" }
}



На какой стадии автоматизации вы сейчас?


🌐 @helcode | #powershell #автоматизация
👍2
"А если сервер упадёт?" — Мониторим сам мониторинг

🤔 Проблема: А кто следит за тем, чтобы сами скрипты мониторинга работали?

Решение: Простые проверки:

⚙️ Проверка, что скрипт запущен (Bash):
if ! pgrep -f "monitor_script.sh"; then  
/path/to/monitor_script.sh &
echo "Скрипт упал и был перезапущен!" | send_to_telegram
fi



Логирование работы скрипта:
*/5 * * * * /path/to/script.sh >> /var/log/monitoring.log 2>&1  



👁‍🗨 Внешний "наблюдатель" (например, UptimeRobot):
➜ Бесплатно мониторит доступность сервера и шлёт SMS/email, если он не отвечает.

👉 Теперь ваш мониторинг действительно надёжен!

🌐 @helcode | #bash #мониторинг
👍1
Автоматизация мониторинга — зачем она нужна?

Пока вы спите, скрипты работают. Вот почему автоматизация мониторинга критически важна:

●︎ Экономия времени — скрипты не устают и не забывают
●︎ Мгновенные алерты — Telegram-бот предупредит о проблеме раньше пользователей
●︎ Самовосстановление — рестарт служб, очистка диска, блокировка атакующих IP
●︎ Нет человеческого фактора — скрипт не пропустит критическую ошибку

Пример:
if service nginx status | grep -q "dead"; then  
systemctl restart nginx
fi



Три строки — и сервис всегда работает.

🌐 @helcode | #bash #мониторинг
Знакомство с Nmap

Nmap: швейцарский нож для аудита сетей

Nmap (Network Mapper) — это фундамент, на котором строится сетевая безопасность. Вот что он умеет:

Обнаружение хостов — находит все активные устройства в сети.
nmap -sn 192.168.1.0/24

Сканирование портов — показывает, какие "двери" (порты) открыты на устройствах.
nmap -sS -p 1-1000 192.168.1.1

Детекция ОС и сервисов — определяет, что это за устройство и какие сервисы на нём работают.
nmap -A 192.168.1.1

Движок скриптов (NSE) — самая мощная фича! Целый язык на Lua для автоматизации всего: от поиска уязвимостей до попыток взлома.

Категории скриптов:
auth — проверка логинов
vuln — поиск известных уязвимостей (CVE)
exploit — попытка эксплуатации
discovery — исследование сети
...и еще десятки!

Самый частый запрос: nmap --script=vuln <цель>

🌐 @helcode | #nmap #nse #порты #сканирование
👍6
Настраиваем auditd: правила для мониторинга всего

Как следить за важными действиями?

1. Основные команды:
- Просмотр правил:

  sudo auditctl -l


- Мониторинг файла (например, /etc/passwd):

  sudo auditctl -w /etc/passwd -p wa -k passwd_changes



2. Постоянные правила (добавляем в /etc/audit/rules.d/audit.rules):
# Ловим использование sudo:
-w /usr/bin/sudo -p x -k sudo_usage

# Мониторим удаление файлов:
-a always,exit -F arch=b64 -S unlink -S unlinkat -k file_deletion



🦾 Применяем:
sudo auditctl -R /etc/audit/rules.d/audit.rules


🌐 @helcode | #bash #auditd
👍2
Как на самом деле работает cron? 🤔

Cron — это не волшебный черный ящик, а демон (crond), который просыпается каждую минуту и проверяет, не пора ли чего запустить.

Всё расписание хранится в crontab-файлах. Синтаксис строки — это 5 полей:

минута час день_месяца месяц день_недели команда

Примеры:
 0 * * * *  — каждый час в 00 минут.
 0 0 * * 0  — каждое воскресенье в полночь.
  */15 * * * *  — каждые 15 минут.
  0 4 1 * *  — первое число месяца в 4 утра.

Есть и специальные слова для ленивых (как мы все):
@yearly@monthly@weekly@daily, @hourly@reboot

Вопрос на засыпку: что выполняется чаще: @daily или 0 0 * * *?

Ответ: это одно и то же! Ха-ха-ха)))))))))))))))))

🌐 @helcode | #linux #cron #howto
👍1
Анализ логов auditd: находим угрозы

1. Утилиты:
- Поиск по метке:

  sudo ausearch -k sudo_usage


- Отчёт по файлам:

  sudo aureport -f



2. Пример лога:
type=SYSCALL msg=audit(...): uid=0 comm="rm" key="file_deletion"


👉 Что было: пользователь с UID=0 запустил rm.

🌐 @helcode | #bash #логи #автоматизация
Твой Python-скрипт вырос и хочет отдельной команды в терминале. Как ему это организовать? ☕️

Мы все начинаем с простого скрипта super_script.py. Но потом к нему добавляются аргументы, конфиги, логирование... И вот ты уже не запускаешь скрипт, а выполняешь сложный ритуал: python /path/to/script.py --verbose --output /home/user/data.json. Пора дать ему собственное имя и сделать полноценным CLI-инструментом!

Всё, что нужно, — это argparse из коробки Python. Смотрим, как превратить хаос в элегантную команду:

# file: data_processor.py
import argparse

def process_data(input_file, output_file, verbose=False):
# Здесь твоя магия обработки данных
if verbose:
print(f"Обрабатываем {input_file} и сохраняем в {output_file}")
return True

if __name__ == "__main__":
# Создаем парсер
parser = argparse.ArgumentParser(description='Крутой инструмент для обработки данных.')

# Добавляем аргументы
parser.add_argument('input', help='Путь до входного файла')
parser.add_argument('-o', '--output', required=True, help='Путь до выходного файла')
parser.add_argument('-v', '--verbose', action='store_true', help='Вербальный режим')

# Парсим аргументы
args = parser.parse_args()

# Передаем в функцию
process_data(args.input, args.output, args.verbose)


1. ArgumentParser — это наш главный конструктор команд.
2. add_argument определяет, какие флаги и аргументы мы принимаем. required=True для обязательных, action='store_true' для булевых флагов.
3. parse_args() превращает sys.argv в удобный объект с точками (args.input).

Следующий уровень: после этого можно установить скрипт как пакет через pip install -e . (прописав в setup.py) и твоя команда data_processor будет доступна из любой директории!

А какой у вас любимый инструмент для создания CLI? 🤔

P.S. Если твой скрипт после этого начнет требовать зарплату в виде GPU — мы не виноваты.


🌐 @helcode | #python
👍2🤔1
Скрипт для автоматического бэкапа MySQL

Ручные бэкапы — это как ходить по канату без страховки. Автоматизируем!

👩‍🔬 Решение:
#!/bin/bash  
BACKUP_DIR="/backups/mysql"
DATE=$(date +%Y%m%d)
mysqldump -u user -p"password" db_name | gzip > "$BACKUP_DIR/db_name_$DATE.sql.gz"

# Проверяем успешность и шлём алерт
if [ $? -eq 0 ]; then
echo "Backup OK" | sendmail admin@example.com
else
echo "Backup FAILED!" | sendmail admin@example.com
fi



🔧 Дополнения:
- Добавьте find $BACKUP_DIR -type f -mtime +30 -delete для удаления старых бэкапов.
- Используйте cron для запуска по расписанию.

Как вы организуете бэкапы? Храните на облаке или локально?

🌐 @helcode | #bash
👍1
Почему && лучше, чем ;?

command1; command2 выполнит обе команды, даже если первая упала. && — только если первая успешна.

🛠 Пример:
cd /nonexistent_dir && rm -rf *  # Удаление не сработает (и это хорошо!)  



Где ещё полезно:
- make && make test — не запускать тесты, если сборка провалилась.
- git pull && npm install — не ставить зависимости, если обновление репы не удалось.

Какие ещё операторы в Bash вы часто используете?

Использовать ; вместо && — это как прыгать с парашютом, не проверив, есть ли он за спиной.


🌐 @helcode | #bash
Как заставить старый скрипт работать в 10 раз быстрее

😴 Ваш скрипт работает так медленно, что пока он выполняется, можно выучить новый язык?

👁‍🗨 Мы все их видели: скрипты, написанные на коленке, которые со временем стали критически важными. Они работают, но отжирают уйму времени и ресурсов. Часто проблема не в сложности задачи, а в неоптимальных подходах.

👉Взгляните на этот кусок кода. Часто проблема в циклах внутри циклов, где можно применить списковые включения или функции из itertools.

Было (медленно):

results = []
for item in huge_list:
if some_condition(item):
for subitem in item.subitems:
if another_condition(subitem):
results.append(process(subitem))


Стало (быстро):

results = [process(subitem) for item in huge_list if some_condition(item) for subitem in item.subitems if another_condition(subitem)]
# Или еще лучше: использовать генератор для экономии памяти!
results_gen = (process(subitem) for item in huge_list ... )


Списковые включения в Python оптимизированы на уровне C и работают значительно быстрее классических for`-циклов с .append()`. А использование генераторов (`()`) вместо списков (`[]`) позволяет не загружать все данные в память сразу, что еще ускоряет работу с большими объемами данных.

А вы как ускоряли своих "динозавров"? Поделитесь самым крутым оптимизационным хаком в комментариях!

Это как в «Форсаже»: иногда не нужен новый двигатель, а нужно просто правильно настроить карбюратор и сбросить лишний вес.


🌐 @helcode | #python
👍3
Как автоматически генерировать сложные пароли для всей команды

Ваш пароль "qwerty123" прекрасен... если вы хотите подарить хакеру новый автомобиль. Давайте генерировать лучше!

Слабые пароли - главная дыра в безопасности. А придумывать и хранить десятки сложных паролей для разных сервисов не может даже человек с памятью как у Шерлока. Доверьте это машине.

Однострочник на Python в помощь всей команде:
import secrets
import string

alphabet = string.ascii_letters + string.digits + "!@#$%^&*"
password = ''.join(secrets.choice(alphabet) for i in range(16))
print(password) # Пример: 'xT5&!k8@qL9#vR2$'


Мы используем модуль secrets, который криптографически безопасен (в отличие от random). string.ascii_letters + string.digits - это наш алфавит (буквы и цифры). Добавляем спецсимволы для сложности. Длина 16 символов - отличный старт.

А как вы управляете паролями в своей команде?

🌐 @helcode | #python
👍2