{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "Skurudo Blog(post): заметки с тегом bash",
    "_rss_description": "Bash (от англ. Bourne again shell, каламбур «Born again» shell — «возрождённый» shell) — усовершенствованная и модернизированная вариация командной оболочки Bourne shell",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": "",
    "_itunes_explicit": "",
    "home_page_url": "https:\/\/skurudo.ru\/tags\/bash\/",
    "feed_url": "https:\/\/skurudo.ru\/tags\/bash\/json\/",
    "icon": "https:\/\/skurudo.ru\/pictures\/userpic\/userpic@2x.jpg?1691593083",
    "authors": [
        {
            "name": "Pavel Galkin",
            "url": "https:\/\/skurudo.ru\/",
            "avatar": "https:\/\/skurudo.ru\/pictures\/userpic\/userpic@2x.jpg?1691593083"
        }
    ],
    "items": [
        {
            "id": "242",
            "url": "https:\/\/skurudo.ru\/all\/how-to-manage-nas-synology-as-root-without-password\/",
            "title": "Как поуправлять Synology по ssh, когда очень хочется",
            "content_html": "<p>Иногда возникают странные желания, касающиеся домашних и не очень хранилищ, они же NAS, от известной компании Synology. Хранилища DSM (Synology DiskStation Manager) — программное сердце хранилищ, а создатели продукта позволили при должной настройке подключаться по ssh. Однако не все так хорошо, как могло бы показаться. Используя кастрированный линукс и оболочку, все будет не совсем так ласково и привычно, как в полюбившихся debian-like системах.<\/p>\n<p>Например, нам нужно передать некую команду для выполнения от root. Предположим, мы хотим сделать такой маневр из под Windows (хотя это не самый принципиальный момент). Как бы нам это сделать без ввода паролей?<\/p>\n<p>Наверное классическим маневром было бы использовать пароли или ключи, изображая что-то такое:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">plink -ssh admin@192.168.0.222 -pw password -batch -t &quot;echo password | sudo  some-command-with-root-permission.sh&quot;<\/code><\/pre><p>Т. е. мы подключились по паролю и передали команду с вводом пароля... но в случае с Synology DSM 6+ у нас такой номер не пройдет. А для того, чтобы все получилось, нужно провести небольшую подготовку, а именно немного пошалить с sudoers (visudo у нас нет, редактировать \/etc\/sudoers напрямую тоже толку мало)...<\/p>\n<p>Буквально по шагам, делаем нижеприведённую магию. Не забываем сначала зайти по ssh и сделать sudo su<\/p>\n<pre class=\"e2-text-code\"><code class=\"\"># переходим в каталог\r\ncd \/etc\/sudoers.d\r\n# создаем файл с именем пользователя \r\n# предположим, что у нас admin\r\nvi admin\r\n# включаем редактирование в vi\r\ni\r\n# добавляем разрешения\r\nadmin ALL=(root) NOPASSWD: \/path\/to\/script.sh\r\n# или на все без пароля\r\nadmin ALL=(root) NOPASSWD: ALL\r\n# выходим из vi\r\n&lt;esc&gt;\r\n:wq! \r\n# ставим права на файл\r\nchmod 0400 admin<\/code><\/pre><p>Теперь команда вроде той, что привожу ниже, отработает без каких либо проблем или ввода пароля.<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">plink -ssh admin@192.168.0.222 -pw password  -batch -t &quot;sudo \/var\/packages\/HyperBackup\/target\/bin\/img_backup -B -w -k 12&quot;<\/code><\/pre>",
            "date_published": "2023-11-09T21:53:35+03:00",
            "date_modified": "2023-11-10T06:27:43+03:00",
            "tags": [
                "bash",
                "Linux",
                "NAS",
                "Synology"
            ],
            "_date_published_rfc2822": "Thu, 09 Nov 2023 21:53:35 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "242",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "230",
            "url": "https:\/\/skurudo.ru\/all\/yaszait-yet-another-simple-zabbix-agent-installer-tool\/",
            "title": "YASZAIT — Yet Another Simple Zabbix Agent Installer Tool",
            "content_html": "<p>Понадобилось на несколько разных серверов на Debian\/Ubuntu поставить агент Zabbix, чтобы подключить их к мониторингу. Вместо того, чтобы ставить совсем все руками, немного автоматизировал процесс и добавил интерактива и в конце немного покажет адреса, чтобы удобно добавить в inventory. Скрипт спрашивает ровно три вещи:<\/p>\n<ol start=\"1\">\n<li>хостнейм сервера — можно прощелкать, укажет автоматически<\/li>\n<li>адрес Zabbix сервера — указывать обязательно<\/li>\n<li>порт — можно прощелка, укажет стандартный 10050<\/li>\n<\/ol>\n<p>Для запуска скрипта:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">bash &lt;(wget -O - https:\/\/raw.githubusercontent.com\/skurudo\/usefulbash\/main\/zabbix-add-agent-on-debian.sh)<\/code><\/pre><p>Код приведен ниже и также доступен на <a href=\"https:\/\/github.com\/skurudo\/usefulbash\/blob\/main\/zabbix-add-agent-on-debian.sh\">Github<\/a>:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">#!\/bin\/bash\r\n# YASZAIT\r\n# Yet Another Simple Zabbix Agent Installer Tool\r\n##############################################################\r\n# enter some data to start\r\necho -n &quot;Enter this server name: &quot;\r\nread SRV_HOSTNAME\r\n# if SRV_HOSTNAME is empty, use server hostname\r\nif [ -z &quot;$SRV_HOSTNAME&quot; ]; then\r\n        SRV_HOSTNAME=($(hostname -f))\r\nfi\r\necho -n &quot;Enter Zabbix Server (FQDN or IP): &quot;\r\nread ZABBIX_SERVER\r\n# if ZABBIX_SERVER is empty, try again\r\nif [ -z &quot;$ZABBIX_SERVER&quot; ]; then\r\n    echo -n &quot;=&gt; Please enter address of your Zabbix server... [example.org or IP]: &quot;\r\n        read -r ZABBIX_SERVER\r\nfi\r\necho -n &quot;Listening port (10050): &quot;\r\nread LISTEN_PORT\r\n# if LISTEN_PORT is empty, set it to 10050\r\nif [ -z &quot;$LISTEN_PORT&quot; ]; then\r\n    LISTEN_PORT=10050\r\nfi\r\n\r\n# Zabbix agent simple installation\r\napt-get install zabbix-agent\r\n# change configuration file\r\ncat &gt; \/etc\/zabbix\/zabbix_agentd.conf &lt;&lt; EOF\r\n# simple core config file\r\n#\r\n# address of the server\r\nServer=$ZABBIX_SERVER\r\nServerActive=$ZABBIX_SERVER\r\n# port for Zabbix\r\nListenPort=$LISTEN_PORT\r\n# hostname \r\nHostname=$SRV_HOSTNAME\r\n#Hostname=$(hostname -f)\r\n# pid and logs\r\nPidFile=\/var\/run\/zabbix\/zabbix_agentd.pid\r\nLogFile=\/var\/log\/zabbix-agent\/zabbix_agentd.log\r\nLogFileSize=0\r\nEOF\r\n# restart the zabbix agent\r\nservice zabbix-agent restart \r\n# check agent status\r\nservice zabbix-agent status\r\n# show a little ip4 addresses for Zabbix server\r\necho &quot;######################################&quot;\r\necho &quot;# Information about IP addresses #####&quot;\r\necho &quot;######################################&quot;\r\necho &quot;Server ipv4 addresses:&quot;\r\nip addr show | grep &quot;inet &quot;<\/code><\/pre><p>Сейчас пока задач по доработкам нет — свои задачи скрипт выполнил, но некоторые мысли есть...<\/p>\n<ul>\n<li>* сейчас скрипт не проверяет OS и отработает только под Debian-подобной системой (поскольку CentOS и других под рукой уже нет — дописывать и проверять сложно, пока отложено);<\/li>\n<li>* скрипт не проверяет установлен ли сейчас какой-то агент, он просто перезапишет конфиг (не очень ясно, насколько это востребованная история);<\/li>\n<li>* скрипт не проверяет занятость порта (отсылка к предыдущему пункту по сути);<\/li>\n<li>* скрипт не использует сертификаты или PKI (при наличии задачи возможно стоило бы использовать);<\/li>\n<li>* при однородности серверов мониторинга можно было бы наверное использовать фиксированные значения или давать выбор (здесь опущено для универсальности, серверы были разные);<\/li>\n<li>* возможно стоило бы подумать и усложнить конфигурационный файл агента (стоит обдумать опции на досуге);<\/li>\n<\/ul>\n",
            "date_published": "2021-05-21T10:14:45+03:00",
            "date_modified": "2021-05-21T15:05:38+03:00",
            "tags": [
                "bash",
                "Debian",
                "Ubuntu",
                "Zabbix",
                "скрипт"
            ],
            "_date_published_rfc2822": "Fri, 21 May 2021 10:14:45 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "230",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "227",
            "url": "https:\/\/skurudo.ru\/all\/import-users-to-yandex-connect\/",
            "title": "Импорт пользователей в Яндекс.Коннект через API",
            "content_html": "<p>Возникла задача добавить несколько десятков пользователей в Яндекс.Коннект и сразу же начались поиски пути решения, чтобы избавиться от ручного труда и в дальнейшем облегчить жизнь. Решил попробовать вариант от <a href=\"https:\/\/habr.com\/ru\/users\/Energys\/\">Energys<\/a> — статья на <a href=\"https:\/\/habr.com\/ru\/post\/448036\/\">habr’e<\/a>. Почему попробовать? За пару лет что-то могло перестать работать, как говорится — «За время пути собака могла подрасти!»<\/p>\n<p>С первого взгляда не понравилось то, что пароли у сотрудников будущих одинаковые — это обязательно нужно было поменять, плюс не указана должность — потребовалось добавить. Однако для общего понимания статья подходит как нельзя лучше. К тому же изменения сравнительно не сложные — готовимся и применяем.<\/p>\n<p>Самое не простое в этой истории — возня с токеном от Яндекса. В статье она описана, пройдем по шагам для истории и чтобы ничего не забыть:<\/p>\n<ul>\n<li>* зайти в аккаунт яндекса под администратором домена;<\/li>\n<li>* в <a href=\"https:\/\/oauth.yandex.ru\/\">Я.OAuth<\/a> первым делом нужно создать приложение;<\/li>\n<li>* приложению даем права, в нашем случае — Яндекс.Коннект Directory API;<\/li>\n<li>* выбираем платформу «веб-сервисы» и нажимаем «подставить url для разработки»;<\/li>\n<li>* сохраняемся и получим ID приложения — именно оно понадобится для получения токене;<\/li>\n<li>* вставляем ID приложения и получаем токен:<\/li>\n<\/ul>\n<pre class=\"e2-text-code\"><code class=\"\">https:\/\/oauth.yandex.ru\/authorize?response_type=token&amp;client_id=&lt;ID приложения&gt;<\/code><\/pre><ul>\n<li>* именно этот токен и будет использоваться в скрипте;<\/li>\n<\/ul>\n<p>Идея сравнительно не сложная:<\/p>\n<ol start=\"1\">\n<li>готовим файл определенного образца;<\/li>\n<li>добавляем переменных;<\/li>\n<li>читаем список из файла;<\/li>\n<li>в запросе в цикле добавляем переменные;<\/li>\n<li>в каждой итерации ждем пару секунд.<\/li>\n<\/ol>\n<p>Сам скрипт выглядит следующим образом — он же на <a href=\"https:\/\/github.com\/skurudo\/usefulbash\/blob\/main\/yandex-connect-mass-user-add.sh\">GitHub<\/a>:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">#!\/bin\/bash\r\n# path to users list - путь к списку пользователей\r\nemployees=&#039;.\/usrlist&#039;\r\n# line example from users list - пример строки файла \r\n# usrlist: email_lastname_firstname_middlename_password_position\r\n# for example: petrova_Петрова_Авдотья_Федоровна_eeKrutoiparol23_Менеджер\r\n\r\n# OAuth_Token\r\n# link to material about token - ссылка на формирование отладочного токена\r\n# https:\/\/tech.yandex.ru\/oauth\/doc\/dg\/tasks\/get-oauth-token-docpage\/\r\n# link about our apps - список ваших приложений\r\n# https:\/\/oauth.yandex.ru\/\r\n# get token from apps id - получить токен из ID приложения\r\n# https:\/\/oauth.yandex.ru\/verification_code#access_token=435843755894374389\r\nTOKEN=&quot;token-here-and-there&quot;\r\n\r\n# read and trim user file - читаем и перебираем файл со списком пользователей\r\nfor i in $( cat $employees ); do\r\nvalue=($(echo $i | tr &quot;_&quot; &quot; &quot;))\r\n\r\n# make variables for api request from file - заводим переменные для запроса из файла\r\nemail=&quot;${value[0]}&quot;\r\nlastname=&quot;${value[1]}&quot;\r\nfirstname=&quot;${value[2]}&quot;\r\nmiddlename=&quot;${value[3]}&quot;\r\npassword=&quot;${value[4]}&quot;\r\nposition=&quot;${value[5]}&quot;\r\n\r\n# Make user for good - создаем сотрудника ради добра\r\n# department = 1 for default - департамент 1 умолчанию\r\n#only http answers, not full - только http ответы, не полный лог\r\ncurl -i -X POST -H &#039;Content-type: application\/json&#039; -d &#039;{&quot;department_id&quot;: 1, &quot;position&quot;: &quot;&#039;$position&#039;&quot;, &quot;password&quot;: &quot;&#039;$password&#039;&quot;, &quot;nickname&quot;: &quot;&#039;$email&#039;&quot;, &quot;name&quot;: {&quot;first&quot;: &quot;&#039;$firstname&#039;&quot;, &quot;last&quot;: &quot;&#039;$lastname&#039;&quot;, &quot;middle&quot;: &quot;&#039;$middlename&#039;&quot;}}&#039; -H &quot;Authorization: OAuth $TOKEN&quot; &#039;https:\/\/api.directory.yandex.net\/v6\/users\/&#039; | grep HTTP\r\n#full answers - полные ответы\r\n#curl -i -X POST -H &#039;Content-type: application\/json&#039; -d &#039;{&quot;department_id&quot;: 1, &quot;position&quot;: &quot;&#039;$position&#039;&quot;, &quot;password&quot;: &quot;&#039;$password&#039;&quot;, &quot;nickname&quot;: &quot;&#039;$email&#039;&quot;, &quot;name&quot;: {&quot;first&quot;: &quot;&#039;$firstname&#039;&quot;, &quot;last&quot;: &quot;&#039;$lastname&#039;&quot;, &quot;middle&quot;: &quot;&#039;$middlename&#039;&quot;}}&#039; -H &quot;Authorization: OAuth $TOKEN&quot; &#039;https:\/\/api.directory.yandex.net\/v6\/users\/&#039; \r\n# wait for 2 sec - ждем пару секунд\r\nwait 2\r\ndone<\/code><\/pre><p>C чем удалось столкнуться при отладке и работе скрипта? Буквально несколько моментов:<\/p>\n<ul>\n<li>* если посылать запросы слишком часто, часть может не сработать — нужно подбирать тайминги между запросами.. пауза в 1-2 секунды работает;<\/li>\n<li>* обязательно нужно смотреть на входные данные — аккуратность с символами в названиях важна;<\/li>\n<li>* моя частая ошибка — 422 Unprocessable Entity — при разборе оказалось, что пароль был слишком простой;<\/li>\n<\/ul>\n",
            "date_published": "2021-03-04T15:00:15+03:00",
            "date_modified": "2021-05-21T10:15:44+03:00",
            "tags": [
                "api",
                "bash",
                "почта",
                "скрипт",
                "Яндекс"
            ],
            "_date_published_rfc2822": "Thu, 04 Mar 2021 15:00:15 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "227",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        }
    ],
    "_e2_version": 4116,
    "_e2_ua_string": "Aegea 11.2 (v4116)"
}