{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "Блоги: заметки с тегом linux",
    "_rss_description": "Автоматически собираемая лента заметок, написанных в блогах на Эгее",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": false,
    "_itunes_explicit": "no",
    "home_page_url": "https:\/\/blogengine.me\/blogs\/tags\/linux\/",
    "feed_url": "https:\/\/blogengine.me\/blogs\/tags\/linux\/json\/",
    "icon": false,
    "authors": [
        {
            "name": "Илья Бирман",
            "url": "https:\/\/blogengine.me\/blogs\/",
            "avatar": false
        }
    ],
    "items": [
        {
            "id": "135414",
            "url": "https:\/\/kini24.ru\/all\/zamena-bolshih-vlozheniy-v-email-na-ssylku\/",
            "title": "Замена больших вложений в email на ссылку",
            "content_html": "<p>Устанавливаем MIMEDefang:<\/p>\n<pre class=\"e2-text-code\"><code class=\"bash\">apt update\napt install mimedefang -y<\/code><\/pre><p>Правим файл<i> \/etc\/default\/mimedefang<\/i>:<\/p>\n<pre class=\"e2-text-code\"><code class=\"ini\">SOCKET=\/var\/spool\/postfix\/mimedefang\/mimedefang.sock\nMD_ALLOW_GROUP_ACCESS=yes<\/code><\/pre><p>Добавляем пользователя <i>postfix<\/i> в группу <i>defang<\/i>:<\/p>\n<pre class=\"e2-text-code\"><code class=\"bash\">usermod -aG defang postfix<\/code><\/pre><p>Так как postfix работает в chroot-окружении, создаем папку для сокета mimedefang:<\/p>\n<pre class=\"e2-text-code\"><code class=\"bash\">mkdir \/var\/spool\/postfix\/mimedefang<\/code><\/pre><p>Правим<i> \/etc\/postfix\/main.cf<\/i>:<\/p>\n<pre class=\"e2-text-code\"><code class=\"ini\">milter_default_action = accept\nmilter_protocol = 6\nsmtpd_milters = unix:mimedefang\/mimedefang.sock\nnon_smtpd_milters = unix:mimedefang\/mimedefang.sock<\/code><\/pre><p>Теперь нужно добавить следующее в конец функции <i>filter<\/i> в файле<i> \/etc\/mail\/mimedefang-filter<\/i>:<\/p>\n<pre class=\"e2-text-code\"><code class=\"perl\"># Если файл больше указанного размера, он удаляется из письма,\n    # его копия остается на диске, а вместо него предоставляется ссылка, по которой его можно скачать.\n\n    # Максимальный размер вложения (например, 10MB)\n    my $MAX_ATTACHMENT_SIZE = 10 * 1024 * 1024;\n    # Директория для сохранения вложений\n    my $ATTACHMENTS_DIR = &quot;\/var\/mail\/attachments&quot;;\n    # URL, по которому будут доступны вложения\n    my $ATTACHMENTS_URL = &quot;https:\/\/mail.kini24.ru\/attachments&quot;;\n\n    # Создаем директорию, если её нет\n    mkdir $ATTACHMENTS_DIR unless -d $ATTACHMENTS_DIR;\n\n    $size = (stat($entity-&gt;bodyhandle-&gt;path))[7];\n    if ($size &gt; $MAX_ATTACHMENT_SIZE) {\n        md_graphdefang_log(&quot;The attached file $fname is too big, replaced with a link&quot;);\n        return action_replace_with_url($entity,\n            &quot;$ATTACHMENTS_DIR&quot;,\n            &quot;$ATTACHMENTS_URL&quot;,\n            &quot;Размер вложения превысил ограничения сервера, поэтому оно было удалено.\\n&quot; .\n            &quot;Вы можете скачать его по следующей ссылке:\\n\\n&quot; .\n            &quot;_URL_&quot;);\n    }<\/code><\/pre><p>В результате аыполнения функции <i>action_replace_with_url<\/i> в конец письма будет вставлен текст и ссылка для скачивания вложения, а сам файл бует сохранен в папку<i> \/var\/mail\/attachments<\/i>. Надо, кстати, покопаться и найти как вставлять ссылку в текст самого письма. Но пока что оставим как есть.<\/p>\n<p>У меня почтовый и веб-сервер находятся на разных виртуальных машинах, поэтому папку<i> \/var\/mail\/attachments<\/i> надо сделать общей. На почтовом сервере устанавливаем пакет сервера NFS:<\/p>\n<pre class=\"e2-text-code\"><code class=\"bash\">apt install nfs-kernel-server -y<\/code><\/pre><p>Открываем файл<i> \/etc\/exports<\/i> и вписываем в конец файла что-то вроде такого:<\/p>\n<pre class=\"e2-text-code\"><code class=\"plaintext\">\/var\/mail\/attachments 192.168.1.0\/24(rw,sync,no_subtree_check)<\/code><\/pre><p>И выполняем в консоли команду:<\/p>\n<pre class=\"e2-text-code\"><code class=\"bash\">exportfs -a<\/code><\/pre><p>Теперь переходим на веб-сервер и выполняем следующие команды:<\/p>\n<pre class=\"e2-text-code\"><code class=\"bash\">apt update\napt install nfs-common -y<\/code><\/pre><p>Открываем файл<i> \/etc\/fstab<\/i> и дописываем в конец:<\/p>\n<pre class=\"e2-text-code\"><code class=\"plaintext\">192.168.1.12:\/var\/mail\/attachments \/var\/www\/mail\/attachments nfs4 defaults 0 0<\/code><\/pre><p>где 192.168.1.12 — IP-адрес почтового сервера.<br \/>\nДальше выполняем команды:<\/p>\n<pre class=\"e2-text-code\"><code class=\"bash\">mkdir -p \/var\/www\/mail\/attachments\nchown -R www-data:www-data \/var\/www\/mail\/attachments\nmount -a<\/code><\/pre><p>И проверяем что папка смонтировалась:<\/p>\n<pre class=\"e2-text-code\"><code class=\"bash\">ls -l \/var\/www\/mail\/attachments<\/code><\/pre><p>После этого все вложения, которые были удалены из писем, должны стать доступны для скачивания.<\/p>\n",
            "date_published": "2025-03-31T11:45:17+05:00",
            "date_modified": "2025-03-31T11:45:06+05:00",
            "tags": [
                "debian",
                "linux",
                "mimedefang",
                "postfix",
                "вложение",
                "замена",
                "почта",
                "сервер",
                "Ссылка"
            ],
            "author": {
                "name": "Копытов Иван",
                "url": "https:\/\/kini24.ru\/",
                "avatar": ""
            },
            "_date_published_rfc2822": "Mon, 31 Mar 2025 11:45:17 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "135414",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        },
        {
            "id": "129149",
            "url": "https:\/\/bolknote.ru\/all\/tachskrin-na-linukse\/",
            "title": "Тачскрин на Линуксе",
            "content_html": "<p>Два последних дня ковырял по работе планшет фирмы «Дигма» — это китайское го… годное вполне за свои деньги изделие поставляется с ОС «Виндоуз». А наша задача была показать на нём один из отечественных дистрибутивов Линукса.<\/p>\n<p>Линукс встал довольно легко, но вот проблема — прикосновения к экрану не давали никакого эффекта. Вот этим я героически два дня и боролся.<\/p>\n<p>До конца не победил — тачскрин хоть и возвращает какое-то координаты, но драйвер явно работает неправильно — при движении пальца по оси абсцисс координаты сначала уменьшаются до нуля, потом палец попадает в какое-то «слепое пятно», где цифра не меняется, потом значение снова растёт.<\/p>\n<p>Зато узнал немало интересного о том как устроен опрос датчика нажатия на экран в Линуксе. Всё я ещё не переварил, поэтому описывать не буду, но один интересный факт расскажу.<\/p>\n<p>Представьте, что у вас есть готовый экран, на котором что-то отображается — в неких координатах пользователь видит кнопку, на которую он хочет нажать пальцем (речь о планшете). Сверху мы накладываем полупрозрачную плёнку, которая будет считывать нажатия и закрываем всё корпусом.<\/p>\n<p>Часть плёнки у нас оказалась под рамкой, так что ноль координат плёнки и экрана не совпадают, кроме того, разрешающая возможность тоже разная. Экран, например, 1366 пикселей шириной, а плёнка даёт 740. Как пересчитываются координаты нажатия на плёнку в экранные, чтобы операционная система поняла куда пользователь нажал?<\/p>\n<p>Для этого в Линуксе задаётся трансформационная матрица («<a href=\"https:\/\/wiki.archlinux.org\/title\/Calibrating_Touchscreen\"><i>Coordinate Transformation Matrix<\/i><\/a>»), на которую умножаются абсолютные координаты, в которых датчик экрана уловил нажатие. С её помощью можно сдвигать координаты, сжимать их и растягивать, а так же поворачивать на 90°, если датчик стоит так, что у него перепутаны оси — это вполне стандартная математика, которую многие могут помнить по школе.<\/p>\n<p>Матрица эта, понятное дело, должна быть зашита внутри драйвера. Но когда у тебя Линукс, нельзя надеяться, что для всего оборудования найдётся драйвер.<\/p>\n<p>Для той «Дигмы», которую мы получили, драйвера нет. В некоторых случаях <a href=\"https:\/\/wiki.archlinux.org\/title\/Calibrating_Touchscreen\">есть способы<\/a>, которые позволяют изготовить его на основе драйвера для «Виндоуза», но матрицу всё равно придётся вычислять самостоятельно.<\/p>\n<p>Правда в нашем случае она не помогла — компенсировать «слепое пятно» она не в состоянии, для этого нужно чудо или более подходящий драйвер.<\/p>\n",
            "date_published": "2024-07-04T22:57:28+05:00",
            "date_modified": "2024-07-04T22:57:20+05:00",
            "tags": [
                "linux"
            ],
            "author": {
                "name": "Евгений Степанищев",
                "url": "https:\/\/bolknote.ru\/",
                "avatar": "https:\/\/bolknote.ru\/pictures\/userpic\/userpic@2x.jpg?1760600028"
            },
            "_date_published_rfc2822": "Thu, 04 Jul 2024 22:57:28 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "129149",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        },
        {
            "id": "122411",
            "url": "https:\/\/bolknote.ru\/all\/linux-0-0-1\/",
            "title": "Linux 0.0.1",
            "content_html": "<p>Оказывается совсем не сложно запустить первую функциональную версию Линукса под современной машиной, всё уже подготовлено энтузиастами. Надо только скачать <a href=\"http:\/\/www.oldlinux.org\/Linux.old\/qemu-images\/\">образ<\/a> и распаковать.<\/p>\n<p>В архиве всё готово для «Винды», для «Мака» я поставил <i>QEMU<\/i> отдельно, для запуска сработала вот такая строчка:<\/p>\n<pre class=\"e2-text-code\"><code class=\"bash\">qemu-system-i386 -nic none -L pc-bios -hda \\\r\nlinux-0.11-devel-060625.qcow2 -no-reboot -m 16 -k en-us<\/code><\/pre><p>Стартует всё моментально, после запуска образа будет доступно меню выбора источника загрузки, там надо будет нажать <tt>1<\/tt>, после чего появится командная строка.<\/p>\n<p>Удивительно, но несмотря на то, что это версия 0.0.1, очень многое из привычного работает — есть файловая система, компилятор, <tt>bash<\/tt>, <tt>grep<\/tt> и <tt>awk<\/tt>. Правда у команд есть далеко не все ключи и я не обнаружил никакой справки ко внешним командам (для встроенных есть <tt>help<\/tt>).<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/bolknote.ru\/pictures\/2023.08.16@2x.jpg\" width=\"1000\" height=\"594\" alt=\"\" \/>\n<div class=\"e2-text-caption\"><i>Linux 0.0.1<\/i>, запущенный в <i>QEMU<\/i>, а жаба, потому что скриншот — это скучно<\/div>\n<\/div>\n<p>В <a href=\"https:\/\/habr.com\/ru\/articles\/754322\/\">статье<\/a>, где я нашёл ссылку для скачивания образа первого Линукса, есть любопытный факт — Линукс когда-то назывался «<i>FREAX<\/i>», как оказалось, в исходниках эта строка упоминается. Попытавшись найти её в бинарных файлах, споткнулся об отсутствие команды <tt>find<\/tt>, пришлось городить вот такую конструкцию:<\/p>\n<pre class=\"e2-text-code\"><code class=\"bash\">ls -R \/ | awk -F: &#039;\/:\/{dir=$1} ! \/:\/ &amp;&amp; $1 {print dir&quot;\/&quot;$1}&#039; |\r\ngrep -v ^\/dev | xargs -n1 strings | grep -i freax<\/code><\/pre><p>Строчка не нашлась, она и в исходниках-то упоминается только в комментариях.<\/p>\n<p>Я понимаю, что все эти утилиты писал не автор Линукса, но то, что это всё работает в операционной системе, код которой размером чуть больше восьми с половиной тысяч строк, меня лично восхищает.<\/p>\n",
            "date_published": "2023-08-16T20:17:05+05:00",
            "date_modified": "2023-08-22T13:38:52+05:00",
            "tags": [
                "linux"
            ],
            "author": {
                "name": "Евгений Степанищев",
                "url": "https:\/\/bolknote.ru\/",
                "avatar": "https:\/\/bolknote.ru\/pictures\/userpic\/userpic@2x.jpg?1760600028"
            },
            "_date_published_rfc2822": "Wed, 16 Aug 2023 20:17:05 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "122411",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        },
        {
            "id": "119842",
            "url": "https:\/\/stefaniuk.website\/all\/setup-new-ubuntu-vps\/",
            "title": "Настройка новой виртуальной машины",
            "content_html": "<p>Время от времени поднимаю виртуальные машины на убунту для своих проектов или экспериментов. Первое что я настраиваю — безопасность. Раньше у меня не было единого чек-листа и приходилось каждый раз гуглить. Поэтому решил сделать такой список и оставить у себя в блоге, чтобы обращаться к нему по мере необходимости.<\/p>\n<p><b>Чеклист<\/b><\/p>\n<ol start=\"1\">\n<li>Создать нового пользователя вместо root.<\/li>\n<li>Настроить доступ по ssh ключам.<\/li>\n<li>Отключить доступ по паролю для ssh.<\/li>\n<li>Отключить доступ для root через ssh.<\/li>\n<li>Заблокировать все порты в ufw, кроме 80, 22 и 443.<\/li>\n<li>(необязательно) Поменять ssh порт с 22 любой другой<\/li>\n<\/ol>\n<p><b>Terminal<\/b><\/p>\n<pre class=\"e2-text-code\"><code class=\"\"># Создаем нового пользователя и добавляем в группу sudo.\r\nadduser bstefaniuk\r\nusermod -aG sudo bstefaniuk\r\n\r\n# Копируем свой публичный ключ для нового пользователя.\r\nssh-copy-id bstefaniuk@vps-ip\r\n\r\n# Отключаем доступ по паролю и root для ssh.\r\nnano \/etc\/ssh\/sshd_config\r\n## Установить значения:\r\nPasswordAuthentication no\r\nPermitRootLogin no\r\n## Перезапустить службу\r\nsystemctl restart ssh\r\n\r\n# Настройка ufw\r\nufw default deny incoming\r\nufw default allow outgoing\r\nufw allow ssh\r\nufw allow 80\r\nufw allow 433\r\nufw enable\r\n## Проверяем что все ОК\r\nufw status<\/code><\/pre><p>В будущем хочу написать ansible-playbook скрипт, который будет все настраивать сам.<\/p>\n<p><a href=\"https:\/\/www.webservertalk.com\/ubuntu-firewall-how-to-configure-ufw\">Хороший мануал по ufw<\/a><br \/>\n<a href=\"https:\/\/www.digitalocean.com\/community\/tools\/nginx\">Генератор конфигураций nginx<\/a><br \/>\n<a href=\"https:\/\/maxkuznetsov.ru\/all\/deployment-users\/\">Deployment: настраиваем пользователей<\/a><\/p>\n",
            "date_published": "2020-12-26T23:54:46+05:00",
            "date_modified": "2023-06-03T05:08:48+05:00",
            "tags": [
                "cloud",
                "linux"
            ],
            "author": {
                "name": "Bohdan Stefaniuk",
                "url": "https:\/\/stefaniuk.website\/",
                "avatar": "https:\/\/stefaniuk.website\/pictures\/userpic\/userpic@2x.jpg?1565716580"
            },
            "_date_published_rfc2822": "Sat, 26 Dec 2020 23:54:46 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "119842",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        },
        {
            "id": "119844",
            "url": "https:\/\/stefaniuk.website\/all\/work-with-cli\/",
            "title": "Конспект: работа с командной строкой",
            "content_html": "<p>Данная статья это конспект по пройденному курсу: <a href=\"https:\/\/ru.hexlet.io\/courses\/cli-basics\">Основы командной строки<\/a>.<\/p>\n<p><b>Обозначения пути<\/b><\/p>\n<ul>\n<li>\/ — самый верхний уровень файловой системы<\/li>\n<li>~ — домашняя директория<\/li>\n<\/ul>\n<p>Сайт на котором можно посмотреть что делает та или иная команда. <a href=\"https:\/\/explainshell.com\/\"> Ссылка<\/a><br \/>\nИформация о стандартных директориях *nix систем. <a href=\"https:\/\/ru.wikipedia.org\/wiki\/FHS\">FHS<\/a><\/p>\n<p><b>Работа в файловой системе<\/b><\/p>\n<ul>\n<li><b>pwd<\/b> — отображает путь рабочей (текущей) директории<\/li>\n<li><b>ls<\/b> — показывает все файлы и директории в текущему или указанному пути<\/li>\n<li><b>cd<\/b> — служит для перемещения по директориям. Если выполнить без параметров — переместит нас в домашнюю директорию.<\/li>\n<li><b>stat<\/b> — показывает дополнительную информацию о папке или файле<\/li>\n<\/ul>\n<h2>Чтение файла<\/h2>\n<ul>\n<li><b>сat<\/b> — Отображает содержимое файла<\/li>\n<li><b>head<\/b> — Отображает первые 10 строк файла, можно вывести больше с помощью флага -n 20<\/li>\n<li><b>tail<\/b> — Отображает последние 10 строк файла, можно вывести больше с помощью флага -n 20<\/li>\n<li><b>less<\/b> — Представляет из себя пейджер. С его помощью можно перемещайся и искать в файле. Также он может открыть файл любого размера, так как отображает только те строки, которые может поместить в окно консоли и при перемещении по файлу — дочитывать нужную информацию.<\/li>\n<\/ul>\n<p>Может быть такая ситуация что файл очень интенсивно изменяется, например логи, и нужно постоянно выводить содержимое файла. Для этого у команд head и tail есть флаг -f. Данный файл сразу выводит на экран добавленные строки.<\/p>\n<h2>Grep<\/h2>\n<p><b>Grep<\/b> — консольная утилита, которая производит поиск в файле или файлах по заданному шаблону.<br \/>\nПример:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">grep services Startup.cs  # выведет по очередно строчки, которые содержат services.<\/code><\/pre><p>Иногда нужно посмотреть не только сами строчки содержащие текст, но и текст вокруг.<br \/>\nДля этого есть несколько дополнительных флагов:<\/p>\n<ul>\n<li><b>-B<\/b> — количество строк до искомой строки<\/li>\n<li><b>-A<\/b> — после искомой строки<\/li>\n<li><b>-C<\/b> — до и после одновременно<\/li>\n<li><b>-R<\/b> — рекурсивный поиск по директориям и под директориям<\/li>\n<li><b>-n<\/b> — отобразит номер строки, возле каждого результата поиска<\/li>\n<\/ul>\n<p>Примеры:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">grep -R .getUsers() . - найдет все файлы в которых есть строчка .getUsers(), начиная с текущей.\r\ngrep -C 10 text file.txt - найдет строку text и отобразит ее и 10 соседних строк с каждой стороны<\/code><\/pre><h2>Текстовые редакторы<\/h2>\n<p>Для редактирования файлов в командной строке используют редакторы Nano, Vim и Emacs. Первые два, обычно, установлены по умолчанию.<\/p>\n<p><b>Nano<\/b><br \/>\nСамый простой текстовый редактор. Удобно редактировать небольшие файлы.<\/p>\n<p><b>Vim<\/b><br \/>\nДанный редактор имеет очень много возможностей и особенностей.<br \/>\nРабота в Vim состоит из разных режимов.<br \/>\nКогда только открыли файл, редактор работает в режиме команд. Любое нажатие выполняет какую-то определенную команду.<\/p>\n<p>В Vim есть четыре основных режима работы:<\/p>\n<ol start=\"1\">\n<li>Командный режим (обычный режим) — это режим по умолчанию. Перемещение по файлу, быстрое (при помощи команд, комбинаций клавиш) редактирование, удаление, поиск текста.<\/li>\n<li>Режим вставки (режим ввод) — ввод текста с клавиатуры. То, как вы привыкли это делать в обычных редакторах.<\/li>\n<li>Визуальный режим — выделение произвольных участков текста.<\/li>\n<li>Режим командной строки — собственная командная строка для редактора текста, из которой можно выполнять великое множество разнообразных команд.<\/li>\n<\/ol>\n<p>Для перехода в режим вставки — нажать i.<br \/>\nДля перехода в режим команд — нажать ESC.<\/p>\n<p>Как выйти с Vim? :-)<br \/>\nДля начала нужно перейти в режим команд.<\/p>\n<ul>\n<li>:q! — Закрывает файл без сохранения изменений<\/li>\n<li>:wq — Сохраняет и закрывает файл<\/li>\n<li>:w — Просто сохраняет файл<\/li>\n<\/ul>\n<p>Хороший гайд по Vim — <a href=\"https:\/\/guides.hexlet.io\/vim\/\">https:\/\/guides.hexlet.io\/vim\/<\/a><\/p>\n<h2>Перенаправление потоков<\/h2>\n<p>В *nix системах есть такое понятие как потоки. В начале работы программы ОС связывает ее с тремя потоками: STDIN, STDOUT и STDERR.<br \/>\nДля всех приложений они выглядят как обычные файлы.<br \/>\nЧто же делает каждый из них?<br \/>\n* <b>STDIN<\/b> — отвечает за ввод программы.<br \/>\n* <b>STDOUT<\/b> — отвечает за вывод программы.<br \/>\n* <b>STDERR<\/b> — отвечает за вывод ошибок.<\/p>\n<p>По умолчанию вывод всех команд отображается на экране. Но с мощью параметра <b>><\/b> можно перенаправить вывод в указанный файл.<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">ls -l &gt; output.txt<\/code><\/pre><p>На экране ничего не отобразится, но в текущей директории появится файл output со всем выводом команды ls -l. Данную операцию можно сделать с любой программой, которая что-либо выводит на экран. Но есть одна особенность данного оператора, он перезаписывает все данные в файле, для того чтобы дописать используйте <b>>><\/b>.<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">echo Hello_World &gt; output.txt\r\n# Hello_World\r\necho Hello_World1 &gt; output.txt\r\n# Hello_World1\r\necho Hello_World2 &gt;&gt; output.txt\r\n# Hello_World1\r\n# Hello_World2<\/code><\/pre><p>Также можно перенаправлять в другую сторону поток. Например у нас есть файл и мы ходим посмотреть сколько в нем строк. Для этого существует команда wc. Она принимает на вход текст, но с помощью оператора < мы можем передать в нее содержимое файла.<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">wc -l &lt; result.txt\r\n# 2432<\/code><\/pre><p>Также можно как читать так и писать в файл:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">wc -l &lt; result.txt &gt; output.txt<\/code><\/pre><h2>Пайплайн (Конвейер)<\/h2>\n<p>Если у программы есть вход и выход, то их можно обьеденить, такое обьединение называется — конвейер.<br \/>\nС помощью данного подхода можно передавать данные сквозь приложения, как через цепочку функций.<\/p>\n<p>Например нам нужно найти строку в которой есть несколько слов и нам не важно как они расположены внутри, главное чтобы были на одной строчке.<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">grep alias .bashrc | grep color<\/code><\/pre><p>Алгоритм такой команды очень прост:<\/p>\n<ol start=\"1\">\n<li>Выбираем строки, которые содержат alias<\/li>\n<li>Потом в строчках, которые получили на выходе первой команды, ищем слово color<\/li>\n<\/ol>\n<p>| — этот символ называется пайп, он указывает шелу взять STDOUT одного процесса и соединяет его с STDIN другого процесса. <\/p>\n<p>Также команду выше можно переписать на такую:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">cat .bashrc | grep alias | grep color<\/code><\/pre><h2>Манипулирование файловой структурой<\/h2>\n<p>Возможность модифицировать файловую систему завязана на права. Если у вас нету прав создавать файлы в текущей директории, вы получите ошибку.<\/p>\n<p>Команды:<\/p>\n<ol start=\"1\">\n<li><b>touch filename<\/b> — изменяет время последнего доступа к файлу, если его нету — создает<\/li>\n<li><b>rm<\/b> — удалить файл\n<ul>\n  <li><b>-r <\/b> — удаляет папку<\/li>\n  <li><b>-f<\/b> — не спрашивает подтверждение пользователя<\/li>\n<\/ul>\n<\/li>\n<li><b>mv<\/b> — <i>переименовывает файл<\/i>. В *nix системах не существует понятия «переименовать файл». Переименование всегда равносильно перемещению, которое выполняется командой mv.<\/li>\n<li><b>cp<\/b> — копирует файл.\n<ul>\n  <li><b>-r <\/b>— позволяет скопировать директории<\/li>\n<\/ul>\n<\/li>\n<li><b>mkdir<\/b> — создание директории\n<ul>\n  <li><b>-p<\/b> — позволяет создать вложенные директории. <i>mkdir \/folder\/subfolder<\/i><\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<h2>Переменные окружения<\/h2>\n<p>Для просмотра переменных окружения используют команду <b>env<\/b>.<br \/>\nФормат вывода очень простой: слева от знака равно имя переменной, справа — значение.<\/p>\n<p>Основное предназначение переменных окружения — конфигурация системы и программ. Их удобство заключается в универсальности и отвязке от способа появления этих значений в системе.<\/p>\n<p>Для вывода переменной используется echo, а перед самой переменной ставится знак $.<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">echo $HOME<\/code><\/pre><p>Существует два способа задавать значение переменной окружения: локальный и глобальный.<br \/>\nЛокальные переменные живут для конкретной программы:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">HOME=\/var cd<\/code><\/pre><p>Другой способ установки изменяет значение глобально, для всей сессии и выполняется так:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">export HOME=\/var<\/code><\/pre><p><i>Обратите внимание на то, что изменение происходит в рамках текущей сессии, другими словами, если у вас открыто две вкладки терминала, и в каждой загружен баш, то изменение произойдет только в той вкладке, в которой будет выполнена команда.<\/i><\/p>\n<h2>История комнад<\/h2>\n<p>Для просмотра команд можно использовать клавиши вверх и вниз. Но все введенные команды хранятся в файле <b>.bash_history<\/b>, который лежит в домашней директории пользователя.<\/p>\n<p>Посмотреть историю можно и более простым способом, достаточно выполнить команду <b>history<\/b>.<\/p>\n<p>Последнее, и самое интересное — реверсивный поиск. Если нажать комбинацию Ctrl + r, то запустится специальный поиск по истории. Он ожидает ввода символов и сразу отображает ближайшую команду, в которой эти символы встречаются. Если найденное соответствие вас не устроило, то повторное нажатие Ctrl + r выберет следующее соответствие из истории.<\/p>\n<h2>Sudo<\/h2>\n<p>Ситуаций, в которых необходимо повышать привилегии и выполнять команды от рута (пользователя root), довольно много. С некоторыми мы уже столкнулись, с другими познакомимся в следующих уроках:<\/p>\n<p>Установка новых программ<br \/>\nНавигация по чужим директориям<br \/>\nИзменение прав доступа и владельцев файлов, не принадлежащих текущему пользователю<br \/>\nСоздание, редактирование и удаление файлов в местах, где не хватает прав текущего пользователя<br \/>\nЗапуск программ, требующих повышенные привилегии.<\/p>\n<p>Основной способ повышать привилегии в современных системах — утилита sudo.<br \/>\nПо умолчанию она пытается повысить права до суперпользователя.<\/p>\n<h2>Пакетный менеджер<\/h2>\n<p>Пакетный менеджер служат для установки программ. В каждой операционной системе есть свой пакетный менеджер, но его надо устанавливать отдельно.<\/p>\n<p>Основной его частью является каталог. В нем содержится список всех приложений, которые можно установить.<\/p>\n",
            "date_published": "2019-03-16T23:46:52+05:00",
            "date_modified": "2023-06-03T05:12:30+05:00",
            "tags": [
                "linux",
                "інструменти",
                "Курсы"
            ],
            "author": {
                "name": "Bohdan Stefaniuk",
                "url": "https:\/\/stefaniuk.website\/",
                "avatar": "https:\/\/stefaniuk.website\/pictures\/userpic\/userpic@2x.jpg?1565716580"
            },
            "_date_published_rfc2822": "Sat, 16 Mar 2019 23:46:52 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "119844",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        }
    ],
    "_e2_version": 4079,
    "_e2_ua_string": "Aegea 11.0 (v4079e)"
}