<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>@usr_bin_linux</title><generator>teletype.in</generator><description><![CDATA[@usr_bin_linux]]></description><link>https://teletype.in/@usr_bin_linux?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=usr_bin_linux</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/usr_bin_linux?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/usr_bin_linux?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Fri, 10 Jul 2026 02:44:40 GMT</pubDate><lastBuildDate>Fri, 10 Jul 2026 02:44:40 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@usr_bin_linux/how-to-after-incident</guid><link>https://teletype.in/@usr_bin_linux/how-to-after-incident?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=usr_bin_linux</link><comments>https://teletype.in/@usr_bin_linux/how-to-after-incident?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=usr_bin_linux#comments</comments><dc:creator>usr_bin_linux</dc:creator><title>Разбор сбоев в Linux: 20 команд, которые я запускаю перед тем, как что-либо делать</title><pubDate>Thu, 09 Jul 2026 13:27:19 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/a7/31/a7316a1b-8745-43ec-bf64-470dc61f5d88.png"></media:content><description><![CDATA[<img src="https://miro.medium.com/v2/resize:fit:875/1*0YGADHqX4jmaR0DDRk8ZqA.png"></img>Это перевод оригинальной статьи Linux Outage Triage: 20 Commands I Run Before I Touch Anything.]]></description><content:encoded><![CDATA[
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="t17y">Это перевод оригинальной статьи <a href="https://blog.stackademic.com/linux-outage-triage-20-commands-i-run-before-i-touch-anything-8aabdc6919ec" target="_blank">Linux Outage Triage: 20 Commands I Run Before I Touch Anything</a>.</p>
  </section>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="Orxp">Подписывайтесь на телеграм-канал <a href="https://t.me/usr_bin_linux" target="_blank">usr_bin</a>, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.</p>
  </section>
  <figure id="CiB3" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/1*0YGADHqX4jmaR0DDRk8ZqA.png" width="700" />
  </figure>
  <p id="1a53">Когда сбой происходит в 3 утра, самый быстрый способ потерять время — начать «пробовать что-то».</p>
  <p id="bff5"><strong>Случайные перезапуски. Случайные изменения конфигурации. Случайное масштабирование.</strong></p>
  <p id="4991"><strong>Они часто только усугубляют</strong> ситуацию.</p>
  <p id="69b4">После 5 лет дежурств я понял, что настоящее реагирование на инциденты — это не вопрос остроумия, а вопрос <strong>систематичности</strong>.</p>
  <p id="2b17">После каждого сбоя я изо всех сил пытаюсь ответить <strong>на три вопроса</strong>:</p>
  <blockquote id="Asuc"><strong>Что сломалось?</strong> (симптомы)<br /><strong>Где произошло повреждение?</strong> (радиус)<br /><strong>Что изменилось?</strong> (движение к первопричине)</blockquote>
  <p id="d89c">Это мой список команд для дежурных — <strong>готовый к копированию и вставке</strong>, сгруппирован по назначению.</p>
  <h2 id="bfa8">⚡ Первые 3 минуты (скопируйте/вставьте этот блок)</h2>
  <p id="1754">Когда срабатывает алерт, я выполняю следующую <strong>последовательность действий</strong>:</p>
  <pre id="6UUL" data-lang="bash">uptime
top -o %CPU
free -h
df -h &amp;&amp; df -i
ss -tulpn
journalctl -xe --no-pager | tail -n 80</pre>
  <h2 id="8fa3">Что вам это покажет за 60 секунд</h2>
  <p id="yC70">✅ <code>uptime</code> → Средняя загрузка + стабильность системы   <br />✅ <code>top</code> → Основные потребители CPU (CPU действительно является проблемой?)   ✅ <code>free -h</code> → Давление на память / активное использование swap   <br />✅ <code>df -h / df -i</code> → Диск заполнен ИЛИ исчерпаны inodes (оба случая могут «убить» систему)   <br />✅ <code>ss -tulpn</code> → Что слушает порты + какие порты открыты (или отсутствуют)   ✅ <code>journalctl -xe</code> → Последние критические ошибки, о которых сигнализирует система</p>
  <p id="e573"><strong>Эти 6 команд позволяют вам получить контекст инцидента менее чем за минуту.</strong></p>
  <p id="a3be">Теперь давайте углубимся в тему.</p>
  <h2 id="4dd4">Раздел 1: хост выходит из строя? (CPU / Load)</h2>
  <pre id="0RUs" data-lang="bash">uptime
top -o %CPU
ps aux --sort=-%cpu | head -n 15
mpstat -P ALL 1
pidstat 1</pre>
  <p id="c24e"><strong>Используйте это, когда:</strong> всё работает медленно, запросы истекают по таймауту, срабатывают предупреждения о загрузке ЦП.</p>
  <p id="8bb3"><strong>На что обратить внимание:</strong></p>
  <ul id="o9q2">
    <li id="044a">Средняя загрузка процессора <strong>значительно превышает</strong> количество ядер CPU.</li>
    <li id="45d8">Один процесс постоянно потребляет ресурсы процессора.</li>
    <li id="a684">Процессор работает нормально, но система тормозит → часто возникает <strong>задержка ввода-вывода</strong> (переход к разделу &quot;Диск&quot;)</li>
  </ul>
  <p id="bf8b"><strong>Пример из практики:</strong> средняя загрузка 47% на 8-ядерном сервере. Оказалось, что это был неконтролируемый скрипт на Python, потребляющий 780% ресурсов CPU (многопоточно). <code>pidstat</code> отобразил точный PID.</p>
  <h2 id="f47a">Раздел 2: давление на память / OOM</h2>
  <pre id="48NA" data-lang="bash">free -h
ps aux --sort=-%mem | head -n 15
dmesg -T | tail -n 120
journalctl -k --no-pager | tail -n 120</pre>
  <p id="cc3a"><strong>Используйте это в следующих случаях:</strong> сервисы перезапускаются случайно, поды/демоны падают, сервер нестабилен.</p>
  <p id="d14e"><strong>На что обратить внимание:</strong></p>
  <ul id="d6Do">
    <li id="1d9c">Логи OOM killer: <code>&quot;Killed process 12345 (java) ...&quot;</code></li>
    <li id="8a2c">Использование swap быстро растёт (80%+ — опасная зона)</li>
    <li id="bf12">Один процесс раздувается в памяти</li>
  </ul>
  <p id="010f"><strong>Ключевое правило: сначала</strong> фиксируйте доказательства (логи + снимок памяти), прежде чем перезапускать что-либо.</p>
  <p id="3252"><strong>Почему?</strong> После перезапуска все улики исчезают. Вы не узнаете, что на самом деле произошло.</p>
  <h2 id="a7c9">Раздел 3: заполнение диска или заполнение инода (оба фактора приводят к сбоям)</h2>
  <pre id="UMDA" data-lang="bash">df -h
df -i
du -sh * 2&gt;/dev/null | sort -h | tail -n 15</pre>
  <p id="720d"><strong>Используйте это в следующих случаях:</strong> ошибки записи, сбои приложений, некорректная работа баз данных, зависание деплоя.</p>
  <p id="f59a"><strong>На что обратить внимание:</strong></p>
  <ul id="6kxp">
    <li id="df43">Использование диска составляет <strong>95–100%.</strong></li>
    <li id="b1f3">Заполненность инодов составляет <strong>100%</strong> (часто из-за миллионов маленьких лог-файлов).</li>
  </ul>
  <p id="934a"><strong>Полезный совет:</strong> <code>df -i</code> команда, о которой <strong>все забывают</strong>. Я видел трехчасовые сбои, вызванные исчерпанием inode, когда диск был заполнен всего на 60%.</p>
  <h2 id="1199">Раздел 4: удаленные файлы продолжают занимать место на диске (незаметный сбой)</h2>
  <pre id="NpGW" data-lang="bash">lsof +L1</pre>
  <p id="53e1"><strong>Используйте это, когда: </strong><code>df -h</code> сообщает о заполнении диска, но вы &quot;удалили 50 ГБ логов&quot;, и место не восстановилось.</p>
  <p id="e790"><strong>Причина:</strong> удаленный файл по-прежнему остается открытым в рамках какого-либо процесса.</p>
  <p id="7586"><strong>Как исправить:</strong> Перезапустить конкретный процесс (после сбора доказательств).</p>
  <p id="1fe1"><strong>Пример из практики:</strong> однажды я потратил 2 часа на отладку дискового пространства. В логах было указано 89% заполнения. Удалил 40 ГБ. 89% всё ещё оставалось. Запустил команду <code>lsof +L1</code>→ обнаружил Java-процесс, удерживающий удалённый файл размером 45 ГБ. Перезапуск мгновенно исправил проблему.</p>
  <h2 id="1558">Раздел 5: узкое место дискового ввода-вывода (система медленная, CPU в порядке)</h2>
  <pre id="lCHT" data-lang="bash">iostat -xz 1
vmstat 1</pre>
  <p id="0625"><strong>Используйте это в следующих случаях:</strong> скачки задержки, зависание хоста, но загрузка ЦП не слишком высока.</p>
  <p id="d828"><strong>На что обратить внимание:</strong></p>
  <ul id="FUmB">
    <li id="da55">Долгое время <strong>ожидания</strong> диска (&gt;50 мс — плохо, &gt;100 мс — критично).</li>
    <li id="e575"><code>vmstat</code> показывает <strong>ожидания ввода-вывода</strong> / заблокированные процессы</li>
  </ul>
  <p id="896e"><strong>Это самая распространенная ошибка в диагностике.</strong> Люди видят сообщение «система работает медленно» и предполагают, что проблема в процессоре. Часто же дело в дисковом вводе-выводе.</p>
  <h2 id="2e7c">Раздел 6: что слушает? (порты + сервисы)</h2>
  <pre id="QD1j" data-lang="bash">ss -tulpn
ss -s</pre>
  <p id="d5a3"><strong>Используйте это в следующих случаях:</strong> «Соединение отклонено», проверки работоспособности завершаются неудачей, трафик не доходит до сервиса.</p>
  <p id="d63a"><strong>На что обратить внимание:</strong></p>
  <ul id="3X7b">
    <li id="3d60">Сервисный порт <strong>не прослушивается</strong> (распространенная проблема после неудачного деплоя).</li>
    <li id="4388">Слишком много сокетов / давление соединений</li>
  </ul>
  <h2 id="4801">Раздел 7: активные соединения</h2>
  <pre id="Kqlg" data-lang="bash">ss -tan state established | wc -l
ss -tan | head -n 30</pre>
  <p id="aec5"><strong>Используйте это в следующих случаях:</strong> внезапный всплеск трафика, перегрузка соединений, неожиданное поведение клиентов.</p>
  <p id="61a6"><strong>На что обратить внимание:</strong></p>
  <ul id="hvZC">
    <li id="0b99">Огромное количество установленных соединений (&gt;10 тыс. на одном хосте)</li>
    <li id="c05d">Множество соединений находятся в странном состоянии (это может указывать на проблемы с вышестоящим сервером).</li>
  </ul>
  <h2 id="3b59">Раздел 8: основные сведения о сети (интерфейсы + маршруты)</h2>
  <pre id="POMY" data-lang="bash">ip a
ip r</pre>
  <p id="b171"><strong>Используйте это в следующих случаях:</strong> пакеты не доходят до нужного места, межхостовые вызовы завершаются с ошибкой.</p>
  <p id="12c5"><strong>На что обратить внимание:</strong></p>
  <ul id="v2BK">
    <li id="e9b3">Отсутствует интерфейс / неправильно назначен IP-адрес</li>
    <li id="8aaa">Неверный маршрут по умолчанию</li>
    <li id="24a3">Изменения маршрута после перезапуска или обновления конфигурации</li>
  </ul>
  <h2 id="2e05">Раздел 9: быстрая проверка доступности</h2>
  <pre id="1hLW" data-lang="bash">ping -c 3 &lt;target&gt;
curl -I http://&lt;service&gt;
curl -vk https://&lt;service&gt;</pre>
  <p id="786e">Используйте это, когданужно понять кто виноват: сеть или приложение.</p>
  <p id="aa67"><strong>Полезный совет:</strong> <code>curl -vk</code> бесценен для отладки TLS (цепочка сертификатов, ошибки рукопожатия, перенаправления, проблемы с SNI).</p>
  <h2 id="c489">Раздел 10: состояние сервиса (systemd)</h2>
  <pre id="3Ae5" data-lang="bash">systemctl status &lt;service&gt;
systemctl is-active &lt;service&gt;
systemctl restart &lt;service&gt;</pre>
  <p id="955b"><strong>Используйте это, когда:</strong> подозреваете, что сервис сам упал или перезапускается в цикле.</p>
  <p id="0b7e"><strong>Золотое правило: перед перезапуском сначала</strong> прочтите логи. В противном случае вы просто будете гадать.</p>
  <h2 id="0af8">Раздел 11: логи сервиса</h2>
  <pre id="Q37Y" data-lang="bash">journalctl -u &lt;service&gt; --since &quot;30 min ago&quot; --no-pager | tail -n 200
journalctl -u &lt;service&gt; -f</pre>
  <p id="95f8">Используйте это, когда вам необходимо определить первопричину проблемы (ошибки конфигурации, сбои зависимостей, ошибки аутентификации).</p>
  <p id="477d"><strong>Совет:</strong> используйте <code>--since &quot;30 min ago&quot;</code> параметр для снижения уровня шума. В большинстве случаев сигналы о сбоях в последних 30 минутах.</p>
  <h2 id="0b89">Раздел 12: последние системные ошибки (ядро + система)</h2>
  <pre id="FMeF" data-lang="bash">journalctl -p err..alert --since &quot;1 hour ago&quot; --no-pager
dmesg -T | tail -n 120</pre>
  <p id="ba04">Используйте это, когда вы подозреваете проблемы с ядром, драйвером диска или сети, либо обнаружили странное поведение хоста.</p>
  <p id="1978"><strong>Что выявляет:</strong> ошибки нехватки памяти (OOM kill), сбои ядра, ошибки драйверов, аппаратные ошибки.</p>
  <h2 id="734c">Раздел 13: что изменилось? (изменения конфигурации / временные метки)</h2>
  <pre id="5MAL" data-lang="bash">ls -ltr /etc/&lt;app&gt;/
stat /etc/&lt;app&gt;/&lt;config&gt;</pre>
  <p id="b997"><strong>Используйте это, когда:</strong> сбои начался «после чего-то», но никто не помнит, после чего именно.</p>
  <p id="6a8e"><strong>Почему это важно:</strong> 80% сбоев вызваны изменениями<strong>.</strong> Найдите изменение, найдите причину.</p>
  <h2 id="ebe8">Раздел 14: Поиск сигналов в логах</h2>
  <pre id="uPvy" data-lang="bash">grep -R &quot;ERROR\|FATAL\|panic\|exception&quot; -n /var/log/&lt;app&gt;/ 2&gt;/dev/null | tail -n 50</pre>
  <p id="cb6f">Используйте это, когда логов слишком много<strong>,</strong> нужен моментальный вывод ошибок.</p>
  <p id="f3e1">Альтернативный вариант <code>journalctl -p err</code> для сервисов, управляемых systemd.</p>
  <h2 id="dd41">Раздел 15: владение процессом (что это запустило?)</h2>
  <pre id="eRLZ" data-lang="bash">ps aux | grep &lt;process_name&gt;
pstree -ap | head -n 40</pre>
  <p id="2e99">Используйте это, когда нужно увидеть parent/child связи (особенно runaway процессы).</p>
  <p id="6b88"><strong>Пример использования:</strong> зомби-процесс, который постоянно перезапускается. <code>pstree</code> показывает родительский процесс, который необходимо завершить.</p>
  <h2 id="3fa1">Раздел 16: кто недавно вносил изменения в файлы?</h2>
  <pre id="iebe" data-lang="bash">find /etc/&lt;app&gt;/ -type f -mmin -120 -ls 2&gt;/dev/null</pre>
  <p id="2cea">Используйте это, когда каталог конфигурации большой, и вам нужно узнать, что изменилось за последние 2 часа?</p>
  <p id="db55"><strong>Полезное решение:</strong> используйте совместно с <code>stat</code>, чтобы увидеть точное время внесения изменений и того, кто их внес.</p>
  <h2 id="b3f5">Раздел 17: проверки DNS (да, часто виноват DNS)</h2>
  <pre id="KWEI" data-lang="bash">resolvectl status 2&gt;/dev/null || cat /etc/resolv.conf
dig +short &lt;domain&gt;
nslookup &lt;domain&gt;</pre>
  <p id="0c38"><strong>Используйте это в следующих случаях: когда</strong> сервисы не могут разрешить зависимости, возникают периодические сбои между узлами.</p>
  <p id="772f"><strong>Интересный факт:</strong> по моему опыту, 30% «загадочных сетевых проблем» — это DNS. Проверяйте его на раннем этапе.</p>
  <h2 id="e63f">Раздел 18: Отслеживание пути запроса (быстро)</h2>
  <pre id="nFDq" data-lang="bash">traceroute &lt;target&gt; 2&gt;/dev/null || tracepath &lt;target&gt;</pre>
  <p id="3e5a"><strong>Используйте это в следующих случаях:</strong> трафик между хостами/VPC/подсетями пропадает.</p>
  <p id="e86f"><strong>Что это показывает:</strong> где происходит потеря пакетов (правила брандмауэра, «черные дыры» маршрутизации, проблемы с пирингом VPC).</p>
  <h2 id="fd0d">Раздел 19: Нехватка файловых дескрипторов (слишком много открытых файлов)</h2>
  <pre id="sRnv" data-lang="bash">ulimit -n
lsof | wc -l</pre>
  <p id="2c76">Используйте это в случаях, когда возникают странные сбои ввода-вывода, ошибки «слишком много открытых файлов», сбои под нагрузкой.</p>
  <p id="b7c2"><strong>Распространенная причина:</strong> приложение не закрывает соединения/файлы должным образом. Проверьте код приложения.</p>
  <h2 id="7430">Раздел 20: проверка времени (дрейф времени нарушает аутентификацию + TLS)</h2>
  <pre id="NPzk" data-lang="bash">timedatectl status
date</pre>
  <p id="8bc1">Используйте это в случаях когда токены не проходят проверку, появляются ошибки TLS, распределённые системы ведут себя нестабильно.</p>
  <p id="966f"><strong>Почему это важно:</strong> смещение времени более чем на 5 секунд может привести к поломке:</p>
  <ul id="aGZz">
    <li id="06cf">Проверки JWT-токена</li>
    <li id="d1da">Проверки TLS-сертификата</li>
    <li id="4ea6">Распределенного консенсуса (Raft, Paxos)</li>
    <li id="588b">Базы данных временных рядов</li>
  </ul>
  <h2 id="e950">Распространенные ошибки, усугубляющие инциденты</h2>
  <p id="70a6">Я совершал все эти ошибки. Учитесь на моих ошибках:</p>
  <p id="12ed"><strong>1. Перезапуск до сбора логов/доказательств</strong> → вы теряете неопровержимые улики. Всегда сначала фиксируйте данные.</p>
  <p id="611d"><strong>2. Игнорирование <code>df -i</code> (инодов)</strong> → диск может быть заполнен на 60%, но система выйдет из строя, потому что иноды заполнены на 100%.</p>
  <p id="1a93"><strong>3. Предположение, что высокая загрузка CPU означает активные вычисления</strong> → Часто это задержка ввода-вывода, маскирующаяся под загрузку ЦП.</p>
  <p id="8964"><strong>4. Отладка одного узла без проверки масштаба воздействия</strong> → Это касается одного хоста или всех хостов? Выясните это в первую минуту.</p>
  <p id="6569"><strong>5. Устранение симптомов без выяснения причины изменения</strong> → Сбой повторится. Найдите первопричину.</p>
  <h2 id="a425">✅ Краткий справочник: Схема команд при сбоях (краткое руководство на 1 минуту)</h2>
  <p id="a89c"><strong>Ситуация: пользователи сталкиваются с тайм-аутами</strong></p>
  <pre id="KBoL" data-lang="bash">uptime + top + ss -tulpn + journalctl -u &lt;service&gt;</pre>
  <p id="d15f"><strong>Ситуация: всё работает медленно, но процессор, похоже, в норме.</strong></p>
  <pre id="hZ27" data-lang="bash">iostat -xz 1 + vmstat 1</pre>
  <p id="a892"><strong>Ситуация: запись не выполняется / деплой не удаётся</strong></p>
  <pre id="V8CP" data-lang="bash">df -h + df -i + lsof +L1</pre>
  <p id="6603"><strong>Ситуация: сервис работает, но по-прежнему недоступен.</strong></p>
  <pre id="s3R1" data-lang="bash">journalctl -u &lt;service&gt; + grep errors + stat /etc/&lt;service&gt;/</pre>
  <h2 id="7736">Главный вывод</h2>
  <p id="82ca">Реагирование на сбои — это не значит быть самым умным человеком в комнате.</p>
  <p id="daf0">Речь идёт о <strong>систематическом</strong> подходе.</p>
  <p id="ae10"><strong>Эти 20 команд — это моя система.</strong></p>
  <p id="b407">Скопируйте их. Вставьте. Создайте свой собственный runbook.</p>
  <p id="2f6c">А когда в 3 часа ночи сработает сигнал тревоги, вы будете точно знать, с чего начать.</p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="nWGC">На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал <a href="https://t.me/usr_bin_linux" target="_blank">usr_bin</a>, где будет еще больше полезной информации.</p>
  </section>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@usr_bin_linux/linux-magic</guid><link>https://teletype.in/@usr_bin_linux/linux-magic?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=usr_bin_linux</link><comments>https://teletype.in/@usr_bin_linux/linux-magic?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=usr_bin_linux#comments</comments><dc:creator>usr_bin_linux</dc:creator><title>Скрытая магия терминала Linux</title><pubDate>Wed, 08 Jul 2026 13:30:28 GMT</pubDate><description><![CDATA[Это перевод оригинальной статьи The Hidden Magic of the Linux Terminal.]]></description><content:encoded><![CDATA[
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="5XP6">Это перевод оригинальной статьи <a href="https://medium.com/@haroldfinch01/the-hidden-magic-of-the-linux-terminal-7be6babe5e8f" target="_blank">The Hidden Magic of the Linux Terminal</a>.</p>
  </section>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="Crp6">Подписывайтесь на телеграм-канал <a href="https://t.me/usr_bin_linux" target="_blank">usr_bin</a>, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.</p>
  </section>
  <p id="b09c">Для большинства пользователей команды Linux носят утилитарный, точный, механический и целенаправленный характер. Но за поверхностью системного администрирования скрывается эксцентричный мир команд, которые стирают грань между функциональностью и развлечением. Эти скрытые жемчужины доказывают, что даже в мире скриптов командной оболочки и суперпользователей процветает творчество.</p>
  <p id="76ac">От говорящих коров до терминалов, имитирующих The Matrix, эти команды напоминают нам, что Linux не только мощный, но и забавный. Ниже приведены десять команд, в существование которых трудно поверить.</p>
  <h2 id="5ef6"><code>rev</code> – команда, которая всё переворачивает с ног на голову</h2>
  <p id="e8c3">На первый взгляд, <code>rev</code> кажется цифровой шуткой. Он принимает входной текст и просто разворачивает его посимвольно.</p>
  <p id="8744">Введите команду <code>echo hello | rev</code>, и в результате вы получите <code>olleh</code>. Это обманчиво просто, но удивительно удобно. Разработчики используют её для обработки палиндромов, отладки скриптов или манипулирования форматами вывода. <code>rev</code> воплощает элегантность философии UNIX: делай одно дело, и делай его идеально.</p>
  <h2 id="595d"><code>cowsay</code> –когда корова высказывает ваше мнение</h2>
  <p id="2339">Наберите текст <code>cowsay &quot;Keep coding&quot;</code> и наблюдайте, как ASCII-персонаж в виде коровы «произносит» ваши слова в мультяшном облачке с текстом.</p>
  <p id="ce58">Эта забавная команда была придумана исключительно ради развлечения, но быстро стала культовой среди разработчиков. Вы даже можете заменить корову другими персонажами, например, драконом или пингвином в смокинге, используя  флаг <code>-f</code>.</p>
  <p id="1389"><code>cowsay</code> превращает терминал, место логики, в полотно юмора.</p>
  <h2 id="c718"><code>sl</code> – паровоз, который наказывает за опечатки</h2>
  <p id="96bd">Каждый пользователь Linux хоть раз ошибочно вводил <code>ls</code> как <code>sl</code>. Вместо сообщения об ошибке эта команда запускает полноценную ASCII-анимацию паровоза, проезжающего по вашему терминалу.</p>
  <p id="7faf">Изначально это было написано как шутка, чтобы «наказать» невнимательных наборщиков текста, но с тех пор стало любимой пасхальной отсылкой в ​​мире Linux. Некоторые системные администраторы намеренно устанавливают её на боевые системы, чтобы напомнить своим командам, что даже у машин есть чувство юмора.</p>
  <h2 id="ca0b"><code>yes</code> – бесконечный цикл согласия</h2>
  <p id="c550"><code>yes</code> — одна из самых простых и одновременно самых странных команд в мире. Наберите <code>yes</code>, и ваш терминал будет бесконечно заполняться символом «y».</p>
  <p id="32b7">Но у этого инструмента есть и практическое применение: его часто используют для автоматизации ответов в скриптах или системах тестирования производительности, обрабатывающих непрерывный ввод. Например, <code>yes | apt-get install package</code> позволяет обойти запросы подтверждения. То, что на первый взгляд кажется абсурдным, на практике становится рабочей лошадкой автоматизации.</p>
  <h2 id="6d5d"><code>toilet</code> – типографика в терминале</h2>
  <p id="d3e4">Команда <code>toilet</code> преобразует обычный текст в большие, декоративные ASCII-заголовки. Нужен ли вам эффектный заголовок для лог-файла или вы просто хотите увидеть своё имя в эффектном терминальном формате — этот инструмент справится.</p>
  <p id="2ff4">С такими параметрами, как <code>--gay</code>, он даже выводит цветные градиенты текста. В сочетании с конвейерами из других команд он превращает системные логи в цифровые произведения искусства. Название может вызвать удивление, но результат его работы на удивление изысканный.</p>
  <h2 id="2160"><code>factor</code> – математический минималист</h2>
  <p id="b93a">Нужно разложить число на множители, не открывая калькулятор? Просто введите к<code>factor 12345</code>, и Linux мгновенно разложит его на простые множители.</p>
  <p id="c436">Эта команда отличается изысканной неприметностью — это тихий инструмент для тех, кто ценит математическую точность. Системные инженеры и разработчики часто используют её для проверки целостности данных или выполнения быстрых арифметических операций. Это чистая логика, сведенная к одной команде.</p>
  <h2 id="d538"><code>fortune</code> – мудрость из командной строки</h2>
  <p id="4152">Команда <code>fortune</code> выдает случайные отрывки мудрости, юмора или абсурда. Запустите ее, и вы можете увидеть пословицу, цитату из фильма или ироничную шутку.</p>
  <p id="3bf3">Она является частью культуры UNIX на протяжении десятилетий и часто используется для добавления индивидуальности в скрипты запуска или сообщения при входе в систему. В сочетании с cowsay ваша терминальная корова становится философом, произнося строки цифрового просветления.</p>
  <h2 id="d314"><code>rev</code> + <code>cowsay</code> + <code>fortune</code> – сила цепочки команд</h2>
  <p id="a9c2">Одна из главных сильных сторон Linux — это цепочка команд. Вы можете комбинировать инструменты для получения удивительных результатов.</p>
  <p id="5a8c"><code>fortune | rev | cowsay</code> создаёт корову, которая выводит перевёрнутые «предсказания» — игривый хаос конвейеров и процессов.</p>
  <p id="d279">Этот синтез простоты и творчества демонстрирует суть Linux: модульность, экспериментирование и юмор, сосуществующие в одной командной строке.</p>
  <h2 id="f388"><code>rig</code> – генерация фальшивых личностей</h2>
  <p id="947e">Нужен случайный адрес или имя для тестирования? <code>rig</code> (генератор случайных идентификационных данных) мгновенно создает поддельные личные данные, включая адреса улиц, почтовые индексы и имена.</p>
  <p id="ab2f">Он бесценен для тестирования форм, баз данных или анонимизированных демонстраций. Однако он также содержит этическое напоминание: такие мощные инструменты следует использовать ответственно. Это доказательство того, что Linux способен имитировать саму жизнь до мельчайших деталей.</p>
  <h2 id="9d54"><code>cmatrix</code> — матрица живёт в вашем терминале</h2>
  <p id="0406">Введите <code>cmatrix</code>, и ваш экран превратится в каскад неоново-зеленого текста — дань уважения фильму «Матрица».</p>
  <p id="dfa1">Эта завораживающая команда превращает ваш терминал в цифровой дождь, дополненный случайными символами и плавной прокруткой. Она не выполняет никакой функциональной задачи, но идеально воплощает дух игривости открытого исходного кода. Потому что иногда код должен быть прекрасен сам по себе.</p>
  <h2 id="87f8">Игривое сердце Linux</h2>
  <p id="6cd9">Командная строка Linux — это не просто место для серьезных вычислений, это живая, дышащая вселенная творчества. Эти необычные команды, как практичные, так и причудливые, раскрывают индивидуальность платформы.</p>
  <p id="c084">Они напоминают нам, что даже в мире автоматизации, оптимизации и управления есть место для радости.</p>
  <p id="5037">Так что в следующий раз, когда вы откроете терминал, осмельтесь на исследование. Где-то между командами ls и sudo вас ждет корова, готовая заговорить, поезд, готовый отправиться в путь, и матрица, готовая пролиться дождем.</p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="77Qw">На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал <a href="https://t.me/usr_bin_linux" target="_blank">usr_bin</a>, где будет еще больше полезной информации.</p>
  </section>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@usr_bin_linux/CKolIKksDVQ</guid><link>https://teletype.in/@usr_bin_linux/CKolIKksDVQ?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=usr_bin_linux</link><comments>https://teletype.in/@usr_bin_linux/CKolIKksDVQ?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=usr_bin_linux#comments</comments><dc:creator>usr_bin_linux</dc:creator><title>12 лучших инструментов безопасности Kubernetes, которые вам понадобятся в 2026 году</title><pubDate>Wed, 08 Jul 2026 13:06:33 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/db/2e/db2e2c24-7922-4691-8e8c-2a56152f5729.png"></media:content><description><![CDATA[<img src="https://miro.medium.com/v2/resize:fit:875/1*H9xUyrljEA1CXuMjsgZf6g.png"></img>Это перевод оригинальной статьи 12 Best Kubernetes Security Tools You Need In 2026.]]></description><content:encoded><![CDATA[
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="BBv0">Это перевод оригинальной статьи <a href="https://medium.com/k8slens/12-best-kubernetes-security-tools-you-need-in-2026-9fca4258db0e" target="_blank">12 Best Kubernetes Security Tools You Need In 2026</a>.</p>
  </section>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="hZ2y">Подписывайтесь на телеграм-канал <a href="https://t.me/usr_bin_linux" target="_blank">usr_bin</a>, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.</p>
  </section>
  <figure id="qLeR" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/1*H9xUyrljEA1CXuMjsgZf6g.png" width="700" />
  </figure>
  <p id="73b0">Одна из самых больших проблем в облачной инфраструктуре — это обеспечение безопасности Kubernetes. Понимание того, какие инструменты безопасности следует внедрять, может стать решающим фактором между хорошо защищённым и уязвимым кластером.</p>
  <p id="4962">В этой статье мы рассмотрим основные инструменты Kubernetes, необходимые для обеспечения безопасности. С помощью этих инструментов вы сможете построить многоуровневую защиту, и мы рассмотрим инструменты, которые помогают реализовать подход shift-left, принудительное применение политик, защиту на этапе выполнения и даже аудит соответствия требованиям.</p>
  <p id="6ac3"><strong>Если коротко, то посмотрите видео</strong>:</p>
  <figure id="wsOW" class="m_custom">
    <iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FZdF4TTdjUwg%3Ffeature%3Doembed&display_name=YouTube&url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DZdF4TTdjUwg&image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FZdF4TTdjUwg%2Fhqdefault.jpg&type=text%2Fhtml&schema=youtube"></iframe>
  </figure>
  <h2 id="3fcc">Инструменты безопасности Kubernetes с подходом shift-left</h2>
  <p id="abdb">«Сдвиг влево» означает перенос вопросов безопасности на более ранние этапы цикла разработки. Вместо обнаружения уязвимостей и неправильных настроек в производственных средах, вы выявляете их на этапах разработки или непрерывной интеграции, когда их дешевле и проще исправить.</p>
  <h2 id="023c">1. KubeLinter</h2>
  <p id="b577"><a href="https://docs.kubelinter.io/#/" target="_blank">KubeLinter</a> — первая линия защиты, поскольку он проверяет манифесты Kubernetes и Helm-чарты на наличие ошибок конфигурации до фактического развертывания. Этот инструмент отлично справляется с выявлением распространенных проблем, таких как запуск контейнеров от имени root, использование тега latest у образов или отсутствие запросов и лимитов на ресурсы.</p>
  <figure id="qMJG" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/0*fTurw9ZTTgn0kNIV" width="700" />
  </figure>
  <p id="26af">KubeLinter теперь поддерживается сообществом, и его скорость и простота делают его идеальным для CI/CD-пайплайнов, где критически важна быстрая обратная связь. Одна команда kubelinter lint может предотвратить появление проблем безопасности в вашем кластере, что делает этот инструмент мощной частью любого GitOps-процесса.</p>
  <h2 id="5681">2. Checkov</h2>
  <p id="89c4"><a href="https://www.checkov.io/" target="_blank">Checkov</a> — это инструмент статического анализа уязвимостей и ошибок конфигурации, который работает с Terraform, CloudFormation, Kubernetes и другими инфраструктурными решениями как код (IaC).</p>
  <figure id="ps7l" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/0*kIPs2arA16lNoaA8" width="700" />
  </figure>
  <p id="3735">Он содержит более 1000 встроенных политик и выявляет неправильные конфигурации и нарушения соответствия стандартам, таким как CIS, NIST и другим. Это мощный инструмент, который следует использовать в CI/CD-пайплайнах, где необходимо обеспечить соблюдение корпоративных стандартов до запуска инфраструктуры в продакшн.</p>
  <h2 id="d21b">3. Trivy</h2>
  <p id="339f"><a href="https://trivy.dev/" target="_blank">Trivy</a> от Aqua Security обнаруживает уязвимости в образах контейнеров, репозиториях Git, IaC и даже кластерах Kubernetes.</p>
  <figure id="Aru1" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/0*xy8sZiIXez3Yu_lR" width="700" />
  </figure>
  <p id="ace6">Trivy выделяется своей универсальностью и скоростью работы. Он сканирует на наличие известных уязвимостей (CVE), неправильных конфигураций, раскрытых секретов и даже проблем с лицензиями. Благодаря недавним обновлениям Trivy улучшил свои возможности по сканированию запущенных рабочих нагрузок, а также поддерживает генерацию Software Bill of Materials (SBOM), что важно для прозрачности безопасности цепочки поставки.</p>
  <h2 id="dab9">4. Kubescape</h2>
  <p id="66bd"><a href="https://kubescape.io/" target="_blank">Kubescape</a>, разработанный компанией ARMO, обеспечивает комплексную видимость безопасности от этапа разработки до выполнения. Платформа сканирует как YAML-манифесты, так и работающие кластеры, сравнивая их с такими фреймворками, как NSA/CISA и MITRE ATT&amp;CK.</p>
  <figure id="iPgQ" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/0*Htd2I3yQEQFh0H1Q" width="700" />
  </figure>
  <p id="ba08">Его отличительной особенностью является система оценки рисков в сочетании с визуальными графиками, которые помогают быстро оценить уровень безопасности. Хотя его функциональные возможности во время выполнения очень мощные, они часто работают лучше всего в сочетании с другими специализированными инструментами.</p>
  <h2 id="dad6">5. Cosign/Sigstore</h2>
  <p id="ccf7"><a href="https://docs.sigstore.dev/cosign/" target="_blank">Cosign</a>, входящий в проект Sigstore, решает задачу безопасности цепочки поставки напрямую. С помощью Cosign вы можете подписывать образы контейнеров в процессе сборки и проверять подписи перед их развертыванием.</p>
  <figure id="1YCb" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/0*7rE6GoMAzIa9iPCs" width="700" />
  </figure>
  <p id="0277">Это важно, поскольку предотвращается запуск в кластерах измененных или несанкционированных образов и можно легко убедиться в том, что ваши образы получены из надежных источников.</p>
  <h2 id="c92c">6. Kyverno</h2>
  <p id="29bd"><a href="https://kyverno.io/" target="_blank">Kyverno</a> — это проект CNCF на стадии инкубации, который стал популярным по простой причине: он позволяет писать политики Kubernetes в формате YAML.</p>
  <figure id="IPEw" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/0*HklI_geys9_NPa4u" width="700" />
  </figure>
  <p id="9fba">Он может автоматически проверять, изменять и генерировать ресурсы. Это значительно упрощает внедрение правил, таких как «запрещать запуск подов от root» или «каждое новое пространство имён должно иметь сетевую политику по умолчанию». Он менее гибкий для сверхсложной логики по сравнению с конкурентами, но для большинства команд его простота и нативная интеграция с Kubernetes делают его отличным выбором.</p>
  <h2 id="e7ee">7. OPA Gatekeeper</h2>
  <p id="2a41"><a href="https://www.openpolicyagent.org/" target="_blank">Open Policy Agent (OPA)</a> с Gatekeeper представляет собой мощный инструмент для обеспечения соблюдения политик в Kubernetes. OPA — это проект, получивший одобрение CNCF, и универсальный механизм управления политиками, работающий со всем вашим технологическим стеком.</p>
  <figure id="qrN3" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/0*uZQ0vcmLT3U41XTm" width="700" />
  </figure>
  <p id="6b58">Он использует Rego — декларативный язык для описания политик, который сложнее в изучении, чем YAML в Kyverno. Если вам нужен единый язык политик для разных платформ и сервисов, OPA является отраслевым стандартом.</p>
  <h2 id="60e6">8. Falco</h2>
  <p id="40f6"><a href="https://falco.org/" target="_blank">Falco</a> — ещё один проект, завершивший программу CNCF, который является золотым стандартом в области обнаружения угроз в облачных средах.</p>
  <figure id="JhTF" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/0*fL_8JnSa45IqjyQO" width="700" />
  </figure>
  <p id="2ecf">Используя eBPF, Falco напрямую подключается к ядру Linux для наблюдения за системными вызовами и активностью контейнеров. Его правила можно настраивать для обнаружения аномалий, таких как неожиданный запуск shell в контейнере или несанкционированный доступ к файлам. Falco требует тонкой настройки для уменьшения количества ложных срабатываний, но его глубина наблюдаемости делает его крайне важным для production-сред.</p>
  <h2 id="6cbf">9. Cilium</h2>
  <p id="90b3"><a href="https://cilium.io/" target="_blank">Cilium</a> изменил подход к сетевой безопасности Kubernetes, используя eBPF для высокопроизводительной сетевой работы и защиты на уровне ядра Linux, устраняя необходимость в традиционных инструментах вроде iptables.</p>
  <figure id="XWO9" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/0*Z6FTddSkL9BgLdkI" width="700" />
  </figure>
  <p id="y74w">Сетевые политики Cilium работают на основе идентичностей сервисов и меток, а не IP-адресов. Он также включает Hubble — инструмент наблюдаемости, который позволяет в реальном времени визуализировать взаимодействие сервисов и упрощает диагностику и мониторинг безопасности.</p>
  <h2 id="bf65">10. Calico</h2>
  <p id="963d"><a href="https://www.tigera.io/project-calico/" target="_blank">Calico</a> — это проверенное временем решение для сетевой безопасности Kubernetes, и его сила заключается в невероятно гибком и многофункциональном механизме сетевых политик, который значительно превосходит возможности стандартных политик Kubernetes.</p>
  <figure id="2WLa" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/0*1EGt3evZPAcrBEmN" width="700" />
  </figure>
  <p id="8cc3">Хотя ему, возможно, и не хватает всех впечатляющих преимуществ в производительности, присущих решениям на основе eBPF, таким как Cilium, его зрелость и мощные функции управления политиками делают его надежным выбором для защиты вашего кластера.</p>
  <h2 id="3d4d">Аудит и соответствие требованиям</h2>
  <p id="f2a0">Безопасность – это не только предотвращение и обнаружение. Вам также необходимо продемонстрировать, что ваши кластеры соответствуют стандартам безопасности, что достигается с помощью инструментов аудита и обеспечения соответствия требованиям.</p>
  <h2 id="0c88">11. Kube-hunter</h2>
  <p id="441c">Хотя разработка <a href="https://github.com/aquasecurity/kube-hunter" target="_blank">Kube-hunter</a> прекращена, и компания Aqua Security рекомендует вместо него Trivy, его все же стоит упомянуть по историческим причинам.</p>
  <figure id="CCFr" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/0*WnCsgPT3bCrlNI3b" width="700" />
  </figure>
  <p id="9b9e">Kube-hunter использует иной подход по сравнению с другими инструментами аудита, активно выискивая уязвимости безопасности с точки зрения злоумышленника, пытаясь эксплуатировать их, а не просто обнаруживать.</p>
  <h2 id="698b">12. Kube-bench</h2>
  <p id="7dfa"><a href="https://aquasecurity.github.io/kube-bench/v0.6.15/" target="_blank">Kube-bench</a> превосходно справляется с одной задачей: он проверяет, соответствуют ли ваши развертывания Kubernetes стандартам CIS Kubernetes Benchmark от Center for Internet Security.</p>
  <figure id="iTvo" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/0*VLN1gS6aS9GoY6xb" width="700" />
  </figure>
  <p id="9db3">Он запускается как простая задача в вашем кластере и проверяет всё, от компонентов плоскости управления до конфигураций рабочих узлов, предоставляя понятные результаты.</p>
  <h2 id="bf5f">Заключение</h2>
  <p id="d387">Для эффективной защиты Kubernetes необходимо внедрять различные инструменты на разных уровнях. Начните с подхода shift-left, затем убедитесь, что включено принудительное применение политик, добавьте защиту во время выполнения, защитите сеть и обеспечьте соответствие нормативным требованиям.</p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="EMhp">На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал <a href="https://t.me/usr_bin_linux" target="_blank">usr_bin</a>, где будет еще больше полезной информации.</p>
  </section>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@usr_bin_linux/how-to-awk</guid><link>https://teletype.in/@usr_bin_linux/how-to-awk?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=usr_bin_linux</link><comments>https://teletype.in/@usr_bin_linux/how-to-awk?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=usr_bin_linux#comments</comments><dc:creator>usr_bin_linux</dc:creator><title>Почему вам стоит изучить Awk в 2026 году</title><pubDate>Wed, 08 Jul 2026 12:54:05 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/3a/fb/3afb1387-8873-4719-ac3d-7ffb613496eb.png"></media:content><description><![CDATA[<img src="https://miro.medium.com/v2/resize:fit:875/1*3JBEHgHpChKN8ajBBXndIA.png"></img>Это перевод оригинальной статьи Why you should learn Awk in 2026.]]></description><content:encoded><![CDATA[
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="T6hy">Это перевод оригинальной статьи <a href="https://medium.com/quick-programming/why-you-should-learn-awk-69216b6afaa1" target="_blank">Why you should learn Awk in 2026</a>.</p>
  </section>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="2UOA">Подписывайтесь на телеграм-канал <a href="https://t.me/usr_bin_linux" target="_blank">usr_bin</a>, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.</p>
  </section>
  <figure id="RwmP" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/1*3JBEHgHpChKN8ajBBXndIA.png" width="700" />
  </figure>
  <p id="fb9a">Awk — это уникальный инструмент. Но на самом деле существует не так много альтернатив, которые были бы столь же универсально доступны, как awk.</p>
  <h2 id="f984">Что такое awk?</h2>
  <p id="6f06">Awk можно использовать как программу для обработки текста в терминале. Но если с помощью sed можно выполнять основные операции, то с помощью awk можно добавлять текст, выполнять вычисления и использовать сложные условные операторы.</p>
  <p id="4940">Потому что awk — это язык программирования.</p>
  <p id="40ff">Awk прекрасно дополняет grep и sed, и для большинства задач по обработке текста вам больше ничего не понадобится. Там, где вам пришлось бы вручную редактировать файл с помощью Vim, вы можете использовать sed и awk для программного редактирования, и, следовательно, применять одни и те же изменения к нескольким файлам без необходимости переписывать что-либо заново.</p>
  <h2 id="3d35">Почему стоит изучать awk</h2>
  <p id="8a68">Я начал изучать awk, потому что часто видел его в скриптах вместе с sed, и во всех курсах и видеороликах упоминались оба инструмента. Поэтому, когда я захотел изучить sed (поскольку он казался проще для понимания), я решил также начать изучать awk. И я сильно недооценил возможности awk и быстро понял, что awk действительно является языком программирования с такими возможностями, как условные конструкции, циклы, массивы и многое другое.</p>
  <p id="ff83">Я изучал его, потому что хотел использовать его вместе с sed и понять, что вообще возможно.</p>
  <p id="5ff1">Теперь я знаю, что могу выполнять большинство правок структурированного текста с его помощью.</p>
  <h2 id="3405">Примеры</h2>
  <p id="268c">Трудно представить себе, что можно сделать, сначала не увидев  несколько примеров, не так ли? Давайте рассмотрим несколько.</p>
  <h3 id="819d">Небольшие примеры</h3>
  <p id="a0a5">Awk полезен при работе с табличными данными, например, с выводом команды <code>ls -l</code>, когда вам нужно получить или только имена файлов, или только права доступа. С помощью символа <code>$</code> можно указать столбец, который нужно вывести в каждой строке.</p>
  <pre id="RFhA" data-lang="bash">ls -l | awk &#x27;{ print $9 }&#x27;</pre>
  <p id="d1e0">Эта команда выведет имена файлов в текущем каталоге. Если использовать <code>printf</code>, можно вывести их в одну строку, разделённую пробелами, вместо переводов строки.</p>
  <figure id="Arkp" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:383/1*17nYfpzvDoZ714umo8ZUTw.png" width="306" />
  </figure>
  <p id="2c93">Можно также задавать условия для обработки строк.</p>
  <pre id="zb3X" data-lang="bash">awk -F, &#x27;$6 == &quot;admin&quot; {print $2, $NF}&#x27; users.csv</pre>
  <p id="a424">Этот небольшой скрипт выведет второй и последний столбцы для каждой строки в файле users.csv, определенном ниже в следующем разделе, но только для администраторов.</p>
  <figure id="jUvL" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:719/1*F5U6u3VDayGAqL5ifOPWSg.png" width="575" />
  </figure>
  <p id="10d6">Как видно, даже простые однострочные команды уже могут давать более осмысленные выводы по данным или помогать на следующих этапах скрипта, например, чтобы пройтись по именам файлов в цикле</p>
  <h3 id="3e6e">Пример awk-скрипта</h3>
  <p id="e0d3">Итак, представьте, что у вас есть CSV-файл, подобный этому.</p>
  <pre id="DHgN" data-lang="bash">id,name,email,age,country,role,signup_date,last_login,status
1,Alice Jansen,alice.jansen@example.com,28,NL,user,2023-01-14,2025-03-10,active
2,Bob de Vries,bob.devries@example.com,35,NL,admin,2022-11-03,2025-03-14,active
3,Charlie Smith,charlie.smith@example.com,22,UK,user,2024-02-20,2025-02-28,active
...</pre>
  <p id="5b44">И вам нужно получить сводку статистики по пользователям. Конечно, вы можете сделать это любым удобным для вас способом, но давайте предположим, что нам нужен результат, подобный этому.</p>
  <pre id="1dH8" data-lang="bash">=== User Database Report ===
Active users:
Active in US:
Users under 30: 16
Total records processed: 16</pre>
  <p id="0d4b">Не задавайтесь вопросом зачем — просто примите это. Например, такой вывод может понадобиться в вашем CI/CD-пайплайне. Тогда можно создать awk-скрипт:</p>
  <pre id="Z0OJ" data-lang="bash"># summary.awk - Full user stats
BEGIN {
  print &quot;=== User Database Report ===&quot;
}
NR==1 { next }  # Skip header
{
  if ($9 == &quot;active&quot;) {
    active++
    if ($5 == &quot;US&quot;) us_active++
  }
  # Simple age group
  if ($4 &lt; 30) young++
}
END {
  print &quot;Active users:&quot;, active
  print &quot;Active in US:&quot;, us_active
  print &quot;Users under 30:&quot;, young
  print &quot;Total records processed:&quot;, NR-1
}</pre>
  <p id="c465">Здесь мы создаём заголовок с помощью блока <code>BEGIN</code>, выполняем некоторые вычисления, а в конце выводим статистику.</p>
  <p id="be4c">И всё это — в awk. Теоретически это можно записать в одну строку, но проще сохранить в файл и использовать команду<code> awk -f summary.awk users.csv</code>.</p>
  <figure id="nGdw" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:428/1*dfG2DhhlPbXl49XXSPCP7A.png" width="342" />
  </figure>
  <p id="3490">В данном случае вы можете убедиться, что, несмотря на то, что он обычно используется как простой инструмент командной строки, с его помощью можно создавать сложные скрипты для обработки данных.</p>
  <h2 id="c44f">Как научиться пользоваться Awk</h2>
  <p id="4bb9">Я изучал awk, проходя курс на Udemy, смотря видео на YouTube и экспериментируя самостоятельно. С тех пор я использую его в своих пайплайнах, и если у меня появляется свободное время, я могу придумать небольшую задачу и решить её с помощью sed и awk.</p>
  <p id="0e77">Также создал курс на Udemy по grep, sed и awk, поскольку эти три инструмента командной строки отлично работают вместе. <a href="https://www.udemy.com/course/mastering-grep-sed-and-awk/?referralCode=79F6FE8024B2DDFA7FC5" target="_blank">Вы можете найти его здесь</a>.</p>
  <h2 id="d492">Заключение</h2>
  <p id="4cbc">Вместе с grep и sed awk является чрезвычайно универсальным инструментом для обработки текста. Поскольку его можно использовать программно, вы можете редактировать файлы внутри других скриптов (например, в скриптах настройки проекта). Большое спасибо за прочтение и хорошего вам дня!</p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="kWlw">На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал <a href="https://t.me/usr_bin_linux" target="_blank">usr_bin</a>, где будет еще больше полезной информации.</p>
  </section>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@usr_bin_linux/backup-file-using-bash</guid><link>https://teletype.in/@usr_bin_linux/backup-file-using-bash?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=usr_bin_linux</link><comments>https://teletype.in/@usr_bin_linux/backup-file-using-bash?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=usr_bin_linux#comments</comments><dc:creator>usr_bin_linux</dc:creator><title>Самый быстрый способ резервного копирования файла в Bash (вероятно, вы им не пользуетесь)</title><pubDate>Tue, 02 Jun 2026 07:30:46 GMT</pubDate><description><![CDATA[Это перевод оригинальной статьи The Fastest Way to Back Up a File in Bash (You’re Probably Not Using It).]]></description><content:encoded><![CDATA[
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="zxn2">Это перевод оригинальной статьи <a href="https://lovethepenguin.com/the-fastest-way-to-back-up-a-file-in-bash-youre-probably-not-using-it-8881f3549dbd" target="_blank">The Fastest Way to Back Up a File in Bash (You’re Probably Not Using It)</a>.</p>
  </section>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="NyEU">Подписывайтесь на телеграм-канал <a href="https://t.me/usr_bin_linux" target="_blank">usr_bin</a>, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.</p>
  </section>
  <p id="b03f">При работе в терминале создание резервной копии файла перед редактированием — это привычка, которая экономит время, нервы, а иногда и целые системы. В Bash есть приём, который делает это почти незаметным:</p>
  <pre id="h4xw" data-lang="bash">cp filename{,.bak}</pre>
  <h3 id="9114">Как это работает</h3>
  <p id="f44d">Эта команда основана на <strong>расширении фигурных скобок</strong> — функции оболочки, которая генерирует несколько строк из одного шаблона.</p>
  <pre id="l8F7" data-lang="bash">filename{,.bak}</pre>
  <p id="8999">разворачивается в:</p>
  <pre id="qATv" data-lang="bash">filename filename.bak</pre>
  <p id="cd41">Таким образом, Bash фактически выполняет следующее:</p>
  <pre id="UijQ" data-lang="bash">cp filename filename.bak</pre>
  <p id="47cb">Вы вводите имя файла один раз, а Bash сделает все остальное.</p>
  <h3 id="0287">Почему это лучше, чем «обычный» способ</h3>
  <p id="7175">Большинство людей пишут:</p>
  <pre id="zkVd" data-lang="bash">cp filename filename.bak</pre>
  <p id="7699">Это работает, но расширение фигурных скобок имеет свои преимущества:</p>
  <ul id="xwlI">
    <li id="9018"><strong>Быстрый ввод</strong></li>
    <li id="094e"><strong>Меньше ошибок</strong>, особенно с длинными именами файлов.</li>
    <li id="6705"><strong>Более чистые команды</strong></li>
    <li id="5165"><strong>Упрощает чтение скриптов и истории терминала.</strong></li>
  </ul>
  <p id="747b">После привыкания, возвращаться к прежнему будет тяжело.</p>
  <h3 id="57c5">Примеры из практики</h3>
  <p id="a501">Перед редактированием конфигурационного файла:</p>
  <pre id="lLud" data-lang="bash">cp nginx.conf{,.bak}</pre>
  <p id="d077">Перед изменением скрипта:</p>
  <pre id="utWy" data-lang="bash">cp deploy.sh{,.bak}</pre>
  <p id="33b7">Нужно откатить изменения?</p>
  <pre id="Dqov" data-lang="bash">mv filename.bak filename</pre>
  <p id="b0b7">Мгновенная отмена.</p>
  <h3 id="b356">Полезные варианты</h3>
  <p id="9747">Разный суффикс:</p>
  <pre id="YrNi" data-lang="bash">cp file{,.old}
cp file{,.backup}</pre>
  <p id="9d80">Резервная копия с отметкой времени:</p>
  <pre id="TkbT" data-lang="bash">cp file{,.$(date +%F)}</pre>
  <p id="2c57">Результат:</p>
  <pre id="BxQP" data-lang="bash">file.2025-12-15</pre>
  <p id="f8f6">Интерактивный режим (запрашивает подтверждение перед перезаписью):</p>
  <pre id="baMd" data-lang="bash">cp -i filename{,.bak}</pre>
  <h3 id="066f">Важные примечания</h3>
  <ul id="nHSi">
    <li id="63a3">Работает в <strong>Bash</strong>, <strong>Zsh</strong> и большинстве современных оболочек.</li>
    <li id="7eee">Не <strong>работает</strong> в обычной оболочке <code>sh</code> (POSIX shell).</li>
    <li id="fc3c">Перезаписывает существующие файлы <code>.bak</code>, если не используется <code>-i</code>.</li>
  </ul>
  <h3 id="dc04">Почему это важно</h3>
  <p id="f4c3">Это маленький приём, но он формирует более безопасный рабочий процесс:</p>
  <ul id="3u9I">
    <li id="213f">Резервное копирование становится автоматическим</li>
    <li id="a9a7">Вы чаще будете их делать</li>
    <li id="60cc">Ошибки обратимы</li>
  </ul>
  <p id="bc99">Со временем эти небольшие привычки приводят к уменьшению количества сбоев, снижению уровня паники и более чистому использованию командной оболочки.</p>
  <h3 id="11db">Заключительная мысль</h3>
  <p id="445e">Если вы ежедневно работаете в терминале, эта однострочная команда должна стать частью вашей мышечной памяти:</p>
  <pre id="MCMB" data-lang="bash">cp filename{,.bak}</pre>
  <p id="37cc">Маленькая команда. Большая отдача.</p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="Duk9">На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал <a href="https://t.me/usr_bin_linux" target="_blank">usr_bin</a>, где будет еще больше полезной информации.</p>
  </section>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@usr_bin_linux/linux-security</guid><link>https://teletype.in/@usr_bin_linux/linux-security?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=usr_bin_linux</link><comments>https://teletype.in/@usr_bin_linux/linux-security?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=usr_bin_linux#comments</comments><dc:creator>usr_bin_linux</dc:creator><title>Безопасность системы Linux: как предотвратить «плохие действия» других пользователей на общем сервере</title><pubDate>Sun, 01 Mar 2026 21:21:02 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/10/e1/10e1f33e-707d-48fd-a4d3-c5ee071302b5.png"></media:content><description><![CDATA[<img src="https://miro.medium.com/v2/resize:fit:875/1*QsY1U8eG-_NXNBhh5FUkfg.png"></img>Это перевод оригинальной статьи Linux System Security: How To Prevent Others From Doing “Bad Things” on a Shared Server.]]></description><content:encoded><![CDATA[
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="MNis">Это перевод оригинальной статьи <a href="https://osintteam.blog/linux-system-security-how-to-prevent-others-from-doing-bad-things-on-a-shared-server-7757e08149bc" target="_blank">Linux System Security: How To Prevent Others From Doing “Bad Things” on a Shared Server</a>.</p>
  </section>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="n1NI">Подписывайтесь на телеграм-канал <a href="https://t.me/usr_bin_linux" target="_blank">usr_bin</a>, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.</p>
  </section>
  <p id="ce97">В процессе разработки приложения необходимо учитывать ряд аспектов, включая код, операционную систему, сеть и базу данных. Поэтому простого понимания безопасности кода недостаточно; необходимо также понимать общие механизмы безопасности в базовых средах и инструментах. Правильно настроив эти механизмы безопасности, можно повысить общую безопасность.</p>
  <p id="0380">Когда речь заходит о Linux, многие из вас, вероятно, ежедневно используют его для различных задач разработки и эксплуатации. Однако в большинстве случаев компании не выделяют каждому сотруднику отдельный сервер Linux. Вместо этого несколько разработчиков и сотрудников службы эксплуатации используют один сервер Linux. Возникает вопрос: повлияют ли действия других сотрудников, использующих сервер Linux, на наши собственные данные и процессы? Кроме того, учитывая, что хакеры могут использовать различные уязвимости для управления сервером Linux, как можно предотвратить и минимизировать ущерб, наносимый такими вторжениями?</p>
  <h2 id="b764">Понимание модели безопасности в Linux</h2>
  <p id="d70f">Для эффективного решения проблем безопасности необходимо сначала понять модель безопасности Linux. Давайте разделим компоненты Linux на два уровня: уровень ядра и уровень пользователя. Уровень пользователя выполняет различные задачи, используя интерфейсы, предоставляемые уровнем ядра.</p>
  <p id="9488">Уровень ядра обеспечивает важнейшие функции безопасности, такие как сегментация прав доступа, изоляция процессов и защита памяти, формируя основу безопасности пользовательского уровня. Если безопасность ядра нарушена (например, хакер может изменить логику ядра), он может произвольно изменять права доступа, манипулировать процессами и получать доступ к памяти. В таких случаях любые меры безопасности, реализованные на пользовательском уровне, теряют смысл.</p>
  <p id="7cca">Учитывая критическую важность безопасности ядра в Linux, стоит ли нам вкладывать значительные усилия в её защиту? На самом деле, подобно тому, как мы не слишком беспокоимся о деталях операционной системы при разработке приложений (особенно при использовании языков высокого уровня, таких как Java), нам не нужно уделять слишком много внимания безопасности ядра при рассмотрении безопасности Linux. Вместо этого следует сосредоточиться в первую очередь на безопасности пользовательского уровня. Для безопасности уровня ядра достаточно следовать рекомендациям по защите от известных уязвимостей, например, использовать официальные образы и регулярно их обновлять.</p>
  <p id="c1ce">Поскольку большинство взаимодействий происходит на пользовательском уровне, давайте рассмотрим операции на этом уровне. В Linux все операции пользовательского уровня можно абстрагировать в следующий процесс: «Субъект -&gt; Запрос -&gt; Объект». Например, в операции «open <code>/etc/passwd</code>» субъект — это сам пользователь, запрос — операция чтения, а объект — файл <code>/etc/passwd</code>.</p>
  <figure id="K86d" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/1*QsY1U8eG-_NXNBhh5FUkfg.png" width="700" />
  </figure>
  <p id="104f">В этом процессе система безопасности ядра Linux обеспечивает контроль доступа на основе разрешений, предотвращая несанкционированный доступ к данным. Уровень пользователя Linux должен обеспечивать правильную настройку разрешений. Это ключ к безопасному совместному использованию сервера несколькими пользователями, что также является основной темой данной статьи.</p>
  <h2 id="2e1c">Как золотое правило применяется в системах Linux?</h2>
  <p id="ad98">Теперь, когда мы знаем, что основой безопасности систем Linux является правильная настройка прав доступа на уровне пользователя, давайте рассмотрим, как принципы Золотого правила аутентификации, авторизации и аудита применяются в системах Linux. Мы также выделим ключевые параметры безопасности, на которые следует обратить внимание в этих областях.</p>
  <h3 id="09c3">1. Механизмы аутентификации в Linux</h3>
  <p id="9fe7">Linux — многопользовательская операционная система, которая управляет и хранит пользовательскую информацию с помощью простых текстовых файлов. В этом контексте два важнейших файла: <code>/etc/passwd</code> и <code>/etc/shadow</code>.</p>
  <p id="408b">В Linux файл <code>/etc/passwd</code> доступен для чтения всем пользователям и не хранит пароли напрямую из соображений безопасности. Вместо этого в поле пароля используется символ <code>&#x27;x&#x27;</code> как заглушка. Информация о пароле пользователя хранится в файле <code>/etc/shadow</code>, доступном для чтения только пользователю ROOT.</p>
  <p id="3aa9">Файл <code>/etc/shadow</code> содержит не только зашифрованные пароли, но и другие политики управления паролями, такие как количество дней, в течение которых пароль действителен, или количество дней до истечения срока действия пароля, по истечении которых должно быть выдано предупреждение. Мы можем изменить эти политики управления паролями с помощью команды <code>chage</code>. Например, следующая команда <code>chage</code> заставляет тестового пользователя менять пароль каждые 60 дней, тем самым снижая вероятность утечки пароля:</p>
  <pre id="su8D" data-lang="bash">chage -M 60 test</pre>
  <p id="0b3b">Поскольку аутентификация — это функция, предоставляемая ядром Linux, проблема безопасности, на которой необходимо сосредоточиться на уровне пользователя, — это утечка идентификационной информации из-за слабых паролей. Для решения этой проблемы можно настроить соответствующие политики паролей в файле <code>/etc/shadow</code>. Кроме того, можно использовать такие инструменты, как John the Ripper, для обнаружения слабых паролей в Linux, используя известные базы данных слабых паролей. Следующая команда демонстрирует, как использовать John the Ripper для обнаружения слабых паролей:</p>
  <pre id="CDLM" data-lang="bash">unshadow /etc/passwd /etc/shadow &gt; mypasswd
john mypasswd
john --show mypassw</pre>
  <h3 id="452d">2. Механизм авторизации в Linux</h3>
  <p id="77a9">Согласно «золотому правилу», аутентификация — это лишь первый шаг, предоставляющий доверенную идентификацию. После получения этой идентификации необходимо обеспечить авторизацию, чтобы ограничить действия, которые может выполнять пользователь.</p>
  <p id="a708">В Linux объектами (также известными как субъекты) являются только файлы и каталоги. Для этих двух типов объектов Linux определяет три типа прав доступа: чтение, запись и выполнение. Различия между этими правами доступа для файлов и каталогов можно увидеть в представленной сравнительной таблице:</p>
  <figure id="iZQP" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/1*uZDR8S60xzbYmmDdJ3cTCA.png" width="700" />
  </figure>
  <p id="cf78">Помимо этих стандартных разрешений, Linux предоставляет дополнительные теги разрешений для более детального управления. Например, Linux предлагает атрибуты файлов для дополнительной защиты. Установив бит неизменяемости с помощью <code>chattr +i /etc/passwd</code>, вы можете запретить любому пользователю изменять файл. Подробнее об атрибутах файлов можно найти в Википедии.</p>
  <p id="79d5">Ещё одна функция Linux — это «sticky bit», который в первую очередь используется для предотвращения манипуляций пользователей с файлами других пользователей. Например, команда <code>chmod +t /tmp</code> может запретить пользователям удалять файлы в директории <code>/tmp</code>, принадлежащем другим пользователям.</p>
  <p id="4ca5">Это механизмы самозащиты при авторизации Linux, но как мы можем активно обеспечить безопасность этого процесса?</p>
  <p id="1b23">Ранее мы подчеркивали, что основная угроза безопасности в системах Linux связана с правами доступа. Это означает, что либо конфиденциальные файлы имеют неправильно настроенные права доступа, что позволяет другим пользователям получать к ним доступ или выполнять их, либо приложения содержат уязвимости или утечку паролей, что позволяет пользователям с низким уровнем привилегий получать более высокие привилегии.</p>
  <p id="100c"><strong>Чтобы решить проблемы с разрешениями, нам следует придерживаться принципа наименьших привилегий.</strong></p>
  <p id="ed1b">Давайте рассмотрим одну из самых распространённых проблем безопасности в системах Linux: неправильное использование прав ROOT. Многие пользователи, входя в систему Linux, первым делом запускают команду <code>su</code> чтобы получить полноценную оболочку ROOT-пользователя. Таким образом, им не придётся каждый раз временно повышать привилегии до уровня ROOT с помощью команды <code>sudo</code> для выполнения каждой операции.</p>
  <p id="22ee">Однако следует отметить важный момент: в среде ROOT-оболочки все запущенные процессы также имеют привилегии ROOT. Если вы запустите быстровозвращающийся процесс, например, <code>cat</code>, это не создаст особых проблем. Но если это длительный процесс, это может легко привести к злоупотреблению привилегиями.</p>
  <p id="5523">Например, если вы запустите Redis или MySQL от имени пользователя ROOT, любой другой пользователь, подключающийся к этим службам, может косвенно получить привилегии ROOT. В большинстве случаев взлома сервера хакеры используют уязвимости в этих процессах с привилегиями ROOT для повышения своих привилегий.</p>
  <p id="1ffc">Поэтому при запуске любых долговременных процессов необходимо придерживаться принципа наименьших привилегий. Это означает настройку минимально необходимых прав для запуска резидентных процессов в зависимости от требуемого уровня операций. Например, операции чтения/записи файлов в таких базах данных, как Redis и MySQL, не требуют наивысших привилегий ROOT.</p>
  <p id="93bd">Принцип наименьших привилегий критически важен в системах Linux. Вы можете спросить: при таком количестве операций в Linux, для каждой из них нужна индивидуальная настройка прав доступа? К счастью, это не так. Мы часто используем известные инструменты для реализации принципа наименьших привилегий при запуске резидентных процессов, и ваша задача — правильно запустить или настроить эти инструменты.</p>
  <p id="7f67">Например, вы можете запустить службу MySQL, используя <code>mysqld</code>, которая выделяет процессы MySQL пользователю &quot;mysql&quot; и запускает демон под ROOT-аккаунтом. Вот как это выглядит на практике:</p>
  <pre id="kDAU" data-lang="bash">root     297353  0.0  0.0 115432  1360 ?        S    Aug12   0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/var/lib/mysql --pid-file=/var/lib/mysql/mysql.pid
mysql    297553 31.3  4.3 11282756 5729572 ?    Sl   Aug12 22593:40 /usr/local/mysql/bin/m</pre>
  <p id="972d">Аналогично, при запуске Nginx, Nginx будет запускать рабочие процессы от имени пользователя «nobody». Конкретный эффект будет следующим:</p>
  <pre id="Z9zN" data-lang="bash">root       7083  0.0  0.0  61032  5324 ?        Ss   Aug12   0:01 nginx: master process nginx
nobody   331122  0.0  0.0  90768 31776 ?        S    11:44   0:00 nginx: worker process
nobody   331123  0.0  0.0  90768 32720 ?        S    11:44   0:00 nginx: worker process
nobody   331124  0.0  0.0  90768 31776 ?        S    11:44   0:00 nginx: worker process</pre>
  <p id="9adc">Конечно, некоторые инструменты не предоставляют возможности переключения на пользователя с минимальными привилегиями. Например, при запуске Redis напрямую с помощью <code>redis-server</code>, нам необходимо самостоятельно управлять переключением удостоверений пользователей. Итак, как же переключить удостоверения пользователей?</p>
  <p id="feb1">Давайте сначала рассмотрим пример Nginx. При запуске Nginx Linux предоставляет идентификатор «nobody». Фактически, когда кто-либо входит в систему Linux, первым полученным идентификатором пользователя является «nobody», а затем он переключается на другие обычные идентификаторы пользователя с «nobody».</p>
  <p id="5c29">Таким образом, у пользователя «nobody» обычно есть минимальные права в операционной системе. Поэтому для инструментов, не предоставляющих минимальной функциональности переключения привилегий, мы можем использовать идентификатор пользователя «nobody» для ручного переключения.</p>
  <p id="7607">При запуске Redis с помощью <code>redis-server</code> мы можем использовать следующую команду для запуска <code>redis-server</code>от имени пользователя «nobody» (при условии, что мы соответствующим образом настроили каталоги для журналов и PID, чтобы гарантировать возможность записи от имени пользователя «nobody»):</p>
  <pre id="3sNg" data-lang="bash">su -s /bin/redis-server nobody</pre>
  <p id="c3f0">Применяя принцип «наименьших привилегий», мы можем повысить безопасность авторизации системы Linux.</p>
  <h3 id="f58e">3. Механизм аудита в Linux</h3>
  <p id="df12">Как мы уже обсуждали ранее, аудит в контексте «золотых правил» в основном включает в себя ведение журнала и анализ. Итак, какие типы журналов существуют в системе Linux? В Linux информация системного журнала обычно хранится в каталоге <code>/var/log</code>, и некоторые приложения также регистрируют соответствующую информацию в этом каталоге. Системные журналы в основном делятся на три категории: журналы входа пользователей, журналы специальных событий и журналы процессов.</p>
  <p id="4d9a">Журналы входа пользователей — это,в основном, файлы <code>/var/log/wtmp</code> и <code>/var/run/utmp</code>, в которых хранится информация, связанная с входами пользователей. Журналы входа пользователей представляют собой двоичные файлы и не могут быть просмотрены напрямую в текстовом формате, но к ним можно получить доступ с помощью таких команд, как <code>who</code>, <code>users</code>, <code>ac</code>, <code>last</code> и <code>lastlog</code>.</p>
  <p id="047c">Журналы специальных событий включают в себя <code>/var/log/secure</code> и <code>/var/log/message</code>. В <code>/var/log/secure</code> в основном регистрируются записи, связанные с аутентификацией и авторизацией. Например, если кто-то попытается взломать SSH методом подбора пароля, этот журнал предоставит информацию о таких попытках. Файл <code>/var/log/message</code> поддерживается демоном <code>syslogd</code>, который предоставляет стандартный механизм записи специальных событий и сообщений. Другие приложения могут использовать этот демон для сообщения о специальных событиях.</p>
  <p id="37d7">Журналы процессов: Когда управление системными процессами выполняется с помощью <code>accton</code>, создается файл, называемый <code>pacct</code>, в котором записываются команды пользователя.</p>
  <p id="f682">По умолчанию Linux использует <code>logrotate</code> для управления стратегиями хранения журналов (такими как ротация журналов и удаление старых журналов). Политики хранения для различных журналов можно изменить, настроив <code>/etc/logrotate.conf</code>.</p>
  <p id="e35c">Итак, как же нам отслеживать журналы? Я рекомендую два распространённых инструмента для анализа журналов: ELK и Zabbix. Эти инструменты можно использовать для мониторинга журналов безопасности Linux. Настроив соответствующие правила на этих аналитических платформах (например, обнаружение более трёх неудачных попыток входа по SSH), мы можем оперативно выявлять попытки вторжения со стороны хакеров и оперативно генерировать оповещения. Затем мы можем вручную проверять журналы для решения конкретных проблем.</p>
  <h2 id="084a">Заключение</h2>
  <p id="cd68">Безопасность систем Linux можно считать платформой с наилучшими практиками для принципа «минимальных привилегий», особенно когда несколько пользователей совместно используют и обслуживают один сервер. Правильная настройка прав доступа в таких ситуациях может быть довольно сложной. Для решения этой проблемы необходимо строго ограничить использование привилегий ROOT. Кроме того, реализация контроля доступа с помощью <code>iptables</code> также может обеспечить существенную защиту от уязвимостей процессов.</p>
  <p id="a8b3">Помимо механизмов самозащиты системы Linux, существуют различные инструменты безопасности, обеспечивающие дополнительные уровни защиты (например, антивирусное ПО и системы обнаружения вторжений на уровне хоста).</p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="TPZY">На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал <a href="https://t.me/usr_bin_linux" target="_blank">usr_bin</a>, где будет еще больше полезной информации.</p>
  </section>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@usr_bin_linux/7-levels-of-app-debug</guid><link>https://teletype.in/@usr_bin_linux/7-levels-of-app-debug?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=usr_bin_linux</link><comments>https://teletype.in/@usr_bin_linux/7-levels-of-app-debug?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=usr_bin_linux#comments</comments><dc:creator>usr_bin_linux</dc:creator><title>Каждый баг, который я когда-либо исправлял, начинал иметь смысл только после того, как я понял эти 7 уровней</title><pubDate>Sun, 01 Mar 2026 21:12:56 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/02/e5/02e59ae1-b931-4a30-a376-c4e262864c2b.png"></media:content><description><![CDATA[<img src="https://miro.medium.com/v2/resize:fit:875/0*VaxXc0pALaZGORw1"></img>Это перевод оригинальной статьи Every Bug I Ever Fixed Made Sense Only After I Understood These 7 Layers.]]></description><content:encoded><![CDATA[
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="32Ey">Это перевод оригинальной статьи <a href="https://medium.com/@kanishks772/every-bug-i-ever-fixed-made-sense-only-after-i-understood-these-7-layers-ebcae423399b" target="_blank">Every Bug I Ever Fixed Made Sense Only After I Understood These 7 Layers</a>.</p>
  </section>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="lAtb">Подписывайтесь на телеграм-канал <a href="https://t.me/usr_bin_linux" target="_blank">usr_bin</a>, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.</p>
  </section>
  <p id="f718">Спустя три года работы я потратил две недели на отладку причин, по которым наш API случайным образом возвращал ошибки 502. Логи были чистыми. Приложение работало исправно. Все указывало на то, что проблем нет. </p>
  <p id="ac62">Затем мимо проходил сетевой инженер и спросил: «А ты проверял, совпадает ли таймаут keepalive у балансировщика нагрузки с таймаутом сервера приложения?»</p>
  <figure id="U4mu" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/0*VaxXc0pALaZGORw1" width="700" />
    <figcaption>Изображение, сгенерированное искусственным интеллектом</figcaption>
  </figure>
  <blockquote id="NHrf">Тогда меня осенило. Я занимался отладкой не на том уровне.</blockquote>
  <h2 id="956a">Семь уровней, которые действительно имеют значение</h2>
  <p id="b780">Модель OSI — это не какое-то академическое упражнение, которое нужно заучивать наизусть для собеседований. Это ментальная модель, которая позволяет не тратить дни, копаясь не там, где нужно.</p>
  <pre id="SB6u" data-lang="bash">Layer 7: Application    [HTTP, DNS, SSH]
Layer 6: Presentation   [TLS, Compression]
Layer 5: Session        [Auth, Connections]
Layer 4: Transport      [TCP, UDP]
Layer 3: Network        [IP, Routing]
Layer 2: Data Link      [Ethernet, MAC]
Layer 1: Physical       [Cables, Signals]</pre>
  <p id="3a0d">Вот что на самом деле происходит при обращении к API:</p>
  <pre id="3qJ2" data-lang="bash">User Request
    |
    v
[Application Layer] - Parse HTTP request
    |
    v
[Transport Layer]   - Establish TCP connection
    |
    v
[Network Layer]     - Route packets via IP
    |
    v
[Data Link Layer]   - Frame data for physical transmission
    |
    v
[Physical Layer]    - Transmit bits over wire</pre>
  <h3 id="6aa5">Уровень 7: Прикладной уровень</h3>
  <p id="a462">Здесь работает большинство разработчиков. Коды состояния HTTP, ответы API, запросы к базе данных. Но вот чего они не говорят: большинство «ошибок в приложениях» на самом деле не являются ошибками приложения.</p>
  <blockquote id="wNIH"><strong>Реальная ошибка:</strong> Пользователи жаловались, что эндпоинт загрузки файлов «не работает». API возвращал <code>200 OK</code>, но файлы не отображались.</blockquote>
  <pre id="Bj0J" data-lang="bash">// The problematic code
func uploadHandler(w http.ResponseWriter, r *http.Request) {
    file, _, err := r.FormFile(&quot;file&quot;)
    if err != nil {
        http.Error(w, err.Error(), http.StatusBadRequest)
        return
    }
    defer file.Close()
    
    // Processing happens here
    w.WriteHeader(http.StatusOK)
    json.NewEncoder(w).Encode(map[string]string{&quot;status&quot;: &quot;success&quot;})
}</pre>
  <p id="ca8b">В чём проблема? Большие файлы (свыше 50 МБ) <strong>тихо отклонялись nginx</strong> ещё до того, как запрос доходил до приложения. Код <code>200</code> приходил от другого запроса, который успешно обработался.</p>
  <p id="9f2e"><strong>Исправление находилось на три уровня ниже:</strong></p>
  <pre id="zb60" data-lang="bash"># /etc/nginx/nginx.conf
client_max_body_size 100M;</pre>
  <h3 id="cd64">Уровень 4: Транспортный уровень</h3>
  <p id="fa6b">TCP против UDP. Таймауты соединения. Исчерпание портов. Этот уровень разрушил бесчисленное количество карьер.</p>
  <blockquote id="qgAy"><strong>Классический сценарий:</strong> приложение перестаёт отвечать под нагрузкой, но показатели процессора и памяти в норме.</blockquote>
  <pre id="BtUM" data-lang="bash"># Check current connections
ss -s

# Output showing the problem
TCP: 28547 (estab 1034, closed 27500, orphaned 12, timewait 27488)</pre>
  <p id="9ab2">27 488 соединений находятся в состоянии TIME_WAIT. Ядру не хватило доступных портов.</p>
  <pre id="dnBA" data-lang="bash">// Before (bad) - Creates new connection every time
func fetchUsers(userIDs []string) error {
    for _, id := range userIDs {
        resp, err := http.Get(fmt.Sprintf(&quot;https://api.example.com/user/%s&quot;, id))
        if err != nil {
            return err
        }
        defer resp.Body.Close()
        // Process response
    }
    return nil
}

// After (good) - Reuses connections
var client = &amp;http.Client{
    Timeout: 10 * time.Second,
    Transport: &amp;http.Transport{
        MaxIdleConns:        100,
        MaxIdleConnsPerHost: 10,
        IdleConnTimeout:     90 * time.Second,
    },
}

func fetchUsers(userIDs []string) error {
    for _, id := range userIDs {
        resp, err := client.Get(fmt.Sprintf(&quot;https://api.example.com/user/%s&quot;, id))
        if err != nil {
            return err
        }
        defer resp.Body.Close()
        // Process response
    }
    return nil
}</pre>
  <blockquote id="RcwH"><strong>Результаты теста производительности:</strong> использование пула соединений снизило время запроса с 340 мс до 12 мс под нагрузкой (1000 запросов).</blockquote>
  <h3 id="d42b">Уровень 3: Сетевой уровень</h3>
  <p id="8514">Маршрутизация IP-адресов, маски подсети, разрешение DNS. Если ваш сервис не может связаться с другим сервисом, именно здесь следует искать причину.</p>
  <pre id="eJpO" data-lang="bash"># Trace the actual route packets take
traceroute api.internal.company.com

# Check if DNS is lying to you
nslookup api.internal.company.com</pre>
  <blockquote id="tsuP"><strong>История из практики:</strong> соединения с базой данных периодически прерывались из-за таймаута. База данных работала исправно. Приложение работало исправно. Сетевая команда настаивала, что всё в порядке.</blockquote>
  <pre id="Q5CN" data-lang="bash"># This revealed the truth
mtr --report --report-cycles 100 db.internal.company.com

# Packet loss at hop 4: 23%</pre>
  <p id="45f7">Неправильно настроенный маршрутизатор между двумя дата-центрами терял пакеты. Приложение считало, что проблема в базе данных, и продолжало попытки подключения, что только усугубляло ситуацию.</p>
  <h3 id="8fde">Уровень 2: Канальный уровень</h3>
  <p id="37b3">MAC-адреса, коммутаторы, VLAN. Отладка здесь, вероятно, будет нечастой, но когда она всё-таки потребуется, всё остальное перестанет иметь значение.</p>
  <p id="2ce8">В облачных средах это проявляется как «перегрузка сетевого интерфейса». Для экземпляра EC2 существует жесткое ограничение на количество пакетов в секунду, зависящее от типа экземпляра.</p>
  <pre id="nsCK" data-lang="bash"># Check interface stats
ip -s link show eth0

# Look for TX/RX errors or drops</pre>
  <h2 id="f9a1">Процесс отладки, который действительно работает</h2>
  <p id="1a51">Перестаньте гадать. Начните мыслить уровнями.</p>
  <pre id="8LkU" data-lang="bash">1. Application logs clean?        -&gt; Go down one layer
2. TCP connections normal?         -&gt; Go down one layer  
3. Can you ping the destination?   -&gt; Go down one layer
4. Is the cable plugged in?        -&gt; Go outside and touch grass</pre>
  <p id="0ba7"><strong>Реальная сессия отладки:</strong></p>
  <pre id="r6RZ" data-lang="bash"># Layer 7: Application
curl https://api.example.com/health
# Returns 503

# Layer 4: Transport
telnet api.example.com 443
# Connection refused

# Layer 3: Network
ping api.example.com
# Host unreachable

# Layer 2: (Skipped in cloud)
# Resolution: DNS was returning wrong IP
nslookup api.example.com

# Pointed to decommissioned server</pre>
  <h2 id="265c">Паттерн, который вы увидите повсюду.</h2>
  <p id="c3a1">После того, как вы поймете, что такое уровни, вы начнете замечать их повсюду:</p>
  <p id="5f46"><strong>Сетевое взаимодействие в Kubernetes:</strong></p>
  <ul id="akoL">
    <li id="2e5c">Взаимодействие между модулями: уровень 3 (IP)</li>
    <li id="ec1a">Сервис для пода: Уровень 4 (TCP/UDP + порты)</li>
    <li id="4afe">Входящий трафик: Уровень 7 (маршрутизация HTTP)</li>
  </ul>
  <p id="784d"><strong>Проблемы с балансировщиком нагрузки:</strong></p>
  <ul id="TeDU">
    <li id="f4a5"><code>Connection refused</code>: Уровень 4 (неверный порт/протокол)</li>
    <li id="42bc"><code>502 Bad Gateway</code>: Layer 7 (upstream timeout)</li>
    <li id="98b2"><code>Connection timeout</code>: Уровень 3 (маршрутизация/брандмауэр)</li>
  </ul>
  <h2 id="2593">Что изменилось для меня</h2>
  <p id="6e24">Я перестал говорить «сеть не работает» и начал спрашивать «на каком уровне произошла поломка?». Я перестал отлаживать систему интуитивно и начал отлаживать методом исключения.</p>
  <p id="592a">Та ошибка 502, что была с самого начала? У балансировщика нагрузки (уровень 7) был keepalive 60 секунд. У сервера приложений (уровень 4) — 65 секунд. Когда балансировщик нагрузки закрывал соединение, приложение всё ещё считало, что оно открыто. Следующий запрос попадал в неактивный сокет.</p>
  <pre id="PdPq" data-lang="bash">// The fix
server := &amp;http.Server{
    Addr:              &quot;:8080&quot;,
    Handler:           router,
    ReadTimeout:       15 * time.Second,
    WriteTimeout:      15 * time.Second,
    IdleTimeout:       50 * time.Second, // Less than LB&#x27;s 60s
    ReadHeaderTimeout: 5 * time.Second,
}</pre>
  <p id="b8be">Семь уровней предназначены не для запоминания расположения SMTP. Они о том, чтобы знать, куда смотреть, когда всё ломается. А всё всегда ломается.</p>
  <blockquote id="ktIc">Как только вы научитесь видеть сквозь слои, отладка перестанет быть археологией и превратится в инженерное дело.</blockquote>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="uGp2">На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал <a href="https://t.me/usr_bin_linux" target="_blank">usr_bin</a>, где будет еще больше полезной информации.</p>
  </section>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@usr_bin_linux/devops-tools</guid><link>https://teletype.in/@usr_bin_linux/devops-tools?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=usr_bin_linux</link><comments>https://teletype.in/@usr_bin_linux/devops-tools?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=usr_bin_linux#comments</comments><dc:creator>usr_bin_linux</dc:creator><title>Инструменты DevOps с открытым исходным кодом, о которых я хотел бы узнать раньше.</title><pubDate>Sun, 01 Mar 2026 21:06:21 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/92/71/9271decb-c246-4345-b9f6-056c60ca4bc8.png"></media:content><description><![CDATA[<img src="https://miro.medium.com/v2/resize:fit:875/1*xudgOzai3622me-FEItwOA.png"></img>Это перевод оригинальной статьи Open-Source DevOps Tools I Wish I Knew About Sooner.]]></description><content:encoded><![CDATA[
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="Nqb5">Это перевод оригинальной статьи <a href="https://medium.com/codetodeploy/open-source-devops-tools-i-wish-i-knew-about-sooner-ad6a022da671" target="_blank">Open-Source DevOps Tools I Wish I Knew About Sooner</a>.</p>
  </section>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="07tf">Подписывайтесь на телеграм-канал <a href="https://t.me/usr_bin_linux" target="_blank">usr_bin</a>, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.</p>
  </section>
  <p id="ed03">Когда я только начинал работать в DevOps, я думал, что всё должно быть дорогим.<br />Мониторинг? Платный. CI/CD? Платный. Логирование? Платное.<br />Даже такие простые вещи, как проверка доступности, стоили денег.</p>
  <p id="4130">Мне потребовалось несколько болезненных счетов, чтобы осознать одну вещь:</p>
  <blockquote id="op43"><em>Практически у каждого крупного DevOps-инструмента есть open-source альтернатива, и многие из них на самом деле</em> лучше<em>.</em></blockquote>
  <p id="b862">Это те инструменты, которые я хотел бы, чтобы меня заставили изучить раньше.<br />Они бы сэкономили мне деньги, время и кучу нервов.</p>
  <p id="5f7e"></p>
  <h2 id="ccf4">1. Portainer → Графический интерфейс Docker, о необходимости которого я даже не подозревал.</h2>
  <figure id="sYzZ" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/1*xudgOzai3622me-FEItwOA.png" width="700" />
    <figcaption><a href="https://www.portainer.io/" target="_blank">https://www.portinaer.io/</a></figcaption>
  </figure>
  <p id="b48d"><strong>Ссылка: <a href="https://www.portinaer.io/" target="_blank">https://www.portinaer.io/</a></strong></p>
  <p id="9ddd">Раньше я управлял Docker исключительно с помощью командной строки.<br />Всё было хорошо… пока у меня не появились десятки контейнеров, стеков, сетей и томов.</p>
  <p id="22fc">Portainer предоставляет вам:</p>
  <ul id="ubO3">
    <li id="7a40">Визуальная панель мониторинга</li>
    <li id="e628">Логи и статистика контейнеров</li>
    <li id="5788">Развертывание в один клик</li>
    <li id="4449">Шаблоны стека</li>
    <li id="8e7b">Контроль доступа пользователей</li>
  </ul>
  <p id="e104"><strong>Реальный пример:</strong><br />я управляю несколькими небольшими клиентскими приложениями на VPS-серверах.<br />Portainer превратил управление контейнерами из запутанных терминальных джунглей в удобный дашборд, где я могу перезапускать, обновлять или проверять контейнеры за считанные секунды.</p>
  <h2 id="8ad8">2. Jenkins→ Моя первая настоящая свобода в области CI/CD</h2>
  <figure id="99lj" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/1*WBCdmpqUyiu3IjIzxrnlBQ.png" width="700" />
    <figcaption><a href="https://www.jenkins.io/" target="_blank">https://www.jenkins.io/</a></figcaption>
  </figure>
  <p id="d36e"><strong>Ссылка: </strong><a href="https://www.jenkins.io/" target="_blank">https://www.jenkins.io/</a></p>
  <p id="3fb2">До появления Jenkins я в значительной степени полагался на SaaS-инструменты для непрерывной интеграции.<br />Они удобны, но бесплатные ограничения просто ужасны.</p>
  <p id="55cc">Jenkins предоставляет:</p>
  <ul id="r9fw">
    <li id="4b8a">Неограниченное количество пайплайнов</li>
    <li id="1912">Кастомные агенты</li>
    <li id="37c8">Огромная экосистема плагинов</li>
    <li id="a4eb">Полный контроль над сборкой.</li>
  </ul>
  <p id="e9c2">Однажды я собрал пайплайн, который:</p>
  <ol id="8ygW">
    <li id="0260">Запускал тесты</li>
    <li id="9ec7">Генерировал Docker-образы</li>
    <li id="5cf6">Деплоил в Kubernetes</li>
    <li id="6428">Отправлял уведомления в Slack</li>
  </ol>
  <p id="d395">Всё работает на сервере за 10 долларов. Никаких ограничений. Никаких неожиданностей.</p>
  <h2 id="1a4f">3. Prometheus + Grafana → Замена облачного мониторинга</h2>
  <p id="ed6a"><strong>Ссылки:</strong><br />Prometheus: <a href="https://prometheus.io/" target="_blank">https://prometheus.io/</a><br />Grafana: <a href="https://grafana.com/" target="_blank">https://grafana.com/</a></p>
  <p id="6cd4">Все облачные провайдеры взимают дополнительную плату за панели мониторинга.<br />По мере масштабирования эти суммы быстро растут.</p>
  <p id="fb36">Prometheus обрабатывает метрики.<br />Grafana великолепно их визуализирует.</p>
  <p id="e97e"><strong>Где это меня выручило:</strong><br />я развернул их в кластере Kubernetes — и внезапно у меня появилось:</p>
  <ul id="hrVr">
    <li id="7eb1">Панели мониторинга ЦП/памяти</li>
    <li id="15ab">Графики состояния Pod’ов</li>
    <li id="49b0">Пользовательские оповещения</li>
    <li id="283c">Метрики производительности узлов</li>
  </ul>
  <p id="2f52">И всё это бесплатно.</p>
  <h2 id="6903">4. Alertmanager → Оповещения без оплаты</h2>
  <figure id="sZWC" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/1*VyuytCPOf1Xof8S5LXyS5w.png" width="700" />
    <figcaption><a href="https://prometheus.io/" target="_blank">https://prometheus.io/</a></figcaption>
  </figure>
  <p id="2e46"><strong>Ссылка: </strong><a href="https://prometheus.io/docs/alerting/latest/alertmanager/" target="_blank">https://prometheus.io/docs/alerting/latest/alertmanager/</a></p>
  <p id="e7c9">Уведомления по электронной почте… бесплатно.<br />Уведомления в Slack… бесплатно.<br />Уведомления Webhook… бесплатно.</p>
  <p id="84a8">До того, как я открыл для себя Alertmanager, я полагался на платные инструменты только для получения уведомлений.</p>
  <p id="e5fe">После настройки с помощью Prometheus я смог:</p>
  <ul id="CLja">
    <li id="5018">Получать оповещения о перезапуске подов.</li>
    <li id="f062">Отслеживать высокую загрузку ЦП.</li>
    <li id="20f5">Выявлять сбои при развертывании</li>
  </ul>
  <p id="1d46">Никакого спама в SMS-сообщениях/уведомлениях, никаких скрытых платежей.</p>
  <h2 id="54b8">5. Loki → Инструмент логирования, который следовало использовать с самого первого дня.</h2>
  <figure id="FfHU" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/1*ZBsAYl6K-v3FQaJt5IYKiA.png" width="700" />
    <figcaption><a href="https://grafana.com/oss/loki/" target="_blank">https://grafana.com/oss/loki/</a></figcaption>
  </figure>
  <p id="7172"><strong>Ссылка: </strong><a href="https://grafana.com/oss/loki/" target="_blank">https://grafana.com/oss/loki/</a></p>
  <p id="e3e3">Раньше я перенаправлял логи в случайные папки и “cat”-ил их как пещерный человек.<br />Потом появился Loki — инструмент агрегации логов с открытым исходным кодом от Grafana.</p>
  <p id="f48b">Это как Elasticsearch, но легче и проще в использовании.</p>
  <p id="4f41"><strong>Где это помогло:</strong><br />Логи срабатывали на:</p>
  <ul id="SbDG">
    <li id="1078">Циклических сбоях Node.js</li>
    <li id="7bb9">Ошибки подключения к базе данных</li>
    <li id="5caa">Неожиданные ошибки 500</li>
  </ul>
  <p id="0279">И всё это можно было искать в одном дашборде.</p>
  <h2 id="95c4">6. Argo CD → GitOps: правильный подход</h2>
  <figure id="ACyx" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/1*11IwlPEU4IxM9B-C6j6s7g.png" width="700" />
    <figcaption><a href="https://argo-cd.readthedocs.io/" target="_blank">https://argo-cd.readthedocs.io/</a></figcaption>
  </figure>
  <p id="3aec"><strong>Ссылка: </strong><a href="https://argo-cd.readthedocs.io/" target="_blank">https://argo-cd.readthedocs.io/</a></p>
  <p id="e3b4">Если вы работаете с Kubernetes, Argo CD кажется почти волшебным инструментом.</p>
  <p id="5283">Он за вашим Git-репозиторием и автоматически синхронизирует ваш кластер с манифестами.</p>
  <p id="c4f1">Значение:</p>
  <ul id="jpl6">
    <li id="a30c">Нет необходимости вручную выполнять <code>kubectl apply</code></li>
    <li id="ae1c">Автоматический откат</li>
    <li id="d3f1">мониторинг состояния приложения</li>
    <li id="f643">развертывание с контролем версий</li>
  </ul>
  <p id="0cb8">После того, как я настроил его в среде микросервисов, развертывание стало выглядеть следующим образом:</p>
  <pre id="tJdN" data-lang="bash">git push</pre>
  <p id="65d1">Вот и всё. Argo позаботился обо всём остальном.</p>
  <h2 id="d76c">7. Traefik → Обратный прокси, который наконец-то стал понятным.</h2>
  <figure id="HjJz" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/1*ZJCFXkVAchcXqYYEVvpYKA.png" width="700" />
    <figcaption><a href="https://traefik.io/" target="_blank">https://traefik.io/</a></figcaption>
  </figure>
  <p id="cbd4"><strong>Ссылка: </strong><a href="https://traefik.io/" target="_blank">https://traefik.io/</a></p>
  <p id="fcc8">Конфигурации NGINX заставили меня возненавидеть жизнь.<br />А потом я открыл для себя Traefik.</p>
  <p id="1202">Traefik автоматически:</p>
  <ul id="A8IO">
    <li id="6b11">Обнаруживает контейнеры</li>
    <li id="b94e">Генерирует правила маршрутизации</li>
    <li id="d931">Выдает SSL-сертификаты</li>
    <li id="3bf7">Управляет балансировкой нагрузки</li>
  </ul>
  <p id="d69f"><strong>Пример:</strong><br />я развернул несколько микросервисов с метками Docker, и Traefik мгновенно их обнаружил с действительным HTTPS-соединением — без необходимости вручную настраивать файлы конфигурации.</p>
  <h2 id="7848">8. MinIO → Open-Source хранилище S3</h2>
  <p id="041c">(Бесплатное использование прекращено, но исходный код доступен по ссылке <a href="https://github.com/minio/minio" target="_blank">: https://github.com/minio/minio</a> )</p>
  <p id="3035"><strong>Ссылка: </strong><a href="https://min.io/" target="_blank">https://min.io/</a></p>
  <p id="1d7e">AWS S3 — отличный сервис, но не всегда дешевый.</p>
  <p id="96fd">MinIO предоставляет вам:</p>
  <ul id="Ch2U">
    <li id="0726">Объектное хранилище</li>
    <li id="fab5">S3-совместимые API</li>
    <li id="969e">Высокую производительность</li>
    <li id="4cba">Свободу самостоятельного хостинга</li>
  </ul>
  <p id="1dee">Я использовал его для хранения:</p>
  <ul id="bLlM">
    <li id="2b31">Логов</li>
    <li id="3e49">Резервных копий</li>
    <li id="6b31">Медиафайлов</li>
    <li id="1a8a">Ресурсов приложений</li>
  </ul>
  <p id="73ea">С тех пор я использую MinIO для локальной разработки, тестовых окружений и даже некоторых производственных задач.</p>
  <h2 id="7bd5">9. K9s → Терминальный интерфейс для Kubernetes</h2>
  <figure id="EZsx" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/1*qalPYgOQu3QHz1AeDHfoOg.png" width="700" />
    <figcaption><a href="https://k9scli.io/" target="_blank">https://k9scli.io/</a></figcaption>
  </figure>
  <p id="0592"><strong>Ссылка: </strong><a href="https://k9scli.io/" target="_blank">https://k9scli.io/</a></p>
  <p id="2af7">kubectl — мощный… но иногда мучительный.</p>
  <p id="9142">K9s предоставляет вам интерактивную панель управления терминала:</p>
  <ul id="OpCj">
    <li id="3355">Pods</li>
    <li id="c85b">Логи</li>
    <li id="565a">Доступ к оболочке</li>
    <li id="5e06">События</li>
    <li id="3c9e">Развертывания</li>
  </ul>
  <p id="57e2">Это как «htop», но для вашего кластера.</p>
  <p id="1e36">Я использую его ежедневно — он значительно ускоряет отладку.</p>
  <h2 id="8f59">10. Gitea → Самостоятельно размещаемая альтернатива GitHub</h2>
  <p id="95d7"><strong>Ссылка: </strong><a href="https://about.gitea.com/" target="_blank">https://about.gitea.com/</a></p>
  <p id="f609">Для небольших команд и внутренних репозиториев GitHub может быть излишним.</p>
  <p id="c368">Gitea предоставляет вам:</p>
  <ul id="M8B5">
    <li id="8f99">Git-хостинг</li>
    <li id="dade">Issues (задачи)</li>
    <li id="c0ef">Запросы на слияние</li>
    <li id="b827">интеграции CI</li>
    <li id="22a5">Использование серверов с минимальными затратами ресурсов</li>
  </ul>
  <p id="d6f9">Я настроил её для внутреннего корпоративного проекта, и разработчики оценили, насколько быстро и удобно всё работает.</p>
  <h2 id="cb49">Заключительные мысли</h2>
  <p id="1999">DevOps не обязательно должен быть дорогим.<br />Для большинства инструментов, которые профессионалы используют ежедневно, уже существуют мощные версии с открытым исходным кодом.</p>
  <p id="504b">А самое главное?</p>
  <blockquote id="yVtQ"><em>Использование инструментов с открытым исходным кодом заставляет вас действительно понимать, как работает ваша инфраструктура.</em></blockquote>
  <p id="bd42">Если вы прокачиваете навыки DevOps или модернизируете стек, начните с этих инструментов.<br />Они сэкономят вам деньги — и сделают вас лучшим инженером.</p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="Za99">На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал <a href="https://t.me/usr_bin_linux" target="_blank">usr_bin</a>, где будет еще больше полезной информации.</p>
  </section>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@usr_bin_linux/bash-mastering</guid><link>https://teletype.in/@usr_bin_linux/bash-mastering?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=usr_bin_linux</link><comments>https://teletype.in/@usr_bin_linux/bash-mastering?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=usr_bin_linux#comments</comments><dc:creator>usr_bin_linux</dc:creator><title>Лайфхаки по написанию скриптов на Bash, которые должен знать каждый разработчик</title><pubDate>Sun, 01 Mar 2026 21:04:23 GMT</pubDate><description><![CDATA[Это перевод оригинальной статьи Bash Scripting Hacks Every Developer Should Know.]]></description><content:encoded><![CDATA[
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="l4Zv">Это перевод оригинальной статьи <a href="https://medium.com/the-software-journal/bash-scripting-hacks-every-developer-should-know-05e6720a6825" target="_blank">Bash Scripting Hacks Every Developer Should Know</a>.</p>
  </section>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="zaNJ">Подписывайтесь на телеграм-канал <a href="https://t.me/usr_bin_linux" target="_blank">usr_bin</a>, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.</p>
  </section>
  <h3 id="0a4b">Небольшие хитрости Bash, которые сэкономят часы, предотвратят катастрофы и незаметно улучшат рабочий процесс разработчика.<br /></h3>
  <h2 id="f86a">Введение: Bash — это навык, который вы, сами того не зная, игнорировали.</h2>
  <p id="1827">Большинство разработчиков «знают» Bash так же, как и Git: ровно столько, чтобы справляться. Несколько команд в памяти. Скрипт скопирован со Stack Overflow. Молитва перед нажатием Enter.</p>
  <p id="2147">Но Bash — это не просто язык программирования для энтузиастов Linux или специалистов по DevOps. Это невидимая сила, стоящая за автоматизацией, отладкой, деплоями, обработкой данных и бесчисленным количеством повседневных задач. Разница между медленным разработчиком и пугающе эффективным часто сводится к тому, насколько хорошо он владеет shell’ом.</p>
  <p id="9a24">Эта статья не о запоминании малоизвестных флагов. Она о практических приемах написания скриптов на Bash — небольших идеях, оказывающих огромное влияние. Идеях, которые делают ваши скрипты безопаснее, чище и проще в обслуживании. Идеях, которые вы хотели бы увидеть много лет назад.</p>
  <p id="5c84">Давайте прокачаем вашу интуицию.</p>
  <h2 id="313b">1. Всегда запускайте скрипты в «строгом режиме».</h2>
  <p id="3829">Большинство скриптов Bash завершаются с ошибкой без предупреждения. Это опасно.</p>
  <p id="56d7">Первый полезный совет, который должен знать каждый разработчик, — это включение строгого режима в начале скриптов:</p>
  <pre id="376i" data-lang="bash">set -euo pipefail</pre>
  <p id="2a6f">Вот что делает эта единственная строка:</p>
  <ul id="uKZj">
    <li id="86c4"><code>-e</code>: В случае сбоя команды немедленно завершить работу.</li>
    <li id="c9db"><code>-u</code>: Cчитает необъявленные переменные ошибкой</li>
    <li id="5d96"><code>-o pipefail</code>: пайплайн считается упавшим, если любая команда завершилась с ошибкой.</li>
  </ul>
  <p id="ebbb">Без этого ваш скрипт может прерваться на полпути и продолжить работу, как ни в чем не бывало. В строгом режиме сбои происходят громко и мгновенно — именно то, что нужно для автоматизации.</p>
  <p id="e1aa">Считайте это превращением runtime-ошибок в compile-time-ошибки для Bash.</p>
  <h2 id="7366">2. Используйте <code>&quot;$@&quot;</code> вместо <code>$*</code> (Да, это важно)</h2>
  <p id="6283">Если ваш скрипт принимает аргументы, эта деталь может сэкономить вам часы отладки.</p>
  <p id="59ed">Всегда используйте:</p>
  <pre id="1RiJ" data-lang="bash">&quot;$@&quot;</pre>
  <p id="51e3">Вместо:</p>
  <pre id="XaSj" data-lang="bash">$*</pre>
  <p id="6da3">Почему? Потому что <code>&quot;$@&quot;</code> сохраняет границы аргументов. Пробелы остаются неизменными. Имена файлов не распадаются на части. Ваш скрипт работает корректно, когда пользователи передают строки в кавычках.</p>
  <p id="3433">Это одно из тех правил Bash, которое кажется излишне педантичным — пока из-за них не ломается что-то важное в продакшене.</p>
  <h2 id="c717">3. Давайте своим переменным точные имена</h2>
  <p id="dc94">В Bash нет типов, но имена — это ваша система безопасности.</p>
  <p id="f705">Плохо:</p>
  <pre id="99nA" data-lang="bash">x=10
y=&quot;file.txt&quot;</pre>
  <p id="aaa5">Лучше:</p>
  <pre id="ERE1" data-lang="bash">MAX_RETRIES=10
INPUT_FILE=&quot;file.txt&quot;</pre>
  <p id="3d06">Почему заглавные буквы? Потому что в соглашениях Bash переменные, написанные заглавными буквами, рассматриваются как константы или параметры конфигурации. Это также помогает избежать конфликтов с переменными окружения или именами команд.</p>
  <p id="2912">Правильно подобранные имена переменных превращают уязвимые скрипты в читаемые программы.</p>
  <h2 id="794b">4. Используйте <code>$(...)</code> вместо обратных кавычек.</h2>
  <p id="6736">Если вы всё ещё используете обратные кавычки, пора от них отказаться.</p>
  <p id="9e3f">Старый вариант:</p>
  <pre id="29lp" data-lang="bash">files=&#x60;ls&#x60;</pre>
  <p id="06e2">Современный вариант:</p>
  <pre id="7yxl" data-lang="bash">files=$(ls)</pre>
  <p id="c6d0">Замена команд с помощью <code>$(...)</code> выглядит следующим образом:</p>
  <ul id="xXOL">
    <li id="ddf1">Легче читать</li>
    <li id="fe4c">Легче вкладывается</li>
    <li id="56be">Менее подвержен ошибкам</li>
  </ul>
  <p id="743a">Речь идёт не просто о предпочтениях в синтаксисе. Речь идёт о написании кода на Bash, который не будет создавать проблем по мере своего развития.</p>
  <h2 id="8f7b">5. Быстро выявляйте ошибки с помощью явных сообщений об ошибках.</h2>
  <p id="563c">Если что-то пошло не так, в вашем скрипте должно быть указано, <em>почему</em>.</p>
  <p id="a829">Вместо того чтобы позволять Bash загадочным образом завершать работу с ошибкой, сделайте следующее:</p>
  <pre id="7vxF" data-lang="bash">command || {
  echo &quot;❌ Failed to run command&quot;
  exit 1
}</pre>
  <p id="590d">А ещё лучше — оберните это в функцию:</p>
  <pre id="UfvE" data-lang="bash">die() {
  echo &quot;Error: $1&quot; &gt;&amp;2
  exit 1
}</pre>
  <p id="f220">Теперь ваши скрипты не просто терпят неудачу — они умеют доносить информацию. И вы в будущем поблагодарите себя в настоящем за эту ясность.</p>
  <h2 id="20eb">6. Используйте функции (даже в небольших скриптах).</h2>
  <p id="1990">Многие разработчики избегают использования функций в Bash, считая их излишними.</p>
  <p id="998b">Нет.</p>
  <p id="c1dc">Функции позволяют вам:</p>
  <ul id="yrlA">
    <li id="27e6">Избегать дублирования</li>
    <li id="61b5">Инкапсулировать логику</li>
    <li id="abce">Сделать скрипты читаемыми от начала до конца.</li>
  </ul>
  <p id="855d">Пример:</p>
  <pre id="Endw" data-lang="bash">cleanup() {
  rm -rf /tmp/my_app
}</pre>
  <p id="b6b9">Вам не нужен объектно-ориентированный Bash. Вам нужна лишь структура. Функции — это самый простой способ добиться успеха.</p>
  <h2 id="d4e7">7. Перехватывайте сигналы как профессионал</h2>
  <p id="d602">Случалось ли вам когда-нибудь сталкиваться с тем, что скрипт оставляет незавершенные файлы после нажатия Ctrl+C?</p>
  <p id="9d0d">Это потому, что вы не перехватили сигналы.</p>
  <pre id="0kCe" data-lang="bash">trap cleanup EXIT INT TERM</pre>
  <p id="8636">Это гарантирует, что ваша логика очистки будет выполнена даже в случае неожиданного завершения работы скрипта.</p>
  <p id="87f4">Ловушки необходимы для:</p>
  <ul id="rq9e">
    <li id="8547">Временных файлов</li>
    <li id="f9b2">Файлов блокировки</li>
    <li id="17b4">Фоновых процессов</li>
  </ul>
  <p id="ade3">Они превращают сценарии, в которых &quot;надеемся, ничего не пойдет не так&quot;, в сценарии, в которых &quot;готовы к хаосу&quot;.</p>
  <h2 id="3352">8. Кавычьте переменные так, будто от этого зависит ваша работа</h2>
  <p id="fdbb">В Bash не заключенные в кавычки переменные — это мины замедленного действия.</p>
  <p id="3cd2">Плохой:</p>
  <pre id="G3xa" data-lang="bash">rm $file</pre>
  <p id="8125">Хороший:</p>
  <pre id="Pyfd" data-lang="bash">rm &quot;$file&quot;</pre>
  <p id="91b3">Если переменная <code>$file</code> содержит пробелы, символы шаблона или пуста, отсутствие кавычек может привести к потере данных.</p>
  <p id="eaef">Хорошее эмпирическое правило: <strong>если это переменная, заключите её в кавычки.</strong> Исключения бывают, но новичкам не следует на них полагаться.</p>
  <p id="1392">Одна эта привычка предотвращает одни из самых страшных shell-багов, каких только можно себе представить.</p>
  <h2 id="ad1b">9. Используйте массивы вместо строк, разделённых пробелами.</h2>
  <p id="164b">Bash поддерживает массивы. Используйте их.</p>
  <p id="ccab">Вместо:</p>
  <pre id="c22M" data-lang="bash">files=&quot;a.txt b.txt c.txt&quot;</pre>
  <p id="3e61">Сделайте следующее:</p>
  <pre id="pmY3" data-lang="bash">files=(&quot;a.txt&quot; &quot;b.txt&quot; &quot;c.txt&quot;)</pre>
  <p id="e4da">Массивы сохраняют структуру, безопасно работают с пробелами и ведут себя предсказуемо.</p>
  <p id="25f4">Циклы становятся безопаснее:</p>
  <pre id="6weW" data-lang="bash">for file in &quot;${files[@]}&quot;; do
  echo &quot;$file&quot;
done</pre>
  <p id="f98b">Как только вы научитесь правильно использовать массивы, вы уже никогда не захотите возвращаться к прежнему способу работы.</p>
  <h2 id="2179">10. Читайте файлы построчно правильно.</h2>
  <p id="da42">Это классическая ловушка.</p>
  <p id="4328">Неправильно:</p>
  <pre id="Kymi" data-lang="bash">for line in $(cat file.txt); do</pre>
  <p id="6ee9">Верно:</p>
  <pre id="zNI8" data-lang="bash">while IFS= read -r line; do
  echo &quot;$line&quot;
done &lt; file.txt</pre>
  <p id="2934">Правильный подход:</p>
  <ul id="DeAG">
    <li id="593f">Сохраняет пробелы</li>
    <li id="ed06">Не зависает при работе со специальными символами.</li>
    <li id="2f27">Эффективно работает с большими файлами</li>
  </ul>
  <p id="7d0e">Это может показаться многословным, но это единственный безопасный способ.</p>
  <h2 id="4a49">11. Используйте <code>set -x</code> для тонкой отладки</h2>
  <p id="bde5">Когда скрипт работает некорректно, догадки не помогут.</p>
  <p id="9763">Включить трассировку выполнения:</p>
  <pre id="VDuG" data-lang="bash">set -x</pre>
  <p id="aa83">Bash выводит каждую команду перед её выполнением. Это бесценно для:</p>
  <ul id="3gZv">
    <li id="8e77">Падений в CI</li>
    <li id="d266">Неожиданных значений переменных</li>
    <li id="c506">Логических ошибок</li>
  </ul>
  <p id="491f">Вы даже можете включить его временно:</p>
  <pre id="GjVL" data-lang="bash">set -x
# debug section
set +x</pre>
  <p id="1914">Это встроенный отладчик Bash. Используйте его.</p>
  <h2 id="aa37">12. Предпочитайте [[ ... ]] вместо [ ... ]</h2>
  <p id="ec34">Тестовые выражения старого образца ненадежны.</p>
  <p id="e250">Используйте:</p>
  <pre id="okHB" data-lang="bash">if [[ &quot;$a&quot; == &quot;$b&quot; ]]; then</pre>
  <p id="ee86">Вместо:</p>
  <pre id="MNaZ" data-lang="bash">if [ &quot;$a&quot; = &quot;$b&quot; ]; then</pre>
  <p id="7f16">Почему?</p>
  <ul id="9nIE">
    <li id="e933">Без разделения слов</li>
    <li id="86d6">Более безопасное сравнение строк</li>
    <li id="7ef1">Поддержка регулярных выражений</li>
    <li id="a2c2">Меньше проблем с кавычками</li>
  </ul>
  <p id="1836"><code>[[ ... ]]</code> — это одно из лучших улучшений Bash. Воспользуйтесь им.</p>
  <h2 id="ac53">13. Используйте Here-Docs для корректного многострочного ввода.</h2>
  <p id="e6ec">Когда в скрипты начинают встраиваться SQL-запросы, файлы конфигурации или большие текстовые блоки, читаемость ухудшается.</p>
  <p id="7664">Here-docs это исправляет:</p>
  <pre id="zcAF" data-lang="bash">cat &lt;&lt;EOF &gt; config.yaml
port: 8080
env: production
EOF</pre>
  <p id="a596">Они идеально подходят для:</p>
  <ul id="rfr7">
    <li id="af38">Шаблонов</li>
    <li id="cf07">Docker-конфигураций</li>
    <li id="4fdf">Встроенной документации</li>
  </ul>
  <p id="dd2c">Читаемый Bash — это поддерживаемый Bash.</p>
  <h2 id="ac8f">14. Делайте скрипты самодокументируемыми</h2>
  <p id="7807">Добавьте <code>--help</code> флаг.</p>
  <p id="d2cb">Серьезно.</p>
  <pre id="elCu" data-lang="bash">if [[ &quot;$1&quot; == &quot;--help&quot; ]]; then
  echo &quot;Usage: script.sh [options]&quot;
  exit 0
fi</pre>
  <p id="a24a">Даже короткое описание использования резко повышает удобство — для коллег и для вас из будущего.</p>
  <p id="84f1">Профессиональные скрипты объясняют себя сами.</p>
  <h2 id="1b30">15. Относитесь к скриптам Bash как к настоящему программному обеспечению.</h2>
  <p id="b204">Это самый главный хак.</p>
  <p id="72fd">Большинство скриптов Bash не работают не потому, что Bash плох, а потому, что мы относимся к скриптам как к одноразовому коду.</p>
  <p id="0284">Сделайте следующее:</p>
  <ul id="CBU7">
    <li id="1007">Используйте систему контроля версий.</li>
    <li id="86aa">Добавляйте комментарии там, где их смысл не очевиден.</li>
    <li id="5e23">Проводите рефакторинг по мере роста скриптов.</li>
    <li id="4aba">Тестируйте в чистых окружениях</li>
  </ul>
  <p id="385a">Bash поощряет дисциплину. Игнорируйте её, и он даст отпор.</p>
  <h2 id="8b12">Вывод: Bash — это инструмент, многократно увеличивающий эффективность.</h2>
  <p id="095e">Bash-скриптинг — это не про то, чтобы стать рок-звездой терминала. Bash-скриптинг — это про то, чтобы сделать вашу рабочую жизнь проще. Отправка сообщения в Slack. Загрузка случайной шутки в ваши сообщения. Поиск случайной картинки для добавления в ваши сообщения.</p>
  <p id="c885">Вам не обязательно быть экспертом во всех аспектах Bash. Всё, что вам нужно, — это несколько полезных навыков и уверенность в их применении.</p>
  <p id="7a46">Терминал — это место, где выполняются команды, но именно там сосредоточено влияние.</p>
  <p id="41a0"><em>Если вы достаточно хорошо освоите программирование на Bash, ваш компьютер начнет работать на вас, а не наоборот.</em></p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="7D3C">На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал <a href="https://t.me/usr_bin_linux" target="_blank">usr_bin</a>, где будет еще больше полезной информации.</p>
  </section>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@usr_bin_linux/ssh-guide</guid><link>https://teletype.in/@usr_bin_linux/ssh-guide?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=usr_bin_linux</link><comments>https://teletype.in/@usr_bin_linux/ssh-guide?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=usr_bin_linux#comments</comments><dc:creator>usr_bin_linux</dc:creator><title>Шпаргалка по SSH</title><pubDate>Sun, 01 Mar 2026 20:57:17 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/fb/e2/fbe2b5f3-0826-474f-a7d8-e5dfe4475288.png"></media:content><description><![CDATA[<img src="https://miro.medium.com/v2/resize:fit:875/1*JZlNk6p0FR8dDE4uPf9Izg.png"></img>Это перевод оригинальной статьи SSH Cheat Sheet.]]></description><content:encoded><![CDATA[
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="Lsjz">Это перевод оригинальной статьи <a href="https://ozwizard.medium.com/ssh-cheat-sheet-4286e41fb92c" target="_blank">SSH Cheat Sheet</a>.</p>
  </section>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="a3Wm">Подписывайтесь на телеграм-канал <a href="https://t.me/usr_bin_linux" target="_blank">usr_bin</a>, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.</p>
  </section>
  <blockquote id="Vhz3"><em>Практическое, удобное для копирования и вставки руководство по SSH для инженеров Linux, системных администраторов, администраторов баз данных и SRE-специалистов.</em></blockquote>
  <figure id="IUq2" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/1*JZlNk6p0FR8dDE4uPf9Izg.png" width="700" />
  </figure>
  <h2 id="1a98">Часть 1 — Основы SSH (для всех)</h2>
  <h2 id="19b5">Основные принципы использования SSH</h2>
  <pre id="FzCd" data-lang="bash">ssh user@server_ip</pre>
  <p id="5fe3">Подключитесь к удалённому серверу, используя стандартный порт <strong>22</strong>.</p>
  <pre id="G8VM" data-lang="bash">ssh hostname</pre>
  <p id="9dd3">Используются параметры из <code>~/.ssh/config</code>, если они определены.</p>
  <h2 id="42de">SSH с пользовательским портом и пользователем</h2>
  <pre id="Yw6a" data-lang="bash">ssh -p 2222 user@server_ip</pre>
  <p id="3e90">Укажите нестандартный порт SSH.</p>
  <pre id="7XZ9" data-lang="bash">ssh user@hostname</pre>
  <p id="f0ff">Войдите в систему под конкретным пользователем.</p>
  <h2 id="e818">Аутентификация по SSH-ключу</h2>
  <h2 id="fca5">Сгенерируйте SSH-ключ</h2>
  <pre id="g2EU" data-lang="bash">ssh-keygen -t ed25519</pre>
  <h2 id="7e13">Скопируйте открытый ключ на сервер.</h2>
  <pre id="smQK" data-lang="bash">ssh-copy-id user@server_ip-copy-id user@server_ip</pre>
  <p id="85a7">После этого ввод пароля при подключении больше не требуется.</p>
  <h2 id="b859">Советы по работе с конфигурационными файлами SSH (настоятельно рекомендуется)</h2>
  <p id="9449">Редактировать конфигурацию:</p>
  <pre id="IvOZ" data-lang="bash">nano ~/.ssh/config</pre>
  <p id="7585">Пример:</p>
  <pre id="XRRh" data-lang="bash">Host prod-db
  HostName 10.10.10.20
  User postgres
  Port 22
  IdentityFile ~/.ssh/id_ed25519</pre>
  <p id="ac7b">Подключение:</p>
  <pre id="ZBrq" data-lang="bash">ssh prod-db

# Cleaner
# Faster
# Less mistakes</pre>
  <h2 id="ddc7">SSH-туннелирование и переадресация портов</h2>
  <h2 id="efaa">Локальная переадресация портов</h2>
  <pre id="GUzP" data-lang="bash">ssh -L 5432:localhost:5432 user@server_ip</pre>
  <p id="ec79">Получите доступ к <strong>удаленной базе данных PostgreSQL</strong> так, будто он запущен локально.</p>
  <h2 id="e3c8">Удалённая переадресация портов</h2>
  <pre id="fzgC" data-lang="bash">ssh -R 9000:localhost:3000 user@server_ip</pre>
  <p id="56fd">Предоставьте удаленному компьютеру доступ к локальному сервису.</p>
  <h2 id="44c4">Динамическая переадресация портов (SOCKS-прокси)</h2>
  <pre id="HeNi" data-lang="bash">ssh -D 8080 user@server_ip</pre>
  <p id="4f96">Полезно для безопасного просмотра веб-страниц и настройки прокси-серверов.</p>
  <h2 id="4fb4">Копирование файлов с помощью SCP и RSYNC</h2>
  <h2 id="fd57">Копирование файла на удаленный сервер</h2>
  <pre id="rDCp" data-lang="bash">scp file.txt user@server_ip:/path/</pre>
  <h2 id="d70a">Копирование директории</h2>
  <pre id="KqRh" data-lang="bash">scp -r mydir user@server_ip:/path/</pre>
  <h2 id="ab69">Более быстрый и надёжный способ (рекомендуется)</h2>
  <pre id="h22M" data-lang="bash">rsync -avz file.txt user@server_ip:/path/</pre>
  <h2 id="b122">Отладка SSH-подключений</h2>
  <pre id="vsUl" data-lang="bash">ssh -v user@server_ip</pre>
  <p id="477c">Ещё больше деталей:</p>
  <pre id="j523" data-lang="bash">ssh -vvv user@server_ip</pre>
  <p id="3fbe">Проверьте, какой ключ используется:</p>
  <pre id="8lj7" data-lang="bash">ssh -i ~/.ssh/mykey user@server_ip</pre>
  <h2 id="c2d4">Лучшие практики безопасности</h2>
  <p id="e3c2">Отключить аутентификацию по паролю<br />Использовать SSH-ключи<br />Сменить стандартный порт<br />Использовать <code>Fail2Ban</code><br />Ограничить доступ пользователей через<code>AllowUsers</code></p>
  <p id="3f2e">Пример (<code>sshd_config</code>):</p>
  <pre id="NawW" data-lang="bash">PasswordAuthentication no
PermitRootLogin no</pre>
  <p id="3a68">Перезапустите SSH:</p>
  <pre id="vw4Y" data-lang="bash">sudo systemctl restart sshd</pre>
  <h2 id="9872">Часть 2 — Объяснение параметров SSH (от новичка до продвинутого)</h2>
  <blockquote id="UYBH"><em>В этом разделе простыми словами объясняются <strong>параметры командной строки SSH</strong>. Для понимания этой части вам не потребуются предварительные знания SSH.</em></blockquote>
  <h2 id="5633">Напоминание о базовом синтаксисе</h2>
  <pre id="wpNh" data-lang="bash">ssh [options] user@host</pre>
  <ul id="kj7g">
    <li id="efe3"><strong>user</strong> → имя пользователя удаленного Linux</li>
    <li id="9dea"><strong>host</strong> → IP-адрес или имя хоста сервера</li>
    <li id="bbbc"><strong>options</strong> → параметры поведения SSH (что мы объясним ниже)</li>
  </ul>
  <h2 id="5d93">Основные и наиболее часто используемые опции (необходимо знать)</h2>
  <h2 id="544a"><code>-p</code> → Порт</h2>
  <pre id="6Fz3" data-lang="bash">ssh -p 2222 user@server</pre>
  <p id="3556">Подключение к <strong>пользовательскому SSH-порту.</strong><br />Порт SSH по умолчанию = <strong>22.</strong><br />Часто меняется из соображений безопасности</p>
  <blockquote id="6VlO"><em>Представьте, что порт — это</em> номер двери <em>на сервере.</em></blockquote>
  <h2 id="b8dc"><code>-l</code> → Имя пользователя</h2>
  <pre id="UNnt" data-lang="bash">ssh -l postgres server_ip</pre>
  <p id="51fe">Указывает, от имени <strong>какого пользователя</strong> следует войти в систему. То<br />же самое, что и:</p>
  <pre id="DbSg" data-lang="bash">ssh postgres@server_ip</pre>
  <h2 id="abd7"><code>-i</code> → Файл идентификации (SSH-ключ)</h2>
  <pre id="15XK" data-lang="bash">ssh -i ~/.ssh/id_ed25519 user@server</pre>
  <p id="f83e">Указывает SSH, <strong>какой закрытый ключ использовать.</strong><br />Полезно, когда у вас <strong>несколько ключей SSH.</strong></p>
  <h2 id="76fe"><code>-v</code>, <code>-vv</code>, <code>-vvv</code> → Подробный режим / Режим отладки</h2>
  <pre id="gKe1" data-lang="bash">ssh -v user@server</pre>
  <p id="2d86">Отображает этапы подключения.<br />Помогает отлаживать:</p>
  <ul id="wB35">
    <li id="35d2">проблемы аутентификации</li>
    <li id="b404">неправильные ключи</li>
    <li id="33a5">сетевые ошибки</li>
  </ul>
  <p id="f88d">Чем больше <code>v</code>, тем больше деталей.</p>
  <h2 id="7e86"><code>-F</code> → Пользовательский файл конфигурации</h2>
  <pre id="QylU" data-lang="bash">ssh -F myconfig user@server</pre>
  <p id="5288">Используйте <strong>нестандартный файл конфигурации SSH.</strong><br />По умолчанию используется:</p>
  <pre id="4Ct1" data-lang="bash">~/.ssh/config</pre>
  <h2 id="4244">Параметры аутентификации и безопасности</h2>
  <h2 id="d709"><code>-o</code> → Пользовательская опция SSH</h2>
  <pre id="6ikb" data-lang="bash">ssh -o StrictHostKeyChecking=no user@server</pre>
  <p id="340a">Передайте <strong>любые расширенные настройки SSH</strong> вручную.<br />Эквивалентно параметрам из <code>ssh_config</code></p>
  <p id="b9d6">Частые примеры:</p>
  <pre id="rh6P" data-lang="bash">-o PasswordAuthentication=no
-o ConnectTimeout=5</pre>
  <h2 id="1ca0"><code>-A</code> → Переадресация агента SSH</h2>
  <pre id="AFln" data-lang="bash">ssh -A user@server</pre>
  <p id="f6d8">Переадресация локальных SSH-ключей на удаленный сервер.<br />Используется для <strong>промежуточных серверов.</strong></p>
  <p id="e100">Использовать с осторожностью (риск безопасности на ненадежных серверах).</p>
  <h2 id="57fc"><code>-a</code> → Отключить переадресацию агента</h2>
  <pre id="qLCs" data-lang="bash">ssh -a user@server</pre>
  <p id="af32">Более безопасный вариант по умолчанию:<br />Явно отключает переадресацию ключей.</p>
  <h2 id="1ac9"><code>-K</code> → Аутентификация GSSAPI</h2>
  <pre id="ZTHH" data-lang="bash">ssh -K user@server</pre>
  <p id="dd7a">Используется в <strong>средах Kerberos / корпоративных средах.</strong></p>
  <h2 id="a0ba">Переадресация и туннелирование</h2>
  <h2 id="78bb"><code>-L</code> → Переадресация локальных портов</h2>
  <pre id="yRSV" data-lang="bash">ssh -L 5432:localhost:5432 user@server</pre>
  <p id="fa63">Доступ к <strong>удалённому сервису локально.</strong><br />Очень распространён в:</p>
  <ul id="Oq7O">
    <li id="e76b">PostgreSQL</li>
    <li id="a7e4">MySQL</li>
    <li id="f46f">Веб-приложения</li>
  </ul>
  <h2 id="7c86"><code>-R</code> → Удалённая переадресация портов</h2>
  <pre id="2k4Q" data-lang="bash">ssh -R 8080:localhost:3000 user@server</pre>
  <p id="a81a">Предоставить <strong>удалённому серверу</strong> доступ к <strong>локальному сервису</strong></p>
  <h2 id="a231"><code>-D</code> → Динамическая переадресация портов (SOCKS-прокси)</h2>
  <pre id="kdPG" data-lang="bash">ssh -D 1080 user@server</pre>
  <p id="861d">Создает <strong>SOCKS-прокси.</strong><br />Используется для:</p>
  <ul id="AiLp">
    <li id="5283">безопасного просмотр</li>
    <li id="1a00">туннелирования трафика</li>
  </ul>
  <h2 id="9492"><code>-W</code> → Переадресация стандартного ввода/вывода</h2>
  <pre id="zHeA" data-lang="bash">ssh -W host:port user@server</pre>
  <p id="e279">В основном используется с<strong> ProxyJump.</strong></p>
  <h2 id="71d3">Jump-хосты и несколько серверов</h2>
  <h2 id="8ec2"><code>-J</code> → Jump Host (Bastion Server)</h2>
  <pre id="sZBc" data-lang="bash">ssh -J user@jumpserver user@target</pre>
  <p id="8ed8">Подключение через другой сервер.<br />Современная альтернатива сложным туннелям.</p>
  <h2 id="b3ff">Управление сессией</h2>
  <h2 id="ce94"><code>-N</code> → без выполнения команд</h2>
  <pre id="UdME" data-lang="bash">ssh -N -L 5432:localhost:5432 user@server</pre>
  <p id="7a3f"><strong>Только</strong> открытый туннель.<br />Доступ к оболочке запрещен.</p>
  <h2 id="5ec5"><code>-T</code> → Отключить псевдо-TTY</h2>
  <pre id="UPuA" data-lang="bash">ssh -T user@server</pre>
  <p id="d42b">Используется в скриптах.<br />Нет интерактивного терминала.</p>
  <h2 id="86cb"><code>-t</code> → Принудительно включить TTY</h2>
  <pre id="2dC3" data-lang="bash">ssh -t user@server &quot;sudo systemctl restart postgresql&quot;</pre>
  <p id="70af">Необходимо для <code>sudo</code>.</p>
  <h2 id="55b7">Фон и управление</h2>
  <h2 id="ff33"><code>-f</code> → Фоновый режим</h2>
  <pre id="e80o" data-lang="bash">ssh -f -N -L 5432:localhost:5432 user@server</pre>
  <p id="367c">Запуск SSH в фоновом режиме.<br />Идеально подходит для туннелей.</p>
  <h2 id="e03d"><code>-S</code> → control socket</h2>
  <pre id="V3Gk" data-lang="bash">ssh -S /tmp/ssh.sock user@server</pre>
  <p id="7c98">Используется при <strong>совместным использованием соединений.</strong></p>
  <h2 id="9d83"><code>-O</code> → Команды управления</h2>
  <pre id="SMXu" data-lang="bash">ssh -O exit user@server</pre>
  <p id="70b8">Управление существующим SSH-соединением</p>
  <h2 id="a843">Шифрование и алгоритмы</h2>
  <h2 id="0cb3"><code>-c</code> → Шифр</h2>
  <pre id="MPrV" data-lang="bash">ssh -c aes256-gcm@openssh.com user@server</pre>
  <p id="db22">Выберите алгоритм шифрования</p>
  <h2 id="b674"><code>-m</code> → MAC-алгоритм</h2>
  <pre id="stHN" data-lang="bash">ssh -m hmac-sha2-256 user@server</pre>
  <p id="5f01">алгоритм аутентификации сообщений</p>
  <h2 id="b7da"><code>-Q</code> → Запрос поддерживаемых алгоритмов</h2>
  <pre id="UZ0E" data-lang="bash">ssh -Q cipher
ssh -Q mac</pre>
  <p id="45ea">Выводит список поддерживаемых алгоритмов.</p>
  <h2 id="5364">Параметры сетевого уровня</h2>
  <h2 id="0cfd"><code>-B</code> → Привязка к сетевому интерфейсу</h2>
  <pre id="4w2y" data-lang="bash">ssh -B eth0 user@server</pre>
  <p id="be78">Принудительно направляет SSH-трафик через указанный сетевой интерфейс.</p>
  <h2 id="6f34"><code>-b</code> → Исходный адрес</h2>
  <pre id="FIxQ" data-lang="bash">ssh -b 192.168.1.10 user@server</pre>
  <p id="ddf3">Использует конкретный локальный IP-адрес в качестве источника соединения.</p>
  <h2 id="191c">Золотое правило (совет для новичков)</h2>
  <blockquote id="m3w5"><em>Если команда SSH кажется <strong>длинной или пугающей</strong>, перенесите её в <code>~/.ssh/config</code> и упростите себе жизнь.</em></blockquote>
  <p id="63a0">SSH — это больше, чем просто способ подключения к серверу; это <strong>мощный инструмент</strong> для безопасного доступа, автоматизации и устранения неполадок. Если вы понимаете основы<strong>,</strong> вы можете безопасно управлять любой системой Linux. Если вы освоите параметры<strong>,</strong> вы сможете уверенно работать со сложными конфигурациями, такими как туннели, бастионные хосты и производственные среды.</p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="vfHT">На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал <a href="https://t.me/usr_bin_linux" target="_blank">usr_bin</a>, где будет еще больше полезной информации.</p>
  </section>

]]></content:encoded></item></channel></rss>