master
Долгий Артём 2022-05-07 22:12:11 +03:00
commit 0a6b63b4e6
64 changed files with 7293 additions and 0 deletions

BIN
Markdown.docx Normal file

Binary file not shown.

BIN
Markdown.pdf Normal file

Binary file not shown.

30
OnlyOffice.md Normal file
View File

@ -0,0 +1,30 @@
**OnlyOffice + Nextcloud**
Условия:
1. Сервер на Ubuntu 18.04
2. Docker
3. RAM 6 Гб
Устанавливаем Docker по этой инструкции
https://www.8host.com/blog/ustanovka-i-ispolzovanie-docker-v-ubuntu-18-04/
Установка серверной версии Community Edition с помощью скрипта
https://helpcenter.onlyoffice.com/ru/server/docker/opensource/opensource-script-installation.aspx
*Ставил только сервер документов*
Скрипт изменился, теперь он называется `workspace-install.sh`
Скачиваем скрипт установки
~~`wget http://download.onlyoffice.com/install/opensource-install.sh`~~
`wget https://download.onlyoffice.com/install/workspace-install.sh`
Следующая команда выводит список всех доступных параметров скрипта:
~~`bash opensource-install.sh -h`~~
`sudo bash workspace-install.sh -h`
Выбираем ту строку, где только сервер документов
Для обновления до актуальной версии также смотрим в параметрах
Для связки с Nextcloud, в настройках Nextcloud необходимо указать внешние ссылки сервера документов типа:
https://office.da2001.ru
https://cloud.da2001.ru

View File

@ -0,0 +1,55 @@
### Proxmox Cloud-Init Support
https://pve.proxmox.com/wiki/Cloud-Init_Support
https://cloud-images.ubuntu.com
```bash
# download the image
wget https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img
# create a new VM
qm create 3000 --memory 1024 --net0 virtio,bridge=vmbr1
qm set 3000 --name ubuntu
# import the downloaded disk to local-lvm storage
qm importdisk 3000 focal-server-cloudimg-amd64.img local-lvm
# finally attach the new disk to the VM as scsi drive
qm set 3000 --scsihw virtio-scsi-pci --scsi0 local-lvm:vm-3000-disk-0
```
###### Add Cloud-Init CD-ROM drive
The next step is to configure a CD-ROM drive, which will be used to pass the Cloud-Init data to the VM.
```bash
qm set 3000 --ide2 local-lvm:cloudinit
```
To be able to boot directly from the Cloud-Init image, set the bootdisk parameter to scsi0, and restrict BIOS to boot from disk only. This will speed up booting, because VM BIOS skips the testing for a bootable CD-ROM.
```bash
qm set 3000 --boot c --bootdisk scsi0
```
Also configure a serial console and use it as a display. Many Cloud-Init images rely on this, as it is an requirement for OpenStack images.
```bash
qm set 3000 --serial0 socket --vga serial0
```
In a last step, it is helpful to convert the VM into a template. From this template you can then quickly create linked clones. The deployment from VM templates is much faster than creating a full clone (copy).
```bash
qm template 3000
```
###### Deploying Cloud-Init Templates
You can easily deploy such a template by cloning:
```bash
qm clone 3000 171 --name us171
```
Then configure the SSH public key used for authentication, and configure the IP setup:
```bash
qm set 171 --sshkey ~/.ssh/id_rsa.pub
qm set 171 --ipconfig0 ip=192.168.10.171/24,gw=192.168.10.9
```

13
Proxmox/Proxmox to KVM.md Normal file
View File

@ -0,0 +1,13 @@
Для конвертации резервной копии ВМ из Proxmox
Ставим на виртуалку Proxmox, подключаемся к его консоли и:
1) Разархивируем образ
`lzop -d /mnt/pve/qbackvm/100.vma.lzo /home/100.vma`
2) Конвертируем в raw
`vma extract /home/100.vma -v /home/raw`
3) Конвертируем в qcow2
`qemu-img convert -f raw -O qcow2 /home/raw/100.raw /home/100.qcow2`
Далее в kvm создаем ВМ и подставляем `100.qcow2` в качестве загрузочного диска

View File

@ -0,0 +1,91 @@
### Proxmox, подключение физического жесткого диска в виртуальную машину
1. В общем случае это можно сделать одной простой командой:
```
qm set <vm_id> -[virtio|sata|ide|scsi][№] /dev/sd[a|b|c|...]
```
где:
```
vm_id — номер виртуальной машины (в интерфейсе Proxmox указывается перед именем VM
-[virtio|sata|ide|scsi][№] — допустимый тип и номер HDD интерфейса
/dev/sd[a|b|c…] — пробрасывоемое физическое устройство
```
**Но при таком подходе может случится, что в систему прокинется не тот диск, если перепутать порты на материнской
плате, поэтому гораздо эффективней пробросить устройство по его id.**
Найдем id нашего диска:
```
ls -l /dev/disk/by-id/
```
```
da2001@Metromint:~$ ls -l /dev/disk/by-id/
итого 0
lrwxrwxrwx 1 root root 9 июн 9 09:58 ata-ST1000LM035-1RK172_ZDEH8TVK -> ../../sda
lrwxrwxrwx 1 root root 10 июн 9 09:58 ata-ST1000LM035-1RK172_ZDEH8TVK-part1 -> ../../sda1
lrwxrwxrwx 1 root root 10 июн 9 09:58 ata-ST1000LM035-1RK172_ZDEH8TVK-part2 -> ../../sda2
lrwxrwxrwx 1 root root 10 июн 9 09:58 ata-ST1000LM035-1RK172_ZDEH8TVK-part3 -> ../../sda3
lrwxrwxrwx 1 root root 13 июн 9 09:58 nvme-HFM256GDJTNG-8310A_NJ93N253310403M4A -> ../../nvme0n1
lrwxrwxrwx 1 root root 15 июн 9 09:58 nvme-HFM256GDJTNG-8310A_NJ93N253310403M4A-part1 -> ../../nvme0n1p1
lrwxrwxrwx 1 root root 15 июн 9 09:58 nvme-HFM256GDJTNG-8310A_NJ93N253310403M4A-part3 -> ../../nvme0n1p3
lrwxrwxrwx 1 root root 15 июн 9 09:58 nvme-HFM256GDJTNG-8310A_NJ93N253310403M4A-part4 -> ../../nvme0n1p4
```
```
qm set 150 -virtio2 /dev/disk/by-id/ata-ST1000LM035-1RK172_ZDEH8TVK
```
2. Прописать в конфигурационный файл
*конфигурационные файлы виртуальных машин лежат по пути*
```
/etc/pve/qemu-server
```
```
root@pve:/etc/pve/qemu-server# ls -l
итого 6
-rw-r----- 1 root www-data 851 июн 9 13:06 100.conf
-rw-r----- 1 root www-data 504 янв 10 12:11 101.conf
-rw-r----- 1 root www-data 490 янв 17 11:51 102.conf
-rw-r----- 1 root www-data 310 июн 8 02:27 103.conf
-rw-r----- 1 root www-data 544 июн 9 13:06 104.conf
-rw-r----- 1 root www-data 333 мар 29 10:08 105.conf
-rw-r----- 1 root www-data 344 июн 8 02:34 106.conf
-rw-r----- 1 root www-data 731 июн 9 13:06 107.conf
-rw-r----- 1 root www-data 334 мая 14 09:16 108.conf
-rw-r----- 1 root www-data 368 июл 28 2020 109.conf
-rw-r----- 1 root www-data 330 июн 8 20:24 110.conf
-rw-r----- 1 root www-data 588 июн 9 13:06 112.conf
```
Выбираем необходимую виртуалку
```
vi 100.conf
```
Добавляем нужный диск
```
scsi1: /dev/disk/by-id/ata-ST2000VN000-1HJ164_W7200J60,backup=0
```
```
agent: 1,fstrim_cloned_disks=1
boot: cdn
bootdisk: scsi0
cores: 2
ide2: none,media=cdrom
memory: 4096
name: S-DNAS
net0: virtio=F6:79:BA:89:90:D5,bridge=vmbr0,firewall=1
numa: 0
onboot: 1
ostype: l26
protection: 1
scsi0: local-lvm:vm-100-disk-0,size=32G
scsi1: /dev/disk/by-id/ata-ST2000VN000-1HJ164_W7200J60,backup=0
scsi2: /dev/disk/by-id/ata-ST2000VN000-1HJ164_W7201D04,backup=0
scsihw: virtio-scsi-pci
smbios1: uuid=0a43c8e8-33f0-4472-9508-2b4b3d3c196f
sockets: 1
spice_enhancements: foldersharing=1
vga: qxl
vmgenid: 2d5bb546-186a-4b01-b469-94f3c56224be
```

View File

@ -0,0 +1,4 @@
**образы iso по-умолчанию лежат в папке**
```
/var/lib/vz/template/iso
```

Binary file not shown.

Binary file not shown.

61
alias.md Normal file
View File

@ -0,0 +1,61 @@
# Создание псевдонимов (alias) для часто используемых команд
## Содержание
- [Общее](#общее)
- [Подключение к сессии Tmux при подключении по SSH](#подключение-к-сессии-tmux-при-подключении-по-ssh)
## Общее
Все алиасы прописываются для конкретного пользователя в файле `~/.bashrc`
апример, чтобы вывести данные по IP в цвете необходимо ввести `ip --color=auto a`_
можно создать такой алиас: `alias ip='ip --color=auto'`
**Перелогиниться** и теперь при вводе `ip a` вывод будет цветной
Таким образом можно делать псевдонимы для любых команд:
```bash
alias ll='ls -l'
alias upd='apt update && apt upgrade -y && apt autoremove -y'
```
Кроме алиасов в .bashrc можно добавлять целые функции:
```bash
wanip() {
wget -q -O - checkip.dyndns.com | awk '{print $6}'| sed 's/<.*>//'
}
```
_перелогиниться_. Функция отображает внешний IP
```bash
pi@testberry:~ $ wanip
85.143.252.68
```
**_А лучше вынести в отдельный файл, для этого в `.bashrc` добавить_**
```bash
if [ -f ~/.bash_func ]; then
. ~/.bash_func
fi
```
`.bash_func` — имя файла, где и будем писать функции.
[⬆ Наверх](#содержание)
## Подключение к сессии Tmux при подключении по SSH
В конец файла `.bashrc` добавить:
```bash
# start tmux session for all ssh connections
if [[ -n "$PS1" ]] && [[ -z "$TMUX" ]] && [[ -n "$SSH_CONNECTION" ]]; then
tmux attach-session -t ssh_tmux || tmux new-session -s ssh_tmux
fi
```
[⬆ Наверх](#содержание)

862
ansible.md Normal file
View File

@ -0,0 +1,862 @@
###### top
## Ansible
[Официальная документация](https://docs.ansible.com/ansible/latest/user_guide/)
***
[Базовые понятия Ansible](#part1)
- [inventory](#chapter1)
- [Модули](#chapter2)
- [Ad-hoc команды](#chapter3)
[Ansible playbook](#part2)
- [Простой playbook](#chapter4)
- [Переменные](#chapter5)
- [Отладка](#chapter6)
- [Блоки и обработка ошибок](#chapter7)
- [Асинхронные задачи](#chapter8)
- [Пример playbook - установка Docker + Docker-compose](#chapter9)
- [](#chapter10)
- [](#chapter11)
- [](#chapter12)
***
###### part1
## Базовые понятия Ansible
[вверх](#top)
Установить ansible можно с помощью пакетного менеджера, будет установлена версия, которая есть в репозиториях дистрибутива, скорее всего, эта версия не будет являться последней.
При установке через пакетный менеджер будет создана папка с параметрами по-умолчанию по пути `/etc/ansible/`.
Также, ansible можно установить с помощью pip. Будет установлена последняя версия, но папка с параметрами по-умолчанию создана не будет.
###### Chapter1
### inventory
https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html#intro-inventory
Описание хостов, на которых необходимо выполнять какие-то действия производится в файле inventory.
Синтаксис файла может быть в виде `ini` или `yaml` форматов.
Пример описания inventory с использованием ini
```dosini
my.domain.com
[mygroup]
domain.com
app.domain.com
[dbservers]
db.domain.com
```
Пример описания inventory с использованием yaml
```yaml
all:
hosts:
my.domain.com:
children:
mygroup:
hosts:
domain.com:
app.domain.com:
dbservers:
hosts:
db.domain.com:
```
Указывать хосты можно в виде диапазона
```dosini
[webservers]
www[01:50].example.com
```
Для удобства хостам можно задавать свои имена и передавать переменные которые будут доступны на хостах
```dosini
[db]
mydb env=production replicas=2
```
Можно указать параметры подключения
```dosini
[db]
myhost ansible_port=222 ansible_host=192.168.1.23
```
Переменные можно указать для группы хостов
```dosini
[db]
db1.com
db2.com
[db:vars]
env=production
```
В inventory можно указать параметры подключения
```
ansible_connection
ansible_host
ansible_port
ansible_user
ansible_password
```
Параметры подключения ssh/sftp/scp
```
ansible_ssh_private_key_file
ansible_ssh_common_args
ansible_ssh_extra_args
ansible_ssh_pipelining
ansible_ssh_executable
ansible_scp_extra_args
ansible_sftp_extra_args
```
Привилегии
```
ansible_become
ansible_become_method
ansible_become_user
ansible_become_password
ansible_become_exe
ansible_become_flags
```
Настройки shell
```
ansible_shell_type
ansible_python_interpreter
ansible_shell_executable
```
Пример файла inventory
```bash
user@host$ cat hosts.ini
```
```dosini
[deploy]
us1 ansible_host=192.168.10.151
[managers]
us2 ansible_host=192.168.10.152
us3 ansible_host=192.168.10.153
[workers]
us154 ansible_host=192.168.10.154
us155 ansible_host=192.168.10.155
[all:vars]
ansible_user=da2001
ansible_port=22
ansible_ssh_private_key_file=~/.ssh/id_rsa.pub
```
Пользовательский файл инвентаря
*Файл инвентаря по-умолчанию обычно находится в /etc/ansible/hosts, но можно использовать опцию `-i` для указания пользовательских файлов при запуске команд и плейбуков Ansible. Это удобный способ настройки индивидуального инвентаря для каждого проекта, который можно включить в системы контроля версий, такие как Git:*
```bash
ansible all -m ping -i my_custom_inventory
```
Такая опция действительна и для ansible-playbook:
```bash
ansible-playbook myplaybook.yml -i my_custom_inventory
```
Динамический файл инвентаря
*Ansible поддерживает сценарии инвентаризации для создания динамических файлов. Это полезно если инвентарь часто меняется, когда серверы создаются и уничтожаются.*
*Существуют готовые скрипты с открытым исходным кодом в официальном репозитории [Ansible GitHub](https://github.com/ansible/ansible). После загрузки требуемого сценария на Ansible control machine и настройки необходимых параметров (например, учетных данных API) можно запустить исполняемый файл в качестве пользовательского инвентаря с любой командой Ansible, которая поддерживает эту опцию.*
*Следующая команда использует скрипт инвентаря my_inventory.py с командой ping для проверки подключения ко всем текущим активным серверам:*
```bash
ansible all -m ping -i my_inventory.py
```
*Как использовать динамические файлы инвентаризации описано в [официальной документации Ansible](https://docs.ansible.com/ansible/latest/user_guide/intro_dynamic_inventory.html).*
Инвентарь можно описывать в отдельной папке и группировать хосты в отдельных файлах.
*например, можно создать папку `hosts`, в ней папку `bd` и уже в этой папке создавать файлы с описанием хостов*
Запуск в этом случае будет выглядеть так:
```bash
ansible -i hosts -m ping
```
или
```bash
ansible -i bd -m ping
```
[вверх](#top)
***
###### Chapter2
### Модули
https://docs.ansible.com/ansible/latest/user_guide/modules.html
Пример использования модулей
```bash
ansible webservers -m service -a "name=httpd state=started"
```
```bash
ansible webservers -i /home/user/ansible/hosts.ini -m command -a "/sbin/reboot -t now"
```
[Список доступных модулей на сайте Ansible](https://docs.ansible.com/ansible/2.8/modules/list_of_all_modules.html)
*описание модулей можно получить в cli, для этого используется команда*
```bash
ansible-doc -l
```
*будет выведен список доступных модулей в less подобном отображении*
Документация по конкретному модулю `ansible-doc <название модуля>`
```bash
ansible-doc user
```
[вверх](#top)
***
###### Chapter3
### Ad-hoc команды
https://docs.ansible.com/ansible/latest/user_guide/intro_adhoc.html
Структура команды
```bash
ansible -i hosts -m user -a "name=student state=present" all
^ ^ ^ ^
| | | |
инвентарь | аргументы используемые хосты
модуль
```
Создание пользователя на хостах
*если пользователь существует, вернётся сообщение зеленого цвета*
*если пользователь не существует, ansible попытается его создать. Если команда была запущена не от root, вернётся сообщение красного цвета типа __Pemission denied__*
```bash
ansible -i hosts.ini -m user -a "name=da2001 state=present" all
```
*создать нового пользователя с повышением привилегий - sudo*
```bash
ansible -i hosts.ini -m user -a "name=student state=present" -b -K all
```
`-b` - команда должна выполняться с привилегиями sudo
`-K` - запрашивать пароль sudo перед выполнением команды
*удалить пользователя*
```bash
ansible -i hosts.ini -m user -a "name=student state=absent" -b -K all
```
*передать sudo пароль в виде аргументов - extra args*
```bash
ansible -i hosts.ini -m user -a "name=student state=present" -e "ansible_become=true ansible_become_password=USER-PASS" all
```
`USER-PASS` - пароль пользователя для выполнения команды с привилегиями sudo
[вверх](#top)
***
###### part2
## Ansible playbook
[вверх](#top)
https://docs.ansible.com/ansible/latest/user_guide/playbooks_intro.html
###### Chapter4
### Простой playbook
```bash
cat user.yml
```
```bash
---
- name: user - имя playbook, произвольное
hosts: deploy - группа хостов из файла inventory
tasks: - задачи, выполняемые в этом плейбуке
- name: Create user - имя задачи, произвольное
user: - название модуля, который используется в этой задаче
name: da2001 - аргументы модуля
state: present - аргументы модуля
become: true
```
```bash
ansible-playbook -i hosts.ini user.yml -K
```
[вверх](#top)
***
###### Chapter5
### Переменные
https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html
Переменные можно задавать в:
- playbook
- block
- tasks
- group_vars
- host_vars
- inventory
- extra_vars
- var_files
***переменная задаётся в фигурных скобках, обязательно в кавычках***
```bash
cat user.yml
```
```yaml
---
- name: user
hosts: deploy
tasks:
- name: Create user
vars:
user: da2001
user:
name: "{{ user }}"
state: present
become: true
```
Переменная может быть задана во внешнем файле
```bash
cat myvars.yml
```
```yaml
user: da2001
```
*в плейбуке необходимо указать файл с переменными*
```yaml
---
- name: user
hosts: deploy
vars_files:
- ./myvars.yml
tasks:
- name: Create user
user:
name: "{{ user }}"
state: present
become: true
```
Вместе с ansible устанавливается плагин, который позволяет считывать переменные из определённых файлов и папок без явного указания этих файлов и папок в плейбуке
- `group_vars` - папка в которой нужно создать папку с названием группы, для которой будут задаваться переменные. Например, для группы хостов `deploy` необходимо создать такой путь/файл - `./group_vars/deploy/vars.yml`
```bash
cat ./group_vars/deploy/vars.yml
```
```yaml
user: da2001
```
*в самом плейбуке нет необходимости где-то указывать ссылки на файл с переменными*
```bash
cat user.yml
```
```yaml
---
- name: user
hosts: deploy
tasks:
- name: Create user
user:
name: "{{ user }}"
state: present
become: true
```
Если переменные могут использоваться во всех группах, можно создать папку `all` - `./group_vars/all/vars.yml`
- `host_vars` - папка, в которой создаётся файл с именем хоста - `./host_vars/us1.yml`. Если для хоста имя не задано - `./host_vars/192.168.10.151.yml`
- создание переменных в файле инвентаря
*для хоста us1 добавлена переменная `user`*
```bash
cat hosts.ini
```
```
[deploy]
us1 ansible_host=192.168.10.151 user=da2001
[managers]
us2 ansible_host=192.168.10.152
us3 ansible_host=192.168.10.153
[workers]
us154 ansible_host=192.168.10.154
us155 ansible_host=192.168.10.155
[all:vars]
ansible_user=da2001
ansible_port=22
ansible_ssh_private_key_file=~/.ssh/id_rsa.pub
```
- `--extra-vars` - передача переменных в команде запуска
```bash
ansible-playbook -i hosts.ini user.yml -K --extra-vars "user=da2001"
```
- `vars-prompt` - ввод переменных в интерактивном режиме при выполнении playbook
```bash
cat user.yml
```
```yaml
---
- name: user
hosts: deploy
vars_prompt:
- name: user
prompt: "Введите имя пользователя"
private: no
tasks:
- name: Create user
user:
name: "{{ user }}"
state: present
become: true
```
`private: no` - отображать ли вводимые символы
[вверх](#top)
***
###### Chapter6
### Отладка
Очень полезно получать в консоль результат выполнения плейбука.
1. Один из способов это создание в плейбуке поля `register` с какой-либо переменной для вывода. Далее этот вывод получаем в таске `debug`. Например:
```yaml
---
- name: user
hosts: deploy
tasks:
- name: Create user
vars:
user: da2001
user:
name: "{{ user }}"
state: present
become: true
register: output
- debug:
var: output
```
После запуска плейбука
```bash
ansible-playbook -i hosts.ini user.yml -K
```
к выводу добавится значение таск `debug` с выводом значения созданной нами переменной `output`
```json
TASK [debug] ***********************************************************************************************************
ok: [us1] => {
"output": {
"append": false,
"changed": false,
"comment": "da2001",
"failed": false,
"group": 1000,
"home": "/home/da2001",
"move_home": false,
"name": "da2001",
"shell": "/bin/bash",
"state": "present",
"uid": 1000
}
}
```
2. Debugger
https://docs.ansible.com/ansible/latest/user_guide/playbooks_debugger.html#playbook-debugger
| Значение | Результат |
|----------------|-----------|
| always | всегда вызывать отладчик, независимо от результата |
| never | никогда не запускать отладчик, независимо от результата |
| on_failed | вызывать отладчик только в случае сбоя задачи |
| on_unreachable | вызывать отладчик только в том случае, если хост недоступен |
| on_skipped | вызывать отладчик только в том случае, если задача пропущена |
```yaml
---
- name: user
hosts: deploy
tasks:
- name: Create user
vars:
user: da2001
user:
name: "{{ user }}"
state: present
become: true
debugger: always
```
При наступлении условия, при котором вызывается отладчик, выполнение задачи приостанавливается и отладчик ожидает действий от пользователя
```bash
user@host:~$ ansible-playbook -i hosts.ini user.yml -K
BECOME password:
PLAY [user] ************************************************************************************************************
TASK [Gathering Facts] *************************************************************************************************
ok: [us1]
TASK [Create user] *****************************************************************************************************
ok: [us1]
[us1] TASK: Create user (debug)>
```
Отладчик принимает команды:
| Команда | Сокр. вызов | Действие |
| -------------------------- | ----------- | ------------------------------------------------------------ |
| print | p | напечатать информацию о задаче |
| task.args[*key*] = *value* | no shortcut | изменить значение аргумента |
| task_vars[*key*] = *value* | no shortcut | изменить значение переменной (далее необходимо выполнить `update_task`) |
| update_task | u | повторно создать задачу с обновленными переменными |
| redo | r | заново запустить задачу |
| continue | c | продолжить выполнение, запуск следующей задачи |
| quit | q | выход из отладчика |
*Примеры:*
```
[us1] TASK: Create user (debug)> p task
TASK: Create user
```
```
[us1] TASK: Create user (debug)> p task.args
{'_ansible_check_mode': False,
...
'_ansible_version': '2.11.6',
'name': 'da2001',
'state': 'present'}
```
```
[us1] TASK: Create user (debug)> p task.vars
{'user': 'da2001'}
```
```
[us1] TASK: Create user (debug)> p task_vars
{'ansible_all_ipv4_addresses': ['192.168.10.151'],
...
'playbook_dir': '/home/da2001/ansible/udemy/ansible',
'role_names': [],
'user': 'da2001'}}
```
```
[us1] TASK: Create user (debug)> p task_vars['user']
'da2001'
```
```
[us1] TASK: Create user (debug)> p host
us1
```
```
[us1] TASK: Create user (debug)> task_vars['user'] = 'user'
[us1] TASK: Create user (debug)> p task_vars['user']
'user'
[us1] TASK: Create user (debug)> update_task
[us1] TASK: Create user (debug)> redo
```
[вверх](#top)
***
###### Chapter7
### Блоки и обработка ошибок
Пример блока
```yaml
---
- name: user
hosts: deploy
tasks:
- name: Preconfig block
block:
- name: Create user
vars:
user: da2001
user:
name: "{{ user }}"
state: present
- name: Install curl
apt:
name: curl
update-cashe: yes
become: true
```
Условие выполнения блока
*в начале выполнения плейбука, ansible собирает факты о хостах, на основе полученных фактов можно описывать условия выполнения блоков.*
Например: добавим условие, при котором блок будет выполняться только если в качестве хоста используется Ubuntu. Для этого в блок нужно добавить:
```yaml
when: ansible_facts['distribution' == 'Ubuntu']
```
Обработка ошибок
```yaml
---
- name: user
hosts: deploy
tasks:
- name: Preconfig block
block:
- name: Create user
vars:
user: da2001
user:
name: "{{ user }}"
state: present
register: error
- name: Install curl
apt:
name: curl
update-cashe: yes
register: error
become: true
rescue:
- name: Some error print
debug:
var: error
always:
- name: Reboot
debug:
msg: "Rebooooooting"
```
Обработка ошибок происходит в блоке `rescue`. В каждом задании мы определили `register: error` - переменную, которая будет отображаться при возникновении ошибки. Т.к. в блоке `rescue` определена единственная переменная `var: error` - она будет выводиться при ошибке в любом задании. Для каждого задания можно определить свою переменную.
Блок `always` будет выполняться всегда, вне зависимости от того, были ошибки в заданиях или нет.
**Другие возможности управления ошибками**
- `any_errors_fatal` - true/false. Если установлено значение `true` - появление любой ошибки будет приводить к остановке плейбука, `false` - имеет обратное значение, плейбук попытается продолжить своё выполнение при любых ошибках.
- `ignore_errors` - true/false. В некоторых задачах можно установить параметр, чтобы игнорировать возникающие ошибки и перейти к выполнению следующей задачи.
- принудительный вызов ошибки. Можно создать отдельную задачу, в которой будет перехвачен вывод и будет сымитирована ошибка, которая приведёт к остановке выполнения плейбука. В нужное место плейбука добавить подобную задачу:
```yaml
- name: Fail on FAILED
command: echo "FAILED"
register: command_result
failed_when: "'FAILED' in command_result.stdout"
```
*при выполнении этой задачи, команда echo выведет в консоль слово `FAILED`, следующей строкой происходит перехват вывода и проверяется на соответствие условию - `'FAILED' in command_result.stdout`, если условие выполняется, сформируется ошибка и дальнейшее выполнение будет остановлено.*
[вверх](#top)
***
###### Chapter8
### Асинхронные задачи
Ansible выполняет задачи плейбука последовательно, иногда возникают ситуации, когда есть независимые друг от друга задачи, которые могут выполняться параллельно. Именно для этого используется асинхронный запуск длинных задач.
Т.е. задача запускается и ansible отключается от неё, чтобы подождать выполнение или переключиться на другую задачу.
*Пример - 1*
`async: 1000` - максимальное время в секундах, в течение которого задача должна выполниться
`poll: 5` - интервал в секундах, в течение которого ansible будет проверять состояние задачи
```bash
cat async.yml
```
```yaml
---
- name: user
hosts: deploy
tasks:
- name: Preconfig block
block:
- name: Sleep
command: sleep 15
async: 1000
poll: 5
become: true
```
```bash
user@host:~$ ansible-playbook -i hosts.ini async.yml -K
BECOME password:
PLAY [user] ************************************************************************************************************
TASK [Gathering Facts] *************************************************************************************************
ok: [us1]
TASK [Sleep] ***********************************************************************************************************
ASYNC POLL on us1: jid=290251027418.31066 started=1 finished=0
ASYNC POLL on us1: jid=290251027418.31066 started=1 finished=0
changed: [us1]
PLAY RECAP *************************************************************************************************************
us1 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
```
`ASYNC POLL on us1: jid=290251027418.31066 started=1 finished=0` - каждые 5 секунд (значение poll) ansible подключается к задаче по id (`jid=290251027418.31066`) и проверяет её статус. При этом, переключение на следующую задачу не произойдёт до завершения текущей задачи.
*Пример - 2*
*Задача 1 - спим 15 секунд, не дожидаясь окончания задачи переходим к следующей*
*Задача 2 - выполняем команду echo*
*Зачада 3 - проверяем статус выполнения первой задачи*
*`jid: "{{ sleep.ansible_job_id }}"` - получаем статус задачи __(выполнение задачи и получение её статуса важно делать от одного и того же пользователя, иначе ansible не увидит задачу. Т.е. если основная задача выполняется от sudo (`become: true`), то и проверять статус также нужно от sudo)__.*
*ждём выполнения задачи `until: job_result.finished`, при этом задаём необязательные параметры -*
*`retries: 100` - проверяем выполнение отслеживаемой задачи 100 раз*
*`delay: 1` - задержка между повторами - 1 секунда.*
```bash
cat async.yml
```
```yaml
---
- name: user
hosts: deploy
tasks:
- name: Preconfig block
block:
- name: Sleep
command: sleep 10
async: 1000
poll: 0
register: sleep
- name: Echo
command: echo "Задача выполнена"
become: true
- name: Check sleep status
async_status:
jid: "{{ sleep.ansible_job_id }}"
register: job_result
until: job_result.finished
retries: 100
delay: 1
become: true
```
```bash
user@host:~$ ansible-playbook -i hosts.ini async.yml -K
BECOME password:
PLAY [user] ************************************************************************************************************
TASK [Gathering Facts] *************************************************************************************************
ok: [us1]
TASK [Sleep] ***********************************************************************************************************
changed: [us1]
TASK [Echo] ************************************************************************************************************
changed: [us1]
TASK [Check sleep status] **********************************************************************************************
FAILED - RETRYING: Check sleep status (100 retries left).
FAILED - RETRYING: Check sleep status (99 retries left).
FAILED - RETRYING: Check sleep status (98 retries left).
FAILED - RETRYING: Check sleep status (97 retries left).
FAILED - RETRYING: Check sleep status (96 retries left).
FAILED - RETRYING: Check sleep status (95 retries left).
changed: [us1]
PLAY RECAP *************************************************************************************************************
us1 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
```
[вверх](#top)
***
###### Chapter9
### Пример playbook - установка Docker + Docker-compose
```yaml
---
- name: Preconfig
hosts: deploy
tasks:
- name: Установка Docker
block:
- name: Добавление репо Ububntu universe
apt_repository:
repo: "deb http://archive.ubuntu.com/ubuntu {{ ansible_distribution_release }} main universe restricted multiverse"
state: present
- name: Установка дополнительных пакетов
apt:
name:
- ca-certificates
- curl
- gnupg
- lsb-release
update_cache: true
- name: Добавление ключа Docker
apt_key:
url: https://download.docker.com/linux/ubuntu/gpg
keyring: /usr/share/keyrings/docker-archive-keyring.gpg
state: present
- name: Установка репозитория Docker
apt_repository:
repo: >
deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg]
https://download.docker.com/linux/ubuntu
{{ ansible_distribution_release }} stable
state: present
update_cache: true
filename: docker
- name: Установка Docker
apt:
name:
- docker-ce
- docker-ce-cli
- containerd.io
update_cache: true
- name: Проверка корректности установки Docker
service:
name: docker
state: restarted
enabled: true
become: true
- name: Установка Docker-compose
block:
- name: Получение последней версии Docker-compose
uri:
url: "https://api.github.com/repos/docker/compose/releases/latest"
body_format: json
register: page
- name: Установка Docker-compose
get_url:
url: "https://github.com/docker/compose/releases/download/{{ page.json.tag_name }}/docker-compose-Linux-x86_64"
dest: /usr/local/bin/docker-compose
mode: 0755
become: true
- name: Завершение установки
block:
- name: Добавление пользователя в группу Docker
user:
name: "{{ ansible_user }}"
groups: docker
append: true
- name: Перезагрузка
reboot:
become: true
```
*перечень необходимых пакетов, ссылки на репозитории и прочие данные, необходимые для установки взяты из официальной документации*
*https://docs.docker.com/engine/install/ubuntu/*
*https://docs.docker.com/compose/install/*
[вверх](#top)
***
```bash
git add . && git commit -m 'mod ansible' && git push
```

12
atom_default_file_type.md Normal file
View File

@ -0,0 +1,12 @@
# Изменение типа файла для всех вновь создаваемых файлов в Atom
Cоздать файл инициализации Atom `~/.atom/init.coffee`
atom.workspace.observeTextEditors (editor) ->
return if editor.getPath()?
editor.setGrammar(atom.grammars.grammarForScopeName('source.cpp'))
указать необходимый тип файла вместо `'source.cpp'`
Тип файла указать из ScopeName. Узнать ScopeName можно так [Finding a Language's Scope Name](https://flight-manual.atom.io/using-atom/sections/basic-customization/#finding-a-languages-scope-name)
Например для файлов Markdown необходимо указать `'text.md'`

90
autofs.md Normal file
View File

@ -0,0 +1,90 @@
#### Автомонтирование удалённых файловых систем по запросу (autofs)
Настройки autofs производятся только на клиенте, предполагается, что сервер уже настроен соответствующим образом.
Проверку того, что сервер настроен, можно выполнить командой на клиенте
```bash
$ showmount -e
```
должны отобразится папки удалённого сервера, доступные для монтирования.
или на сервере
```bash
# exportfs -s
```
1. **В первую очередь необходимо установить соответствующий пакет**
*rpm*
```bash
# dnf install autofs
```
*deb*
```bash
# apt install autofs
```
2. **После установки пакета, необходимо запустить службу в systemd**
```bash
# systemctl enable --now autofs
```
3. **Основной файл настроек находится в `/etc/auto.master`**
Файл содержит такой комментарий и настройку
```
# Include /etc/auto.master.d/*.autofs
# The included files must conform to the format of this file.
#
+dir:/etc/auto.master.d
```
Таким образом, ориентируясь на *best practics*, пользовательские настройки лучше сохранять в директории `/etc/auto.master.d/`, название конфигурационного файла должно заканчиваться на `.autofs`
Создадим свой конфигурационный файл
```bash
# vim /etc/auto.master.d/demo.autofs
```
следующего содержания
```bash
/demoshare /etc/auto.demo
```
или
```bash
/- /etc/auto.demo
```
явных требований к названию файла `auto.demo` в документации не приводится, но обычно используются такие: `auto.nfs`, `auto.misc`, `auto.home` и пр.
4. **Следующим шагом будет указание пути к удалённой папке**
*необходимо создать файл, который указали в предыдущем шаге*
```bash
# vim /etc/auto.demo
```
*в файле будет указана локальная точка монтирования, опции монтирования и удалённая ФС*
```bash
localdir -rw,sync 192.168.13.6:/shares
```
**в данном случае на клиенте должна существовать директория `/demoshare`, при обращении к `/demoshare/localdir` в директории `/demoshare` будет автоматически создаваться директория `localdir` с содержимым смонтированной удалённой директории `192.168.13.6:/shares`**
или указать полный путь к локальной точке монтирования, если в карте `/etc/auto.master.d/demo.autofs` был указан `/-`
```bash
/localmnt/localdir -rw,sync 192.168.13.6:/shares
```
**в этом случае на клиенте при обращении к `/localmnt/localdir` будет создаваться соответствующая директория с содержимым смонтированной удалённой директории `192.168.13.6:/shares`**
5. **Подстановочные маски (Indirect Wildcard Maps)**
Если NFS сервер экпортирует несколько подкаталогов и эти подкаталоги могут динамически изменяться, автоматическое монтирование можно настроить для доступа к любому из этих подкаталогов с помощью одной записи сопоставления.
**Пример**
*Домашние каталоги пользователей расположены на удалённом сервере. Монтирование домашнего каталога происходит при авторизации пользователя в системе.
При использовании подстановочных масок, нет необходимости заранее перечислять домашние каталоги пользователей.*
При таком способе настройки, конфигурация из предыдущего примера `/etc/auto.demo`, будет выглядеть так:
```bash
* -rw,sync 192.168.13.6:/shares/&
```
Теперь, если хотим смонтировать удалённую папку `192.168.13.6:/shares/dir1`, необходимо обратиться к ней по адресу `/demoshare/dir1`

29
autofs_dnas.md Normal file
View File

@ -0,0 +1,29 @@
### Монтирование сетевых папок с помощью NFS
```bash
sudo apt install autofs
```
**Настройка**
Для настройки autofs в файле `/etc/auto.master` необходимо добавить строку
```
/nfs /etc/auto.nfs --timeout=60
```
Здесь --timeout=60 указывает отмонтировать раздел при отсутствии активности на нём более чем 60 секунд.
Создаем в корне файловой системы папку `/nfs` :
```bash
sudo touch /etc/auto.nfs && sudo mkdir /nfs
````
В файле `/etc/auto.nfs` добавляем строку
```
disk1 -rw,soft,intr,rsize=8192,wsize=8192 192.168.13.8:/mnt/disk1
disk2 -rw,soft,intr,rsize=8192,wsize=8192 192.168.13.8:/mnt/disk2
disk3 -rw,soft,intr,rsize=8192,wsize=8192 192.168.13.8:/mnt/disk3
```
Перезапускаем службу autofs :
```bash
sudo service autofs restart
```

42
certbot.md Normal file
View File

@ -0,0 +1,42 @@
```bash
sudo certbot certonly --dry-run -d da2001.ru -d www.da2001.ru -d da2001.su -d www.da2001.su -d sync.da2001.ru -d webmin.da2001.ru -d cloud.da2001.ru -d qbt.da2001.ru -d photo.da2001.ru -d syno.da2001.ru -d plex.da2001.ru -d torrent.da2001.ru -d pve.da2001.ru -d office.da2001.ru -d webmail.da2001.ru -d ha.da2001.ru -d vault.da2001.ru -d git.da2001.ru -d remote.da2001.ru
```
```bash
sudo certbot certonly -d da2001.ru -d www.da2001.ru -d da2001.su -d www.da2001.su -d sync.da2001.ru -d webmin.da2001.ru -d cloud.da2001.ru -d qbt.da2001.ru -d photo.da2001.ru -d syno.da2001.ru -d plex.da2001.ru -d torrent.da2001.ru -d pve.da2001.ru -d office.da2001.ru -d webmail.da2001.ru -d ha.da2001.ru -d vault.da2001.ru -d git.da2001.ru -d remote.da2001.ru
```
Обновить существующие сертификаты
```bash
sudo certbot renew
````
Обновить определённые сертификаты
```bash
certbot renew --cert-name domain1.com --dry-run
````
Проверить полученные сертификаты
```bash
sudo certbot certificates
```
**Получение wildcard сертификата на все поддомены**
```bash
sudo certbot run -a manual -i nginx -d *.da2001.ru -d da2001.ru
```
Будет выведено сообщение с текстовой строкой - набором символов, например:
`byNIAO7n0rnx5DDZoc45QAYnbTMPB6PM975lU-4nOvo`.
У регистратора, например https://connect.yandex.ru/portal/services/webmaster/resources/da2001.ru
необходимо добавить новую DNS-запись:
Тип записи: `TXT`
Хост: `_acme-challenge`
Значение записи: `вставить набор симоволов, который выдал certbot`
**После добавления записи, обязательно нужно дождаться добавления записи в DNS, примерно 5 минут.
Затем нажать Enter в консоли.**
### !!! Для обновления wildcard сертификата необходимо менять запись _acme-challenge, т.е. заново перевыпускать сертификат в интерактивном (manual) режиме, в противном случае, автопродление завершится ошибкой. Поэтому, от wildcard сертификатов пока решил отказаться.

139
dnsmasq_sample_conf.conf Normal file
View File

@ -0,0 +1,139 @@
# Пример настройки конфигурационного файла сервера Dnsmasq
# основан на данных из
# https://mnorin.com/nastrojka-dnsmasq-dhcp-dns.html
# https://linux-admins.ru/article.php?id_article=62&article_title=%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0%20%D0%B8%20%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0%20Dnsmasq
# Конфигурационный файл расположен по адресу:
# /etc/dnsmasq.conf
# DHCP Настройки
# Указываем пользователя и группу с правами которых будет запущен демон
#user=nobody
#group=nobody
# Указываем интерфейсы на которых будут приниматься запросы
interface=eth0
#interface=eth1
# Или интерфейсы на которых не будут приниматься запросы
#except-interface="интерфейс"
# Или ip-адреса
#listen-address= "ip-адрес"
#Если вы хотите что бы интерфейс принимал только DNS запросы
#no-dhcp-interface= "интерфейс"
# Указываем диапозон адресов и время аренды
dhcp-range=192.168.5.101,192.168.5.254,24h
# Для статической привязки адресов указываем MAC-адрес хоста и
#адрес, который будем ему выдавать
#dhcp-host=11:22:33:44:55:66,192.168.0.51
# Если записей статической привязки будет много, удобнее выделить их в отдельный файл
# все файлы в директории /etc/dnsmasq.d/ будут считываться как дополнииельная конфигурация
# например, можно создать файл /etc/dnsmasq.d/static.hosts следующего содержания
#dhcp-host=11:22:33:44:56:77,mail-server,192.168.0.55
#dhcp-host=22:11:55:44:88:81,cloud,192.168.0.56
#и так далее
# или ip-адрес и имя хоста
#dhcp-host=11:22:33:44:56:77,mail-server,192.168.0.55,60m
# Можем выдать один ip-адрес одному из хостов кто первый успеет
#dhcp-host=12:21:33:43:88:11,22:11:55:44:88:81,192.168.0.59
# Указание опций DHCP
# option 1 - маска сети
dhcp-option=1,255.255.255.0
# option 3 - Шлюз по умолчанию
dhcp-option=3,192.168.5.1
# option 42 - NTP сервер
dhcp-option=42,192.168.5.1
# DNS сервер
dhcp-option=6,192.168.5.1
# Лимит на аренду ip-адреса в секундах (по-умолчанию 150)
dhcp-lease-max=3600
# Указание файла для хранения информации об аренде адресов
dhcp-leasefile=/var/lib/dnsmasq/dnsmasq.leases
# Указание, что DHCP сервер работает в режиме authritative
# Указываем что это единственный DHCP сервер.
dhcp-authoritative
####################################################################
# DNS Настройки
# Указание интерфейсов и ip-адрес мы рассмотрели в секции DHCP
# Указываем доменое имя
domain=da2001.ru
# можно указать отдельное доменое имя, для отдельной сети
#domain=wifi.test.un,192.168.100.0/24
#Или для определенного диапозона адресов
#domain=range.test.un,192.168.100.100,192.168.100.200
# Указание серверов для форвардинга запросов
server=8.8.8.8
server=8.8.4.4
# Указание адресов доменных серверов для перенаправления запроса к определенным зонам
#server=/office.un/192.168.50.10
# Аналогично можно указать для обратной зоны
#server=/50.168.192.in-addr.arpa/192.168.50.10
# По умолчанию dnsmasq использует файл /etc/hosts для сопоставления имен
# хостов IP-адресам, но это тоже можно изменить. Если вы не хотите
# использовать /etc/hosts, вы можете указать это при помощи опции
#no-hosts
# Если вы хотите использовать для этих целей другой файл
#addn-hosts= "путь к файлу"
# Записи зоны
# Запись типа А
address=/dns.da2001.ru/192.168.5.1
#address=/ldap.test.un/192.168.0.210
# Запись CNAME
#cname=mail-server,mail # алиасом для mail-server будет имя mail
# Запись типа SRV
#srv-host=_ldap._tcp.test.un,ldap.test.un,389
# Алиасы или подмена ip-адресов
# Кроме задания собственных записей DNS можно изменять информацию,
# получаемую от внешних DNS-серверов путем подмены полученного IP-адреса.
# Для замены одного адреса
#alias=10.10.1.1,172.20.1.1 # если при запросе от внешнего DNS сервера мы получили адрес
#10.10.1.1 то мы подменим его на 172.20.1.1
# Или можно заменять целую сеть
#alias=10.10.1.0,172.20.1.0,255,255,255,0
# Dnsmasq читает файл /etc/resolv.conf для определения перечня DNS серверов
# для форвардинга, если вы хотите поменять это и указать другой файл для этих целей
#resolv-file= "путь к файлу"
# Для того, чтобы обращения к DNS шли именно на dnsmasq на том же сервере, где он сам работает,
# необходимо указать первой записью в /etc/resolv.conf следующую строку:
#nameserver 127.0.0.1
# Сам dnsmasq будет игнорировать эту запись, поскольку предполагает, что эта запись обозначает его собственный сервис,
# он начинает использование записей с указанием серверов имен со следующей записи, в которой указывается уже внешний DNS-сервер.
# Во многих системах /etc/resolv.conf генерируется автоматически при получении адреса от провайдера по DHCP,
# оэтому если просто записать эту строчку руками, при переподключении основного сетевого интерфейса
# файл будет перезаписан и эта строка исчезнет.
# Этого можно избежать, если раскомментировать в файле /etc/dhcp/dhclient.conf
# (или /etc/dhcp3/dhclient.conf, в зависимости от системы) строчку
# prepend domain-name-servers 127.0.0.1;
# Тогда даже при получении списка DNS-серверов по DHCP первой строчкой в /etc/resolv.conf будет строчка «nameserver 127.0.0.1.

1486
docker.md Normal file

File diff suppressed because it is too large Load Diff

70
git.md Normal file
View File

@ -0,0 +1,70 @@
## git
#### 1. Отображение статуса репозитория в приглашении
Это дополнительный функционал, который не требуется для работы с Git, но очень помогает в этом. При работе с Git очень удобно, когда можно сразу определить, находитесь вы в обычном каталоге или в репозитории Git. Кроме того, было бы хорошо понимать статус текущего репозитория. Для этого нужно установить специальную утилиту, которая будет показывать статус репозитория. Для установки утилиты надо скопировать её репозиторий в домашний каталог пользователя, под которым вы работаете:
```
cd ~
git clone https://github.com/magicmonty/bash-git-prompt.git .bash-git-prompt --depth=1
```
А затем добавить в конец файла .bashrc такие строки:
```
GIT_PROMPT_ONLY_IN_REPO=1
source ~/.bash-git-prompt/gitprompt.sh
```
Для того, чтобы изменения применились, перезапустить bash:
```
exec bash
```
Теперь, если вы находитесь в обычном каталоге, приглашение выглядит стандартно, а если в каталоге, в котором инициализирован репозиторий git, это будет указано.
#### 2. Аутентификация на GitHub с помощью SSH-ключа
###### Генерация нового SSH-ключа (используйте e-mail, который привязан к GitHub):
```
ssh-keygen -t rsa -b 4096 -C "github_email@gmail.com"
```
На всех вопросах достаточно нажать Enter (более безопасно использовать ключ с passphrase, но можно и без, если нажать Enter при вопросе, тогда passphrase не будет запрашиваться у вас постоянно при операциях с репозиторием).
Запуск SSH-агента (пропускаем на Windows):
```
eval "$(ssh-agent -s)"
```
Добавить ключ в SSH-агент (пропускаем на Windows):
```
ssh-add ~/.ssh/id_rsa
```
###### Добавление SSH-ключа на GitHub
Для добавления ключа надо его скопировать.
Например, таким образом можно отобразить ключ для копирования:
```
cat ~/.ssh/id_rsa.pub
```
После копирования надо перейти на GitHub. Находясь на любой странице GitHub, в правом верхнем углу нажмите на картинку вашего профиля и в выпадающем списке выберите «Settings». В списке слева надо выбрать поле «SSH and GPG keys». После этого надо нажать «New SSH key» и в поле «Title» написать название ключа (например «Home»), а в поле «Key» вставить содержимое, которое было скопировано из файла ~/.ssh/id_rsa.pub
Чтобы проверить, всё ли прошло успешно, попробуйте выполнить команду:
```
ssh -T git@github.com
```
Вывод должен быть таким:
```
$ ssh -T git@github.com
Hi username! You've successfully authenticated, but GitHub does not provide shell access.
```
#### 3. Работа с удаленным репозиторием
Клонируем удаленный репозиторий в локальную папку
```
git clone ssh://git@github.com/pyneng/online-2-natasha-samoylenko.git
```
После внесения измений в локальные файлы проверяем состояние локального репозитория
```
git status
```
Необходимо добавить файлы в отслеживаемые
```
git add <имя файла>
```
Создадим коммит
```
git commit -m "описание изменений"
```
Синхронизируем локальный и удаленный репозитории
```
git push
```

13
hostname.md Normal file
View File

@ -0,0 +1,13 @@
**Изменить имя хоста linux**
**Change hostname linux**
Чтобы сделать изменения постоянными нужно изменить содержимое двух файлов: `/etc/hostname` и `/etc/hosts`
```
sudo nano /etc/hostname
```
```
sudo nano /etc/hosts
```
Изменения вступят в силу после перезагрузки

BIN
images/cups_web.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

BIN
images/greeting.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

15
ip_сайта.md Normal file
View File

@ -0,0 +1,15 @@
### Узнать IP адреса домена
```bash
host vk.com
```
ответ, что-то типа
```
vk.com has address 87.240.137.158
vk.com has address 87.240.139.194
vk.com has address 93.186.225.208
vk.com has address 87.240.190.78
vk.com has address 87.240.190.72
vk.com has address 87.240.190.67
vk.com mail is handled by 0 mx.vk.com.
vk.com mail is handled by 20 mx2.vk.com.
```

102
iperf.md Normal file
View File

@ -0,0 +1,102 @@
### iperf
**Совместимость iPerf и iPerf3**
Клиент и сервер совместимы, но нужно знать, что по умолчанию, рабочий порт для iPerf — 5001, для iPerf3 — 5201.
**Установка**
```bash
sudo apt install iperf
```
или
```bash
sudo apt install iperf3
```
Запускаем сервер:
```bash
iperf3 -s
```
На экране появится:
```
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------
```
Сервер ждет запросов.
**Все ключи запуска iPerf**
**Общие для сервера и клиента:**
Ключ Описание
`-p` _Определить порт, на котором будет слушать сервер или отправлять запросы клиент_
`-f` ормат отчетов — kmgKMG (Kbits, Mbits, KBytes, MBytes, ...)_
`-i` _Задать интервал, в течение которого выполняется одна проверка_
`-F` _Указать файл, из которого будут взяты входные данные для запуска_
`-A` _Степень нагрузки на процессор_
`-B` _Указать, через какой сетевой интерфейс работать_
`-V` етализированные сообщения в консоли_
`-J` _Вывод в формате json_
`--logfile` _Весь вывод в отдельный лог-файл_
`-d` _Режим отладки (много сообщений)_
`-v` оказать версию программы_
`-h` _Вызвать справку по работе с программой_
**Для сервера:**
Ключ Описание
`-s` _Запустить iPerf в режиме сервера_
`-D` _Запустить как демона (как службу)_
`-I` _Указать pid-файл_
`-1` ринять запрос от одного клиента и завершить работу_
**Для клиента:**
Ключ Описание
`-c` _Запустить iPerf в режиме клиента_
`-u` _Отправлять UDP-пакеты_
`-b` ормат отчетов для bandwidth (средней скорости)_
`-t` _Количество секунд, в течение которых будет идти проверка скорости_
`-n` _Объем данных для проверки (применяется вместо времени -t)_
`-k` _Количество пакетов для проверки (вместо -t или -n)_
`-l` _Размер буфера записи/чтения для TCP (по-умолчанию 128K), размер пакета для UDP (по-умолчанию 1470)_
`-P` _Число параллельных запросов_
`-R` _Обратный режим — сервер отправляет, клиент принимает_
`-w` _Размер сетевого окна_
`-C` _Установить алгоритм управления перегрузкой TCP_
`-M` _Задать максимальный размер MTU_
`-4` _Работать только для IPv4_
`-6` _Работать только для IPv6_
`-Z` спользовать метод «нулевой копии» для отправки данных_
`-O` _Опустить первые n секунд_
`-T` _Задать префикс для каждой строки вывода_
Также самый свежий список ключей можно получить командой:
```bash
man iperf3
```
**Примеры использования iPerf**
_Рассмотрим некоторые команды запросов к серверу для проверки скорости соединения._
Использование UDP
```bash
iperf3 -c 192.168.0.15 -u
```
* сам сервер не нужно запускать в UDP-режиме, так как он принимает любые запросы.
Альтернативные порты
_Для этого необходимо сначала запустить сервер на нужном порту:_
```bash
iperf3 -s -p 443
```
* кстати, можно запустить несколько процессов iperf одновременно, которые будут слушать на разных портах.
* стоит не забывать про настройки брандмауэра. В данном примере понадобиться ввести команды `firewall-cmd --permanent --add-port=443/tcp и firewall-cmd --reload`.
Теперь можно запускать клиента:
```bash
iperf3 -c 192.168.0.15 -p 443
```
Проверка скорости в течение 30 секунд с интервалами по 2 секунды
```bash
iperf3 -c 192.168.0.15 -t 30 -i 2
```
Несколько параллельных запросов
```bash
iperf3 -c 192.168.0.15 -P 3
```
Отправляем на проверку 3 Гб данных
```bash
iperf3 -c 192.168.0.15 -n 3G
```

396
linux_usefull.md Normal file
View File

@ -0,0 +1,396 @@
## Linux useful
###### top
[Текущая директория сервера в браузере по адресу `http://server_ip:8000/`](#tip001)
[Запустить графическое приложение через ssh соединение `-Y`](#tip002)
[Отобразить все группы пользователя](#tip003)
[SSH соединение через промежуточный хост](#tip004)
[SSH соединение без проверки подлинности ключа и его сохранения](#tip005)
[Изменить первичную группу пользователя в текщем сеансе](#tip006)
[Сохранить man в pdf](#tip007)
[Прервать выполнение команды через 5 секунд](#tip008)
[Инфо об ОС](#tip009)
[Выполнить команду несколько раз в цикле](#tip010)
[Конвертировать изоражения heic в jpg](#tip011)
[Конвертировать jpg в pdf](#tip012)
[получить UUID диска для монтирования](#tip013)
[Сброс пароля root](#tip014)
[Проверить доступность диапазона хостов](#tip015)
[Конвертировать pdf в png](#tip016)
[Узнать загрузку процессора определённым процессом](#tip017)
***
###### tip001
:large_blue_circle: **Текущая директория сервера в браузере по адресу `http://server_ip:8000/`**
```bash
python -m SimpleHTTPServer
```
[вверх](#top)
***
###### tip002
:large_blue_circle: **Запустить графическое приложение через ssh соединение `-Y`**
*для текущей сессии*
```bash
ssh -Y pi@server_ip
```
*для всех подключений*
`ForwardX11 yes` в файле `/etc/ssh/ssh_config`
[вверх](#top)
***
###### tip003
:large_blue_circle: **Отобразить все группы пользователя**
```bash
da2001@Metromint:~$ groups da2001
da2001 : da2001 adm cdrom sudo dip plugdev kvm lpadmin sambashare wireshark libvirt
```
[вверх](#top)
***
###### tip004
:large_blue_circle: **SSH соединение через промежуточный хост**
```bash
ssh -t pi@192.168.89.2 ssh da2001@192.168.1.8
```
*сначала будет запрошен пароль от 192.168.89.2, затем от 192.168.1.8*
[вверх](#top)
***
###### tip005
:large_blue_circle: **SSH соединение без проверки подлинности ключа и его сохранения**
```bash
ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no admin@192.168.2.1
```
[вверх](#top)
***
###### tip006
:large_blue_circle: **Изменить первичную группу пользователя в текщем сеансе**
```bash
[lisa@server1 ~]$ groups
lisa account sales
[lisa@server1 ~]$ newgrp sales
[lisa@server1 ~]$ groups
sales lisa account
[lisa@server1 ~]$ touch file1
[lisa@server1 ~]$ ls -l
total 0
-rw-r--r--. 1 lisa sales 0 Feb 6 10:06 file1
```
*теперь все новые файлы будут принадлежать группе sales*
[вверх](#top)
***
###### tip007
:large_blue_circle: **Сохранить man в pdf**
```bash
man -t <программа> | ps2pdf - <filename>.pdf
```
```bash
man -t tar | ps2pdf - tar_man.pdf
```
[вверх](#top)
***
###### tip008
:large_blue_circle: **Прервать выполнение команды через 5 секунд**
```bash
timeout 5s command
```
[вверх](#top)
***
###### tip009
:large_blue_circle: **Инфо об ОС**
```bash
cat /etc/*release
```
```bash
cat /etc/issue
```
```bash
uname -a
```
```bash
cat /etc/lsb-release
```
```bash
da2001@Metromint:~$ neofetch
...-:::::-... da2001@Metromint
.-MMMMMMMMMMMMMMM-. ----------------
.-MMMM`..-:::::::-..`MMMM-. OS: Linux Mint 20.1 x86_64
.:MMMM.:MMMMMMMMMMMMMMM:.MMMM:. Host: VivoBook_ASUSLaptop X570DD_M570DD 1.0
-MMM-M---MMMMMMMMMMMMMMMMMMM.MMM- Kernel: 5.8.0-59-generic
`:MMM:MM` :MMMM:....::-...-MMMM:MMM:` Uptime: 1 day, 1 hour, 41 mins
:MMM:MMM` :MM:` `` `` `:MMM:MMM: Packages: 2750 (dpkg)
.MMM.MMMM` :MM. -MM. .MM- `MMMM.MMM. Shell: bash 5.0.17
:MMM:MMMM` :MM. -MM- .MM: `MMMM-MMM: Resolution: 1920x1080
:MMM:MMMM` :MM. -MM- .MM: `MMMM:MMM: DE: Cinnamon
:MMM:MMMM` :MM. -MM- .MM: `MMMM-MMM: WM: Mutter (Muffin)
.MMM.MMMM` :MM:--:MM:--:MM: `MMMM.MMM. WM Theme: Mint-Y-Dark (Mint-Y-Dark)
:MMM:MMM- `-MMMMMMMMMMMM-` -MMM-MMM: Theme: Mint-Y-Darker [GTK2/3]
:MMM:MMM:` `:MMM:MMM: Icons: Papirus-Dark [GTK2/3]
.MMM.MMMM:--------------:MMMM.MMM. Terminal: gnome-terminal
'-MMMM.-MMMMMMMMMMMMMMM-.MMMM-' CPU: AMD Ryzen 5 3500U with Radeon Vega Mobile Gfx (8) @ 2.100GHz
'.-MMMM``--:::::--``MMMM-.' GPU: NVIDIA GeForce GTX 1050 Mobile
'-MMMMMMMMMMMMM-' GPU: AMD ATI 05:00.0 Picasso
``-:::::-`` Memory: 4924MiB / 5952MiB
```
[вверх](#top)
***
###### tip010
:large_blue_circle: **Выполнить команду несколько раз в цикле**
```bash
da2001@Metromint:~$ for i in {1..5}; do echo $i; done
1
2
3
4
5
```
*выполнение скрипта с параметрами в цикле*
```bash
for i in {1..20}; do ./wlt_start.py -c config_m716.cfg; done
```
[вверх](#top)
***
###### tip011
:large_blue_circle: **Конвертировать изоражения heic в jpg**
```bash
sudo apt-get install libheif-examples
```
*для конвертации одного изображения*
```bash
heif-convert IMG_1234.HEIC IMG_1234.jpg
```
*для конвертации всех изображений в папке*
```bash
mkdir jpg
for file in *.heic; do heif-convert $file ./jpg/${file/%.heic/.jpg}; done
```
[вверх](#top)
***
###### tip012
:large_blue_circle: **Конвертировать jpg в pdf**
*необходим установленный ImageMagick*
```bash
sudo apt install imagemagick
```
*для конвертации одного изображения*
```bash
convert image.jpg out.pdf
```
*для конвертации нескольких изображений*
```bash
convert image1.jpg image2.jpg image3.jpg out.pdf
```
***если в процессе конвертации будет получено сообщение об ошибке***
```bash
convert: attempt to perform an operation not allowed by the security policy `PDF' @ error/constitute.c/IsCoderAuthorized/408.
```
в файле `/etc/ImageMagick-7/policy.xml` необходимо изменить директиву доступа
*название папки ImageMagick-7 может отличаться в зависимости от установленной версии*
между тегами `<policymap>` и `</policymap>`
добавить/отредактировать
```bash
<policy domain="coder" rights="read | write" pattern="PDF" />
```
[вверх](#top)
***
###### tip013
:large_blue_circle: **получить UUID диска для монтирования**
**Вариант 1**
```bash
lsblk -n -o uuid /dev/sda1
```
-n - не выводить заголовки
-o - отображаемое поле
*таким образом, для раздела с ФС ext4, запись в fstab можно добавить таким образом*
```bash
mkdir /mntdir
UUID=`lsblk -n -o uuid /dev/sda1`
sudo bash -c 'echo "UUID=$UUID /mntdir ext4 defaults 0 0" >> /etc/fstab'
```
**Вариант 2**
```bash
[root@server1 ~]# blkid -o export /dev/sda2 | grep '^UUID'
UUID=d056212f-b1ea-4bc5-ba4e-99d036e5531e
```
*таким образом, можно перенаправить вывод в `/etc/fstab` и руками дополнить параметры монтирования*
```bash
blkid -o export /dev/sda2 | grep '^UUID' >> /etc/fstab
```
[вверх](#top)
***
###### tip014
:large_blue_circle: **Сброс пароля root**
**CentOS/RedHat Linux**
1. В самом начале загрузки системы, когда появляется меню GRUB, необходимо нажать `e`, чтобы попасть в настройку загрузки
2. В строке загрузки ядра, которая начинается со слова `linux` в конец добавить `rd.break`, затем нажать Ctrl+x, для применения сделанных настроек и загрузки системы (внесенные изменения действуют только в текущей сессии загрузки)
3. После появления приглашения консоли необходимо получить доступ к образу системы
```bash
mount -o remount,rw /sysroot
```
4. Изменить корневой каталог
```bash
chroot /sysroot
```
5. Теперь можно изменить пароль root
```bash
passwd
```
будет предложено ввести новый пароль дважды.
6. Поскольку на ранней стадии загрузки SELinux еще не был активирован, тип контекста в `/etc/shadow` будет перепутан. Если сейчас перезагрузиться, никто не сможет войти в систему. Поэтому необходимо убедиться, что тип контекста установлен правильно. Для этого на этом этапе нужно загрузить политику SELinux с помощью команды
```bash
load_policy -i
```
7. Теперь нужно вручную установить правильный тип контекста в `/etc/shadow`.
```bash
chcon -t shadow_t /etc/shadow
```
**вместо 6,7 пунктов можно просто в корне создать файл `.autorelabel`**
```bash
touch /.autorelabel
```
8. Всё, после перезагрузки, у root будет новый пароль.
*для перезагрузки в данном режиме необходимо дважды ввести `reboot -f` или Ctrl+d*
```bash
reboot -f
```
**Debian**
1. В самом начале загрузки системы, когда появляется меню GRUB, необходимо нажать `e`, чтобы попасть в настройку загрузки
2. В строке загрузки ядра, которая начинается со слова `linux` в конец добавить `rd.break`, затем нажать Ctrl+x, для применения сделанных настроек и загрузки системы (внесенные изменения действуют только в текущей сессии загрузки)
3. После появления приглашения консоли необходимо получить доступ к образу системы
```bash
mount -o remount,rw /
```
4. Теперь можно изменить пароль root
```bash
passwd
```
будет предложено ввести новый пароль дважды.
5. Всё, после перезагрузки, у root будет новый пароль.
*для перезагрузки в данном режиме необходимо дважды ввести `reboot -f` или Ctrl+d*
```bash
reboot -f
```
[вверх](#top)
***
###### tip015
:large_blue_circle: **Проверить доступность диапазона хостов**
```bash
for i in {10..13}; do ping -c 2 192.168.1.$i > /dev/null && echo 192.168.1.$i - доступен || echo 192.168.1.$i - НЕ доступен; done
```
```bash
[da2001@co1 ~]$ for i in {10..13}; do ping -c 2 192.168.1.$i > /dev/null && echo 192.168.1.$i - доступен || echo 192.168.1.$i - НЕ доступен; done
192.168.1.10 - доступен
192.168.1.11 - доступен
192.168.1.12 - доступен
192.168.1.13 - НЕ доступен
```
[вверх](#top)
***
###### tip016
:large_blue_circle: **Конвертировать pdf в png**
```bash
pdftoppm input.pdf outputname -png
```
*в результате каждая страница в PDF будет сохранена в формате outputname-01.png, где 01 будет номером страницы*
**Конвертировать одну страницу или диапазон**
```bash
pdftoppm input.pdf outputname -png -f {page} -singlefile
```
*Измените `{page}` на номер страницы. Он проиндексирован как 1, поэтому `-f 1` будет первой страницей.*
*Если вы хотите работать с диапазоном страниц, вы также можете указать номер для флага `-l` (последняя страница), поэтому при использовании `-f 1 -l 30` будут указаны страницы от 1 до 30.*
**Указать разрешение преобразованного изображения**
*Разрешение по умолчанию для этой команды составляет 150 точек на дюйм.*
*Чтобы увеличить разрешение преобразованного PDF-файла, добавьте параметры `-rx` {разрешение} и `-ry` {разрешение}.*
```bash
pdftoppm input.pdf outputname -png -rx 300 -ry 300
```
[вверх](#top)
***
###### tip017
:large_blue_circle: **Узнать загрузку процессора определённым процессом**
**ps**
*по имени процесса*
```bash
ps -C iperf -o %cpu=
```
*по номеру процесса*
```bash
ps -p 23635 -o %cpu=
```
или
```bash
ps -p $(pgrep iperf) -o %cpu=
```
**top**
```bash
top -b -n 2 -d 0.2 -p PID_ID | tail -1 | awk '{print $9}'
```
**Нагрузить процессор для проверки**
```bash
cat /dev/zero > /dev/null
```
[вверх](#top)

82
luks.md Normal file
View File

@ -0,0 +1,82 @@
#### LUKS
LUKS является стандартом для шифрования жесткого диска Linux. Расшифровать данные на диске можно только имея доступ к секретному ключу и паролю.
1. Создать зашифрованный раздел
```bash
[da2001@co1 ~]$ sudo cryptsetup luks
luksAddKey luksDelKey luksFormat luksHeaderRestore luksOpen luksResume luksUUID
luksClose luksDump luksHeaderBackup luksKillSlot luksRemoveKey luksSuspend
```
*двойной Tab покажет возможные команды. Для создания нового раздела необходима команда `luksFormat`*
```bash
[da2001@co1 ~]$ sudo cryptsetup luksFormat /dev/sdc2
WARNING: Device /dev/sdb2 already contains a 'crypto_LUKS' superblock signature.
WARNING!
========
This will overwrite data on /dev/sdc2 irrevocably.
Are you sure? (Type 'yes' in capital letters): YES
Enter passphrase for /dev/sdb2:
Verify passphrase:
```
*подтвердить заглавными YES*
*задать пароль доступа, при этом простой пароль система может не принять, в этом случае будет выведено сообщение*
```bash
Password quality check failed:
The password fails the dictionary check - it is based on a dictionary word
```
2. Открыть раздел и задать ему имя, по которому раздел будет доступен в `/dev/mapper`
```bash
[da2001@co1 ~]$ sudo cryptsetup luksOpen /dev/sdc2 secret
```
*ввести пароль доступа*
```bash
[da2001@co1 ~]$ ls -l /dev/mapper/ | grep secret
lrwxrwxrwx. 1 root root 7 Sep 10 14:41 secret -> ../dm-3
```
3. Отформатировать раздел
*форматировать необходимо в разблокированном состоянии*
```bash
[da2001@co1 ~]$ sudo mkfs.xfs /dev/mapper/secret
meta-data=/dev/mapper/secret isize=512 agcount=4, agsize=64448 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1
data = bsize=4096 blocks=257792, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=1566, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
```
4. Монтирование зашифрованного раздела
```bash
[da2001@co1 ~]$ sudo mkdir /secret
[da2001@co1 ~]$ sudo vi /etc/fstab
```
*добавить строку*
```bash
/dev/mapper/secret /secret xfs defaults 0 0
```
**добавление записи в fstab недостаточно, т.к. для монтирования устройство должно быть доступно**
*необходимо добавить конфиг в `/etc/crypttab`*
```bash
[da2001@co1 ~]$ sudo vi /etc/crypttab
```
*в файле необходимо указать:*
- название устройства, в нашем случае `secret`
- блочное устройство, на котором размещён зашифрованный раздел - `/dev/sdb2`
- параметр - нужно ли вводить пароль автоматически, `none` - не вводить пароль автоматически, требовать ввода от пользователя
*синтаксис конфиг. файла можно узнать в справке `man crypttab`*
```bash
secret /dev/sdc2 none
```
5. Для вступления изменений в силу, необходимо перезагрузить хост
```bash
[da2001@co1 ~]$ sudo reboot
```

42
mikrotik.md Normal file
View File

@ -0,0 +1,42 @@
### Mikrotik
1. Обновление ПО
скачать прошивку для своего устройства https://mikrotik.com/download
в web-интерфейсе в разделе **Files** загрузить ранее скачанную прошивку
в разделе **System** выбрать пункт **Reboot**
после перезагрузки устройство будет с новой прошивкой
2. Обновление загрузчика
после обновления ПО загрузчик не обновляется автоматически, для его обновления необходимо:
в web-интерфейсе в разделе **System** выбрать пункт **RouterBOARD**, нажать кнопку **Upgrade**
в разделе **System** выбрать пункт **Reboot**
после перезагрузки устройство будет с новой прошивкой
_чтобы в будущем, при обновлении ПО загрузчик обновлялся автоматически, необходимо:_
в web-интерфейсе в разделе **System** выбрать пункт **RouterBOARD**, нажать кнопку **Settings**
отметить пункт **Auto Upgrade**, сохранить изменения
3. Сохранение конфигурации
Для создания конфигурации коммутатора лучше использовать способ сохранения настроек в бинарный файл, потому что такой способ, в отличии от использования команды export (при восстановлении старые и новые настройки объединяются), перед восстановлением стирает старые настройки, заменяя их новыми.
Подключаемся к коммутатору по ssh
```
ssh admin@192.168.88.1
```
без пароля
Создание бинарного файла конфигурации
```
/system backup save name=flash/[имя-файла]
```
**_!файл настроек необходимо сохранять в папку /flash, т.к. она расположена на другом диске и ее содержимое не очистится при восстановлении конфигурационного файла_**
1.4. Восстановление ранее сохраненного файла конфигурации
```
/system backup load name=flash/[имя-файла]
```
будет запрошен пароль, оставляем поле пустым, нажимаем Enter
соглашаемся с применением конфигурации
```
y
```
коммутатор применит настройки и перезагрузится

114
minicom.md Normal file
View File

@ -0,0 +1,114 @@
#### minicom
Для доступа к меню конфигурации
```bash
sudo minicom -s
```
```bash
+-----------[конфигурация]-----------+
| Каталоги и файлы |
| Протоколы |
| Настройка последовательного порта |
| Модем и дозвон |
| Экран и клавиатура |
| Сохранить настройки как dfl |
| Сохранить настройки как... |
| Выход |
| Выход из Minicom |
+------------------------------------+
```
*при использовании нуль-модемного кабеля, адресом последовательного порта в linux будет
COM1 - /dev/ttyS0
COM2 - /dev/ttyS1
и т.д. В случаях, когда используется адаптер USB-to-COM, в качестве порта ввода-вывода будет использоваться
/dev/ttyUSB0 или /dev/ttyUSB1.*
После физического подключения, увидеть используемый порт
```bash
dmesg | grep tty
```
Выбираем пункт "Настройка последовательного порта".
```bash
+-----------------------------------------------------------------------+
| A - Последовательный порт : /dev/ttyUSB0 |
| B - Размещение lock-файла : /var/lock |
| C - Программа при выходе : |
| D - Программа при запуске : |
| E - Скорость/Чётность/Биты : 115200 8N1 |
| F - Аппаратное управление потоком : Нет |
| G - Программное управление потоком : Нет |
| |
| Какую настройку изменить? |
+-----------------------------------------------------------------------+
```
После внесения необходимых изменений сохраняем настройки, выбрав пункт "Сохранить настройки как dfl". Это изменит настройки запуска программы, используемые по умолчанию.
```bash
+---------------------------+
| |
+-----------[конфигурация]--------| Конфигурация сохранена |
| Каталоги и файлы | |
| Протоколы +---------------------------+
| Настройка последовательного порта |
| Модем и дозвон |
| Экран и клавиатура |
| Сохранить настройки как dfl |
| Сохранить настройки как... |
| Выход |
| Выход из Minicom |
+------------------------------------+
```
Если выбрать пункт "Сохранить настройки как.." и указать имя файла настроек, например "cisco", то это не изменит настройки по умолчанию и в дальнейшем можно будет запускать программу с конкретными параметрами, указав имя файла с настройками. Настройки сохраняются в файлах `minirc.DEVICE_NAME` в папке `/etc/minicom/`
```bash
minicom cisco
```
В завершении настройки переходим к пункту "Выход" и если все настроено правильно, то будет установлен сеанс подключения по последовательному порту.
**Запуск minicom с аргументами**
Minicom можно запускать без выполнения настроек в оконном режиме. Для этого достаточно выполнить запуск программы с заданными аргументами.
Для подключения к устройству с помощью адаптера USB-to-COM со скоростью 38400:
```bash
minicom -D /dev/ttyUSB0 -b 38400
```
Для подключения к устройству с использованием нуль-модемного кабеля:
```bash
minicom -D /dev/ttyS0 -b 38400
```
***
#### Передача файлов
После запуска программы увидим окно с подсказкой
```bash
Добро пожаловать в minicom 2.7.1
ПАРАМЕТРЫ: I18n
Дата компиляции Dec 23 2019, 02:06:26.
Port /dev/ttyUSB0, 12:20:47
Нажмите CTRL-A Z для получения подсказки по клавишам
```
1. Необходимо определить директорию из которой будут загружаться файлы
`Ctrl+A o`
`Каталоги и файлы`
`B - Каталог для отправки` - указать полный путь к папке, в которой будут лежать файлы для отправки
*если не указывать папку, будет предложено выбрать файл из домашней директории пользователя, при этом, перемещаться по каталогам возможности нет*
2. Отправка файла
`Ctrl+A z`
`s` - для отправки файла
В следующем окне укажем `xmodem` и пробелом выберем файл который необходимо передать, нажав «Enter» запустим процесс передачи.
*файл будет загружаться со скоростью, которая указана в настройках при подключении в Кб/с, как в dial-up модемах из детства :)*

14
nano.md Normal file
View File

@ -0,0 +1,14 @@
### nano
**показать/скрыть номера строк**
в латинской раскладке **Alt + Shift + 3**
**номера строк отображаются по умолчанию**
в домашней папке пользователя создать/отредактировать файл **.nanorc**, добавить
```
set linenumbers
```
**переход к определенной строке**
Alt + G
_работает не во всех эмуляторах терминала (Gnome connection manager)_

1
plug-ins_Plex.txt Normal file
View File

@ -0,0 +1 @@
/var/lib/plexmediaserver/Library/Application Support/Plex Media Server/Plug-ins

107
python/python_notes.md Normal file
View File

@ -0,0 +1,107 @@
###### top
## Python. Заметки на полях
[Официальная документация](https://docs.python.org/3/)
***
[Базовые понятия](#part1)
- [List comprehension](#chapter1)
- [lambda](#chapter2)
- [Ad-hoc команды](#chapter3)
[Ansible playbook](#part2)
- [Простой playbook](#chapter4)
- [Переменные](#chapter5)
- [Отладка](#chapter6)
- [Блоки и обработка ошибок](#chapter7)
- [Асинхронные задачи](#chapter8)
- [](#chapter9)
- [](#chapter10)
- [](#chapter11)
- [](#chapter12)
***
###### part1
## Базовые понятия
[вверх](#top)
Интрерпретируемый язык
###### Chapter1
### List comprehension
Представление списков, списковые включения
https://docs.python.org/3/tutorial/datastructures.html#list-comprehensions
```python
list_square = [x ** 2 for x in range(5)]
print(list_square)
[0, 1, 4, 9, 16]
```
```python
vlans = [f'vlan {num}' for num in range(10, 16)]
print(vlans)
['vlan 10', 'vlan 11', 'vlan 12', 'vlan 13', 'vlan 14', 'vlan 15']
```
```python
prices = [98, 123, 13, 45, 67, 43, 87]
less = [x for x in prices if x < 100]
print(less)
[98, 13, 45, 67, 43, 87]
```
```python
vlans = [100, 110, 150, 200]
names = ['mngmt', 'voice', 'video', 'dmz']
result = ['vlan {}\n name {}'.format(vlan, name) for vlan, name in zip(vlans, names)]
print(result)
['vlan 100\n name mngmt', 'vlan 110\n name voice', 'vlan 150\n name video', 'vlan 200\n name dmz']
```
```python
users = [{'name': 'Иван', 'age': 29},
{'name': 'Андрей', 'age': 31},
{'name': 'Настя', 'age': 22},
{'name': 'Артём', 'age': 40}]
users_list = [user['name'] for user in users if user['age'] > 30]
print(users_list)
['Андрей', 'Артём']
```
```python
vlans = [[10, 21, 35], [101, 115, 150], [111, 40, 50]]
result = [vlan for vlan_list in vlans for vlan in vlan_list]
print(result)
[10, 21, 35, 101, 115, 150, 111, 40, 50]
```
[вверх](#top)
***
### lambda
```python
list_square = [x ** 2 for x in range(5)]
print(list_square)
[0, 1, 4, 9, 16]
```
[вверх](#top)
***

106
rpi_VLAN.md Normal file
View File

@ -0,0 +1,106 @@
#### Настройка подынтерфейсов (VLAN) Raspberry Pi
1. Установить необходимый пакет
```bash
sudo apt install vlan
```
2. Создать виртуальный интерфейс
```bash
sudo vi /etc/network/interfaces.d/vlans
```
*пример содержимого файла*
```bash
auto eth0.10
iface eth0.10 inet manual
vlan-raw-device eth0
```
3. Настройка IP адреса на виртуальном интерфейсе
```bash
sudo vi /etc/dhcpcd.conf
```
*пример настройки*
```bash
# Example static IP configuration:
interface eth0
static ip_address=10.0.20.125/24
static routers=10.0.20.1
static domain_name_servers=1.1.1.1
interface eth0.10
static ip_address=10.0.10.125/24
#static routers=10.0.10.1
#static domain_name_servers=1.1.1.1
```
***static routers (он же шлюз по-умолчанию) может быть только один, поэтому его необходимо использовать где-то в одном месте (или на основном интерфейсе или на интерфейсе VLAN, в зависимости от настроек сети. DNS (static domain_name_servers) также достаточно настроить на одном интерфейсе, на котором этот DNS будет доступен.***
4. Применение изменений
```bash
sudo systemctl restart networking
```
5. Убедиться, что настройки применились можно с помощью `hostname`
```bash
hostname -I
```
или
```bash
ip a
```
***
*По умолчанию в Raspberry для настроек сети используется dhcpcd ~~(не смог разобраться как в нем настраивать подынтерфейсы)~~ **- разобрался, описано выше***
**Альтернативный вариант настройки с использованием пакета networking.**
*Необходимо отключить dhcpcd и включить networking*
```bash
sudo systemctl disable dhcpcd
sudo systemctl enable networking
```
редактируем файл настроек сети
```bash
sudo nano /etc/network/interfaces
```
добавим в него строки:
```
# management ip
auto eth0
iface eth0 inet static
address 192.168.5.1
netmask 255.255.255.0
# first ntp server
auto eth0.10
iface eth0.10 inet static
address 192.168.10.1
netmask 255.255.255.0
# second ntp server
auto eth0.20
iface eth0.20 inet static
address 192.168.20.1
netmask 255.255.255.0
# wlan
auto wlan0
iface wlan0 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
```
сохраняем изменения _ctrl+o_, закрываем редактор _ctrl+x_
для проверки правильности внесенных настроек перезагрузим сеть
```bash
sudo service networking restart
```
если в консоли не появилось сообщений с ошибками, значит всё настроено правильно
увидеть настроенные интерфейсы и ip адреса командой
```bash
ip addr
```
#### Временный подынтерфейс в Linux
```
ip link add link eth0 name eth0.103 type vlan id 103
ip link set up dev eth0.103
ip address add 192.168.130.34/28 dev eth0.103
```

191
rpi_printserver.md Normal file
View File

@ -0,0 +1,191 @@
# Принт-сервер и сетевой сканер на Raspberry PI
_МФУ Samsung SCX3405W_
## Печать
Подразделени Samsung, которое занималось производством принтером было куплено компанией HP, поэтому справедливо установить драйвера HP и свободные драйвера
```bash
sudo apt-get update
sudo apt-get install hplip printer-driver-splix -y
```
Установить службу печати линукс CUPS
```bash
sudo apt-get install cups -y
```
Необходимо добавить пользователя в группу lpadmin
```bash
sudo usermod -a -G lpadmin da2001
sudo reboot
```
Следующим этапом необходимо отредактировать конфигурационный файл службы печати
```bash
vim /etc/cups/cupsd.conf
```
строку `Listen localhost:631` необходимо изменить на `Port 631`
добваить две строки
```
BrowseRemoteProtocols CUPS dnssd
BrowseAddress @LOCAL
```
Внести изменения в секцию Location, привести к виду:
```
<Location />
Order allow,deny
Allow all
</Location>
```
В секции Location /admin закомментировать строку `Order allow,deny`
```
<Location /admin>
</Location>
```
Перезапустить службу печати
```bash
sudo systemctl restart cups
```
Если всё настроено верно, должен отобразиться web-интрефейс https://print-server-ip:631
![web](images/cups_web.png)
На вкладке Администрирование необходимо добавить новый принтер.
В случае с Samsung SCX3405W, его нет в списке, но есть Samsung SCX3200 - он также подойдёт.
С настройкой принтера закончено, теперь он должен быть доступен в локальной сети.
## Сканирование
Необходимо установить пакет sane
```bash
sudo apt install sane -y
```
Далее необходимо убедиться, что сканер опознан в системе
```bash
sudo sane-find-scanner
```
_пример вывода_
```bash
da2001@printserver:~ $ sudo sane-find-scanner
# sane-find-scanner will now attempt to detect your scanner. If the
# result is different from what you expected, first make sure your
# scanner is powered up and properly connected to your computer.
# No SCSI scanners found. If you expected something different, make sure that
# you have loaded a kernel SCSI driver for your SCSI adapter.
# Also you need support for SCSI Generic (sg) in your operating system.
# If using Linux, try "modprobe sg".
found USB scanner (vendor=0x04e8 [Samsung Electronics Co., Ltd.], product=0x344f [SCX-3400 Series]) at libusb:001:004
found USB scanner (vendor=0x0424, product=0xec00) at libusb:001:003
# Your USB scanner was (probably) detected. It may or may not be supported by
# SANE. Try scanimage -L and read the backend's manpage.
# Not checking for parallel port scanners.
# Most Scanners connected to the parallel port or other proprietary ports
# can't be detected by this program.
```
Можно попробовать выполнить Сканирование
```bash
sudo scanimage -L
```
пример вывода:
```bash
Created directory: /var/lib/snmp/cert_indexes
device 'xerox_mfp:libusb:001:004' is a Samsung Samsung SCX-3400 Series multi-function peripheral
```
свидетельствует о готовности сканера
Непосредственно само сканирование
```bash
scanimage > ~/test-scan-file.pnm
```
Получить информацию о созданном файле
```bash
file test-scan-file.pnm
```
### Сетевое сканирование
Изменить конфигурацию для включения демона saned
```bash
sudo vim /etc/default/saned
```
добавить строку `RUN=yes`
В основном конфигурациооном файле `/etc/sane.d/saned.conf` необходимо указать сеть доступности сканирования
```
192.168.13.0/24
```
кроме этого необходимо раскомментировать строку
```
data_portrange = 10000 - 10100
```
Также необходимо изменить разрешения, чтобы демон saned мог запускаться не от рута. В части вывода `sane-find-scanner` было показано
```
found USB scanner (vendor=0x04e8 [Samsung Electronics Co., Ltd.], product=0x344f [SCX-3400 Series]) at libusb:001:004
```
`libusb:001:004` сообщает, что сканер находится по адресу /dev/bus/usb/001/004
Проверим права этого файла
```bash
da2001@printserver:~ $ ls -l /dev/bus/usb/001
итого 0
crw-rw-r-- 1 root root 189, 0 мая 6 19:37 001
crw-rw-r-- 1 root root 189, 1 мая 6 18:09 002
crw-rw-r-- 1 root root 189, 2 мая 6 18:09 003
crw-rw-r--+ 1 root lp 189, 3 мая 6 19:39 004
```
как видно из вывода, файлом владеет root с группой lp (linux print). Нам нужно добавить демона sane в группу lp, чтобы дать ему необходимые разрешения:
```bash
sudo adduser saned lp
```
В конце необходимо запустить saned
```bash
sudo systemctl enable --now saned.socket
```

4
rpi_serial_num.md Normal file
View File

@ -0,0 +1,4 @@
**Вывести серийный номер Raspberry в консоль**
```
cat /proc/cpuinfo | grep Serial | cut -d' ' -f2
```

52
rpi_static_route.md Normal file
View File

@ -0,0 +1,52 @@
### Статический маршрут на Raspberry Pi
**синтаксис ip ro**
```bash
ip route add <IP/Net> via <Gateway IP>
```
Все параметры можно посмотреть `ip route help`
Пример:
```bash
ip ro add 192.168.2.0/24 via 192.168.0.1
ip ro add 192.168.3.159/32 via 192.168.0.1
```
*в команде ip можно использовать сокращенный синтаксис ip ro … в место ip route …*
Для удаления статического маршрута используйте **del** вместо **add**
Добавить маршрут по умолчанию
```bash
ip route add default via 10.7.0.1 dev enp1s0
```
маршрут через `10.7.0.1` (допустим наш роутер) через интерфейс с именем `enp1s0`
***
**Постоянный статический маршрут**
```bash
pi@raspberrypi:~ $ uname -a
Linux raspberrypi 4.19.57-v7+ #1244 SMP Thu Jul 4 18:45:25 BST 2019 armv7l GNU/Linux
pi@raspberrypi:~ $ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description: Raspbian GNU/Linux 10 (buster)
Release: 10
Codename: buster
```
*чтобы маршрут сохранился после перезагрузки, его необходимо добавить в папку `/lib/dhcpcd/dhcpcd-hooks/`*
*по-умолчанию, в этой папке уже есть несколько конфигурационных файлов, можно воспользоваться ими или создать свой*
```bash
pi@raspberrypi:~ $ cat /lib/dhcpcd/dhcpcd-hooks/
01-test 02-dump 10-wpa_supplicant 20-resolv.conf 30-hostname 50-ntp.conf 90-static-routes.conf
```
Как видно из названия, статические маршруты описываются в этом файле `90-static-routes.conf`
*по-умолчанию, файл пустой*
Добавим маршрут
```bash
pi@raspberrypi:~ $ cat /lib/dhcpcd/dhcpcd-hooks/90-static-routes.conf
# route to inband management test nets
ip route add 10.254.0.0/16 via 192.168.90.100
```

13
rpi_wifi_disable.md Normal file
View File

@ -0,0 +1,13 @@
Чтобы полностью отключить встроенный WiFi на Pi3 / Pi4, необходимо добавить строку
`dtoverlay=disable-wifi`
в файл `/boot/config.txt`.
Например, чтобы отключить Wi-Fi и Bluetooth, необходимо добавить две строки:
```bash
dtoverlay=disable-wifi
dtoverlay=disable-bt
```
Замечение: если используется Pi3 и старая версия ПО, необходимо добавить префикс pi3- `dtoverlay=pi3-disable-wifi`

View File

@ -0,0 +1,97 @@
#### Сетевой мост (Bridge)
*объединение в бридж встроенного сетевого интерфейса Ethernet и USB сетевой карты*
1. Установить пакет `bridge-utils`
```bash
sudo apt-get install bridge-utils
```
2. Создать бридж `br0` и задать ему IP адрес
*после подключения USB сетевой карты, в Raspberry имеются следующие сетевые интерфейсы:
`eth0` - встроенный интерфейс Ethernet
`eth1` - интерфейс USB сетевой карты
`wlan0` - беспроводной интерфейс*
*объединим в бридж проводные интерфейсы `eth0` `eth1`*
```bash
sudo nano /etc/network/interfaces
```
для получения адреса от DHCP сервера:
```
# Настройка интерфейсов вручную, чтобы избежать конфликтов, например с network manager
iface eth0 inet manual
iface eth1 inet manual
auto br0
iface br0 inet dhcp
bridge_ports eth0 eth1
```
для ручной настройки IP адреса:
```
# Настройка интерфейсов вручную, чтобы избежать конфликтов, например с network manager
iface eth0 inet manual
iface eth1 inet manual
# Настройки бриджа
auto br0
iface br0 inet static
bridge_ports eth0 eth1
address 192.168.5.7
netmask 255.255.255.0
```
3. Необходимо запретить использование интерфейсов `eth0` `eth1` в dhcpcd
```bash
sudo nano /etc/dhcpcd.conf
```
вставить следующую строку
```
denyinterfaces eth0 eth1
```
4. Восстановление Wi-Fi
*после задания статического IP адреса в `/etc/network/interfaces` не работает беспроводная сеть*
*для восстановления возможности использования Wi-Fi необходимо:*
- отключить службу `dhcpcd`
```bash
sudo systemctl disable dhcpcd
sudo systemctl enable networking
```
или
- запретить использование беспроводного интерфейса службой dhcpcd
```bash
sudo nano /etc/dhcpcd.conf
```
вставить следующую строку
```
denyinterfaces wlan0
```
вне зависимости от выбранного способа, настройки беспроводной сети необходимо произвести вручную
```bash
sudo nano /etc/network/interfaces
```
добавить
```bash
# wlan
auto wlan0
iface wlan0 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
```
задать параметры конкретной беспроводной сети
```bash
sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
```
добавить
```
country=RU
network={
ssid="название сети"
psk="пароль"
}
```
*в документации описан способ, при котором можно зашифровать отображение пароля
https://www.raspberrypi.org/documentation/configuration/wireless/wireless-cli.md*
5. Перезагрузить Raspberry для вступления изменений в силу
```bash
sudo reboot
```

27
serial_con.md Normal file
View File

@ -0,0 +1,27 @@
**Serial connection via USB**
1. Необходимо выяснить к какому порту происходит подключение при включении USB кабеля.
*до подключения кабеля*
```bash
ls /dev | grep USB
```
*подключить кабель и повторить ввод команды*
```bash
user@host:~$ ls /dev | grep USB
ttyUSB0
```
2. Уточнить кому принадлежит устройство (пользователь:группа)
```bash
ls -l /dev/ttyUSB0
```
*пример вывода*
```bash
da2001@Metromint:~$ ls -l /dev/ttyUSB0
crw-rw---- 1 root dialout 188, 0 авг 26 09:41 /dev/ttyUSB0
```
*из вывода понятно, что права на запись есть у владельца и группы. Необходимо добавить своего пользователя в эту группу*
```bash
sudo usermod -aG dialout $USER
```
*для вступления изменений в силу необходимо перелогиниться.*

91
ssh.md Normal file
View File

@ -0,0 +1,91 @@
### ssh
Подключение
```bash
ssh admin@192.168.5.3
```
если имя пользователя не указывать, соединение произойдет от имени локального пользователя
```bash
ssh 192.168.5.3
```
не стандартный порт при подключении
```bash
ssh pi@da2001.ru -p 227
```
не добавлять публичный ключ удаленного хоста в локальный файл _**known_hosts**_, при этом будет запрошено подтверждение подключения
```bash
ssh -o UserKnownHostsFile=/dev/null admin@192.168.1.2
```
не проверять публичный ключ удаленного хоста
```bash
ssh -o StrictHostKeyChecking=no admin@192.168.1.2
```
не добавлять публичный ключ и не проверять удаленный хост
```bash
ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no admin@192.168.1.2
```
выполнить команду на сервере без подключения
```bash
ssh user@host ls
```
выполнить локальный скрипт
```bash
ssh da2001@192.168.1.2 'python3' < test.py
```
### scp
```bash
scp ./wlt.py pi@da2001.ru:/home/pi
```
использование не стандартного порта
```bash
scp -P 227 ./wlt.py pi@da2001.ru:/home/pi
```
### ssh аутентификация по ключам
**На локальном хосте linux сгенерировать пару ключей**
```bash
ssh-keygen
```
парольную фразу можно оставить пустой, чтобы не вводить пароль каждый раз при обращении к ключу
о умолчанию ключи будут храниться в каталоге ~/.ssh в домашнем каталоге текущего пользователя. Закрытый ключ будет называться **id_rsa**, а связанный с ним открытый ключ **id_rsa.pub**_
Теперь необходимо скопировать публичный ключ на сервер, доступ к которому настраиваем
```bash
cat ~/.ssh/id_rsa.pub | ssh login@example.com "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
```
**Для дополнительной безопасности можно отключить доступ по паролю**
Для этого необходимо отредактировать конфигурационный файл демона SSH raspberry
```bash
sudo nano /etc/ssh/sshd_config
```
Найти директиву _PasswordAuthentication_, раскомментировать ее и присвоить значение _no_
`PasswordAuthentication no`
Сохранить файл, закрыть.
Перезагрузить сервис
```bash
sudo systemctl restart ssh
```
### подключение через промежуточный хост
_если нужно подключиться по ssh на host2, при этом прямого подключения нет, но есть возможность подключиться через host1, можно такое подключение выполнить одной командой_
```
ssh -J user1@host1:22 user2@host2
```
но в таком случае придется вводить пароль от host1 и от host2. Чтобы этого избежать можно добавить на хосты публичный ключ клиента
если добавить к подключению опции:
```
-o UserKnownHostsFile=/dev/null
-o StrictHostKeyChecking=no
```
удаленный сервер не будет проверять и не будет добавлять хеш удаленного хоста в файл _**known_hosts**_
это может быть полезно, например, когда часто меняется прошивка зондов и хеш изменяется.
Таким образом, полная команда может выглядеть так:
```
ssh -J pi@da2001.ru:227 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no admin@192.168.5.3
```

341
start_bash.md Normal file
View File

@ -0,0 +1,341 @@
### Немного bash
###### top
[args | Позиционные аргументы](#args)
[var | Переменные](#var)
[read | запрос ввода](#read)
[if... then... else](#if)
[for](#for)
[&& и ||](#and-or)
[while](#while)
[until](#until)
[case](#case)
***
##### args
**Позиционные аргументы**
```bash
#!/bin/bash
# запусти скрипт с несколькими аргументами
echo Первый аргумент - $1
echo Второй аргумент - $2
echo Третий аргумент - $3
```
*примеры запуска скрипта*
```bash
user@host:~$ ./scr arg1 arg2 arg3
Первый аргумент - arg1
Второй аргумент - arg2
Третий аргумент - arg3
user@host:~$ ./scr arg1 arg2
Первый аргумент - arg1
Второй аргумент - arg2
Третий аргумент -
user@host:~$ ./scr arg1 arg2 arg3 arg4
Первый аргумент - arg1
Второй аргумент - arg2
Третий аргумент - arg3
```
**Перебор аргументов в цикле**
```bash
#!/bin/bash
# run this script with a few arguments
echo you have entered $# arguments
for i in "$@"; do
echo $i
done
exit 0
```
`$#` - счетчик, показывающий, сколько аргументов было использовано при запуске сценарий.
`$@` - относится ко всем аргументам, которые использовались при запуске сценария.
*пример запуска скрипта*
```bash
user@host:~$ ./scr arg1 arg2 arg3 arg4
you have entered 4 arguments
arg1
arg2
arg3
arg4
```
[вверх](#top)
***
##### var
Переменные
`var=value`
```bash
user@host:~$ var="значение переменной"
user@host:~$ echo $var
значение переменной
user@host:~$ var=8
user@host:~$ echo $var
8
user@host:~$ today=$(date +%d.%m.%Y)
user@host:~$ echo $today
03.08.2021
user@host:~$ today=`date +%d.%m.%Y`
user@host:~$ echo $today
03.08.2021
```
[вверх](#top)
***
##### read
Запрос ввода
```bash
#!/bin/bash
if [ -z $1 ]; then
echo Введите имя
read NAME
else
NAME=$1
fi
echo Вы ввели - $NAME
exit 0
```
`-z $1` - проверка существования аргумента
все возможные значения проверок в справке
`man test`
*перевод доступен здесь https://www.opennet.ru/man.shtml?topic=test&category=1&russian=0*
*пример запуска скрипта*
```bash
user@host:~$ ./scr Катя
Вы ввели - Катя
user@host:~$ ./scr
Введите имя
Ира
Вы ввели - Ира
```
[вверх](#top)
***
##### if
if... then... else
```bash
#!/bin/bash
# скрипт проверяет тип файла, переданного в качестве аргумента при запуске
if [ -f $1 ]
then
echo "$1 - это файл"
elif [ -d $1 ]
then
echo "$1 - это директория"
else
echo "Не понятно, что это \$1"
fi
exit 0
```
*пример запуска*
```bash
[da2001@co1 scripts]$ ./filechk /etc/hosts
/etc/hosts - это файл
[da2001@co1 scripts]$ ./filechk /etc
/etc - это директория
[da2001@co1 scripts]$ ./filechk ./non_exist_file
Не понятно, что это $1
```
[вверх](#top)
***
##### for
```bash
#!/bin/bash
for i in {0..6}
do
echo "Hi $i"
done
```
```bash
user@host:~$ ./scr
Hi 0
Hi 1
Hi 2
Hi 3
```
```bash
#!/bin/bash
for i in Ира Лена Катя
do
echo "Hi, $i"
done
```
```bash
user@host:~$ ./scr
Hi, Ира
Hi, Лена
Hi, Катя
```
```bash
#!/bin/bash
for (( c=1; c<=5; c++ ))
do
echo "Hi $c"
done
```
```bash
user@host:~$ ./scr
Hi 1
Hi 2
Hi 3
Hi 4
Hi 5
```
```bash
#!/bin/bash
for (( c=4; c>=0; c-- ))
do
echo "Hi $c"
done
```
```bash
user@host:~$ ./scr
Hi 4
Hi 3
Hi 2
Hi 1
Hi 0
```
[вверх](#top)
***
##### and, or
&& и ||
`&&` - логическое И. Вторая часть оператора будет выполнена только если первая часть истинна.
`||` - логическое ИЛИ. Вторая часть оператора будет выполнена только если первая часть неверна.
```bash
user@host:~$ for i in {10..13}; do ping -c 2 192.168.1.$i > /dev/null && echo 192.168.1.$i - доступен || echo 192.168.1.$i - НЕ доступен; done
192.168.1.10 - доступен
192.168.1.11 - доступен
192.168.1.12 - доступен
192.168.1.13 - НЕ доступен
```
[вверх](#top)
***
##### while
`while` - выполнять пока условие истинно
```bash
#!/bin/bash
x=1
while [ $x -lt 5 ]
do
echo "Значение счетчика: $x"
x=$(( $x + 1 ))
done
```
```bash
user@host:~$ ./scr
Значение счетчика: 1
Значение счетчика: 2
Значение счетчика: 3
Значение счетчика: 4
```
[вверх](#top)
***
##### until
`until` - выполнять пока условие ложно
```bash
#!/bin/bash
count=1
until [ $count -gt 4 ]
do
echo "Значение счетчика: $count"
count=$(( $count + 1 ))
done
```
```bash
user@host:~$ ./scr
Значение счетчика: 1
Значение счетчика: 2
Значение счетчика: 3
Значение счетчика: 4
```
[вверх](#top)
***
##### case
`case` - перебор условий
```bash
#!/bin/bash
echo -n "Введите страну: "
read COUNTRY
echo -n "Официальный язык в стране $COUNTRY это "
case $COUNTRY in
Литва)
echo "Латвийский"
;;
Румыния | Молдова)
echo "Румынский"
;;
Италия | "Сан Марино" | Швейцария | "Ватикан")
echo "Итальянский"
;;
*)
echo "unknown"
;;
esac
```
- каждое условие заканчивается `)`
- после условия описываются команды, которые необходимо выполнить, в конце ставится `;;`
- `*)` относится ко всем остальным значениям, которые явно не указаны ранее
```bash
user@host:~$ ./scr
Введите страну: Ватикан
Официальный язык в стране Ватикан это Итальянский
user@host:~$ ./scr
Введите страну: Россия
Официальный язык в стране Россия это unknown
```
[вверх](#top)
***

1443
start_linux.md Normal file

File diff suppressed because it is too large Load Diff

65
tar.md Normal file
View File

@ -0,0 +1,65 @@
### TAR
**Создать архив**
```
tar -cvf archivename.tar /files-you-want-toarchive
```
-c, --create create a new archive
-v, --verbose verbosely list files processed
-f, --file=ARCHIVE use archive file or device ARCHIVE
**Создать архив со сжатием**
```
tar -czvf archivename.tar.gz /files-you-want-toarchive
```
-j, --bzip2 filter the archive through bzip2
-J, --xz filter the archive through xz
-z, --gzip, --gunzip, --ungzip filter the archive through gzip
**Добавить файл в существующий архив**
```
tar -rvf /root/homes.tar /etc/hosts
```
-r, --append append files to the end of an archive
**Обновить файлы в существующем архиве**
```
tar -uvf /root/homes.tar /home
```
-u, --update only append files newer than copy in archive
**Просмотр содержимого архива**
```
tar -tvf /root/homes.tar
```
-t, --list list the contents of an archive
**Извлечь файлы из архива в текущий каталог**
```
tar -xvf /archivename
```
-x, --extract, --get extract files from an archive
**Извлечь файлы из сжатого архива**
```
tar -xzvf archivename.tar.gz
```
**Извлечь файлы из архива в другой каталог**
```
tar -xvf /archivename -C /tmp
```
-C, --directory=DIR change to directory DIR
**Извлечь определённый файл из архива**
```
tar -xvf /root/etc.tar etc/hosts
```

155
tcpdump.md Normal file
View File

@ -0,0 +1,155 @@
### tcpdump
озможные сетевые интерфейсы для захвата_
`sudo tcpdump -D`
_указать конкретный интерфейс_
`sudo tcpdump -i eth0`
_больше информации в выводе_
`sudo tcpdump -v -i eth0`
host - _имя хоста;_
ip - _ip адрес;_
proto - _протокол;_
net - _адрес сети или подсети;_
port - _адрес порта;_
src - _параметр, касающийся отправителя;_
dst - _параметр, касающейся получателя;_
`sudo tcpdump -i eth0 src host 192.168.1.2 and not port 22`
`sudo tcpdump -v -n -A -e not port 22 and not port 123 and not stp`
`sudo tcpdump -v -n -A -e -i eth0 src host 192.168.5.1 and tcp`
v - _более подробный вывод_
n - е подменять значения на названия, например - указывать ff:ff:ff:ff:ff:ff вместо Broadcast_
A - _выводить всё в ASCII_
e - _выводить данные L2_
#### Подробнее
**Ключи**
_Наиболее часто используемые ключи при запуске tcpdump приведены таблице_
ключ описание
-a реобразовывает сетевые и широковещательные адреса в доменные имена._
-e _Отображает данные канального уровня (MAC-адрес, протокол, длина пакета). Помимо IP-адресов будут отображаться MAC-адреса компьютеров._
-F айл. Использовать фильтр, находящийся в файле. Если вы используете этот параметр, фильтр из командной строки будет игнорироваться._
-i _Указывает на то, какой сетевой интерфейс будет использоваться для захвата пакетов. По умолчанию — eth0, для выбора всех интерфейсов — any. Если отсутствует локальная сеть, то можно воспользоваться интерфейсом обратной связи lo._
-l _Использовать стандартный потоковый вывод tcpdump (stdout), например для записи в файл:
`shell# tcpdump -l | tee out.log //отобразит работу tcpdump и сохранит результат в файле out.log`_
-N _Не добавляет доменное расширение к именам узлов. Например tcpdump отобразит `net` вместо `net.library.org`_
-n _Отображает IP-адрес вместо имени хоста._
-nn _Отображает номер порта вместо используемого им протокола._
-p _Не переводит интерфейс в режим приема всех пакетов (promiscuous mode)._
-q _Выводит минимум информации. Обычно это имя протокола, откуда и куда шел пакет, порты и количество переданных данных._
-r _Этот параметр позволяет tcpdump прочесть трафик из файла, если он был предварительно сохранен параметром -w._
-S озволяет не обрабатывать абсолютные порядковые номера (initial sequence number — ISN) в относительные._
-s _число. Количество байтов пакета, которые будет обрабатывать tcpdump. При установке большого числа отображаемых байтов информация может не уместиться на экране и её будет трудно изучать. В зависимости от того, какие цели вы преследуете, и следует выбирать значение этого параметра. По умолчанию tcpdump захватывает первые 68 байт (для SunOS минимум 96 байт), однако если вы хотите увидеть содержимое всего пакета, используйте значение в 1514 байт (максимально допустимый размер кадра в сети Ethernet)._
-t _Не отображает метку времени в каждой строке._
-T _тип. Интерпретация пакетов заданного типа. Поддерживаются типы aodv, cnfp, rpc, rtp, rtcp, snmp, tftp, vat, wb._
-tt _Отображает неформатированную метку времени в каждой строке._
-tttt оказывает время вместе с датой._
-v _Вывод подробной информации (TTL; ID; общая длина заголовка, а также его параметры; производит проверку контрольных сумм IP и ICMP-заголовков)_
-vv _Вывод ещё более полной информации, в основном касается NFS и SMB._
-vvv _Вывод максимально подробной информации._
-w айл. Сохраняет данные tcpdump в двоичном формате. Преимущества использования данного способа по сравнению с обычным перенаправлением в файл является высокая скорость записи и возможность чтения подобных данных другими программами, например snort, но этот файл нельзя прочитать человеку. Возможен вывод двоичных данных на консоль, для этого необходимо использовать -w —_
-x елает распечатку пакета в шестнадцатеричной системе, полезно для более детального анализа пакета. Количество отображаемых данных зависит от параметра -s_
-xx _То же, что и предыдущий параметр -x, но включает в себя заголовок канального уровня_
-X _Выводит пакет в ASCII- и hex-формате. Полезно в случае анализа инцидента связанного со взломом, так как позволяет просмотреть какая текстовая информация передавалась во время соединения._
-XX _То же, что и предыдущий параметр -X, но включает заголовок канального уровня._
-с _число. tcpdump завершит работу после получения указанного числа пакетов._
-U _Собранные пакеты будут сразу складываться в файл, а иначе копиться в памяти до тех пор, пока она не закончится_
**Фильтры tcpdump**
Фильтры разделяются на следующие классификации
Тип
host — _адрес узла сети_
port _порт на котором нужно ловить пакеты_
portrange _диапазон портов_
net _сеть_
_пример_
```bash
tcpdump net 192.168.0.0/24
```
ахват всего трафика в котором в качестве источника или получателя стоят ip адреса из сети 192.168.0.0/24_
```bash
tcpdump port 80
```
удет захватываться весь трафик на 80-м порту._
Направление трафика по отношению к объекту мониторинга
src _отправитель_
dst — _получатель_
апример команда_
```bash
src host 172.31.25.200
```
_Захват трафика у которого отправитель ip адрес 172.31.25.200_
Протокол
ether _базовая сетевая технология Ethernet, как правило указывает на то что в фильтре используется аппаратный MAC адрес_
ip _протокол IPv4_
ip6 _протокол IPv6_
arp _протокол ARP_
tcp _протокол TCP_
udp _протокол UDP_
_Если протокол не указан, то будет захвачен трафик по всем протоколам_
_Например команда_
```bash
udp port 5060
```
ахват трафика по протоколу udp порт 5060_
Составные фильтры
_Для того что бы более гибко фильтровать трафик можно использовать логические операции_
«И» _and (&&)_
«ИЛИ» _or (||)_
«НЕ» _not (!) инверсия значения_
При этом приоритет этих операций следующий:
наивысшим приоритетом обладает операция инверсии
потом логическое «И»
наименьшим приоритетом обладает операция «ИЛИ».
Приоритет операций можно менять с помощью круглых скобок.
`(net 172.16.0.0/24 or host 172.31.0.5) and tcp port 80`
ахват трафика протокола TCP и использующего порт 80 принадлежащего сети 172.16.0.0/24 или хосту 172.31.0.5, как любому хосту по отдельности так и вместе_
`(net 172.16.0.0/24 || host 172.31.0.5) && not tcp port 80`
ахват любого трафика кроме трафика протокола TCP и использующего порт 80 принадлежащего сети 172.16.0.0/24 или хосту 172.31.0.5 как любому хосту по отдельности так и вместе_
**Фильтры tcpdump со смещением, пример**
Отфильтровать все UDP внутри GRE по смещению
Отсчет ведется в байтах начиная от внешнего заголовка IP пакета, отсчет идет с 0, т.е. `ip[0]` это поле версии протокола, обычно это `0x45`
```
sniff(offline="erspan.pcap", filter="ip[71] == 0x11")
```
71 - смещение
0x11 - 17 в hex, т.е. UDP
Смещение не обязательно считать от IP заголовка, можно и от других
**tcpdump linux примеры**
Запись вывода в файл
```bash
$ sudo tcpdump -w sshtrace.tcpdump tcp port 22
```
айл sshtrace.tcpdump будет по-умолчанию создан в домашнем каталоге текущего пользователя. Для вывода информации из файла myrouter.tcpdump следует использовать опцию -r:_
```bash
$ tcpdump -r sshtrace.tcpdump
```
Снять весь трафик с интерфейса eth1
```bash
$ tcpdump i eth1
```
Снять трафик с диапазона портов на интерфейсе eth1
```bash
$ tcpdump -i eth1 portrange 100-200
```
весь трафик, идущий к 172.16.0.1, который не является ICMP.
```bash
tcpdump dst 172.16.0.1 and not icmp
```
Ловим весь входящий трафик, исключая трафик генерируемый нашей SSH-сессией.
```bash
$ tcpdump -i eth0 -n -nn -ttt 'dst host 172.16.0.10 and not (src host 172.16.0.11 and dst port 22)'
```

57
tmux.md Normal file
View File

@ -0,0 +1,57 @@
### TMUX
***Конфиг*** *(пользовательский / системный)*
```bash
~/.tmux.conf
/etc/tmux.conf
```
***Включить поддержку мыши*** *(в конфиг добавить)*
```bash
set -g mouse on
```
***Запуск*** *(без параметров будет создана сессия `0`)*
```bash
tmux
```
новая сессия `session1`. Название отображается снизу-слева в квадратных скобках в статус строке. Далее идет перечисление окон. Текущее окно помечается звездочкой.
```bash
tmux new -s session1
```
***Окна***
`Ctrl+b с` - новое окно
`Ctrl+b w` - список окон. переключиться курсором вверх-вниз
`Ctrl+b &` - закрыть окно, нужно подтвердить `y`
`Ctrl+b {` - переместить активное окно влево по кругу
***Переключение***
`Ctrl+b n` - следующее окно
`Ctrl+b p` - предыдущее окно
`Ctrl+b 0` - переключиться на номер окна
***Деление окна***
`Ctrl+b "` - деление окна горизонтально или `tmux split-window -h`
`Ctrl+b %` - деление окна вертикально или `tmux split-window -v`
`Ctrl+b стрелки` - переход между панелей, либо режим мыши
`Ctrl+b+стрелки` - изменение размеров панелей или `Ctrl+b Ctrl+стрелки`. Или мышью - потянуть за край панели.
`Ctrl+b z` - zoom, выделить окно, повторное нажатие вернёт обратно
`Ctrl+b space` - смена разделения на предопределённые расположения
`Ctrl+d` - закрыть текущее окно
`Ctrl+b x` - закрытие окон, нужно подтвердить `y` или `exit`
***Сессии***
`Ctrl+b d` - отключение от сессии или `tmux detach`
`tmux ls` - список сессий
*Подключиться к работающей сессии*
`tmux attach` - подключение к сессии, либо к единственной, либо последней созданной
`tmux attach -t session1` - подключение к сессии session1
`Ctrl+b s` - выбрать сессию
`tmux kill-session -t session1` - завершение сессии
`tmux kill-server` - завершить все сессии
***
`tmux list-commands` - cписок поддерживаемых команд

BIN
utp.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

BIN
vim.pdf Normal file

Binary file not shown.

View File

@ -0,0 +1,43 @@
### Дополнительный IP на интерфейсе (Secondary IP) Linux
**!дополнительный IP должен быть из другой подсети!**
_Временный IP на интерфейсе до перезагрузки_
**ifconfig**
```
ifconfig [nic]:0 [IP-Address] netmask [mask] up
```
пример
```
ifconfig eth0:0 192.168.2.2 netmask 255.255.255.0 up
```
**ip**
```
ip address add [ip]/[mask-digits] dev [nic]:0
```
пример
```
ip address add 192.168.99.37/24 dev eth0:0
```
остоянный дополнительный IP_
для Debain/Ubuntu
```
nano /etc/network/interfaces
```
общий вид
```
auto [NIC]:[n]
iface [NIC]:[n] inet static
address [ip.add.rr.ss]
gateway [gw.ip.ad.rs]
netmask [ne.tm.as.kk]
```
пример
```
auto eth0:1
iface eth0:1 inet static
address 192.168.0.1
gateway 192.168.0.254
netmask 255.255.255.0
```
Можно добавлять несколько блоков с IP адресами. Достаточно указать их номера eth0:0, eth0:1, eth0:2 и т.д.

View File

@ -0,0 +1,52 @@
#### **Это пошаговое руководство о том, как изменить имя пользователя в Debian, Ubuntu, Deepin, Linux Mint, elementary OS (и других дистрибутивах Linux на основе Debian или Ubuntu) и Fedora.**
_В инструкциях объясняется, как изменить (переименовать) имя пользователя вместе с именем домашней папки пользователя, а также простой способ устранения потенциальных проблем с файлами конфигурации, которые все еще указывают на старое имя домашней папки. Также есть шаг для изменения полного имени (отображаемого имени), которое отображается на экране входа в систему и в других местах на рабочем столе._
Во всех приведенных ниже инструкциях или командах не забудьте заменить `newusername` его новым именем пользователя и `oldusername` старым именем пользователя.
**1) Создайте временного пользователя и предоставьте ему привилегии sudo**
_Мы войдем в систему с временным пользователем, чтобы выполнить команды смены имени пользователя. Таким образом, не будет проблем при запуске их от того же пользователя, которого мы пытаемся переименовать (например, процессы, запущенные для этого пользователя и т. д.)._
Добавьте нового временного пользователя `tempuser` и предоставьте ему привилегии `sudo` в Debian, Ubuntu, Deepin, elementary OS или Linux Mint (после ввода пароля вы можете продолжать нажимать, Enter чтобы пропустить ввод остальной информации):
```
sudo adduser tempuser
sudo usermod -aG sudo tempuser
```
Добавьте новый tempuser и предоставьте ему привилегии sudo на Fedora:
```
sudo adduser tempuser
sudo passwd tempuser
sudo usermod -aG wheel tempuser
```
**2) Войдите в систему как tempuser и измените (переименуйте) имя пользователя, домашнюю папку и группу**
Выйдите из системы и на экране входа выберите tempuser и войдите под этим пользователем. Затем откройте терминал и выполните эти команды, чтобы изменить имя пользователя, домашнюю папку и группу с oldusername на newusername:
```
sudo usermod -l newusername -d /home/newusername -m oldusername
sudo groupmod -n newusername oldusername
```
Если вы получили ошибку об использовании процесса для старого имени пользователя, убейте этот процесс (kill PID), но в большинстве случаев этого не должно происходить, поскольку мы вошли в систему, используя временное промежуточное имя пользователя для внесения этих изменений. Если это произойдет, другой обходной путь — это перезагрузить компьютер, а затем войти в `tempuser` напрямую, таким образом, нет никаких процессов, используемых старым именем пользователя.
**3) Создайте символическую ссылку из `/home/newusername` в `/home/oldusername`**
Некоторые приложения будут отображать ошибки при изменении имени пользователя, потому что в некоторых случаях есть файлы конфигурации, которые указывают на домашнюю папку старого имени пользователя. Решением для этого является создание символической ссылки из новой домашней папки на старую домашнюю папку:
```
sudo ln -s /home/newusername /home/oldusername
```
**4) Измените отображаемое имя или полное имя (имя, фамилия)**
В моем случае при попытке переименовать имя пользователя в Ubuntu 19.04 и Fedora 29 отображаемое имя (полное имя) осталось неизменным на экране входа в GDM3 и в меню пользователя. Это можно изменить, используя:
```
sudo chfn -f "firstname lastname" newusername
```
Заменить `firstname` и `lastname` с именем и фамилией, или что вы хотите, чтобы показать на экране входа и различных других местах по всей системе. firstname и lastname также может быть одним элементом, например, вашим новым именем пользователя. 
Команда `chfn` доступна на Fedora в util-linux-user пакете, который не установлен по умолчанию. Вы можете установить его на Fedora, используя:
```
sudo dnf install util-linux-user
```
После установки этого пакета chfn команда должна работать на Fedora.
**5) Войдите в систему с новым (переименованным) именем пользователя и удалите временного пользователя, созданного в шаге 1**
Выйдите из системы, выберите новое, переименованное имя пользователя на экране входа в систему и перейдите к входу в систему. Теперь вы можете удалить временного пользователя, созданного в шаге 1 `tempuser`, и его домашнюю папку:
```
sudo userdel -r tempuser
```

View File

@ -0,0 +1,36 @@
### Изоляция сетевых интерфейсов устройства
роверка стенда, когда один М716 двумя портам подключается к маршрутизатору и необходимо выполнять тестирование с одно порта на другой_
**Схема теста**
**M716**
Порт A соединен с портом маршрутизатора с IP-адресом 192.168.1.2
Порт B соединен с портом маршрутизатора с IP-адресом 192.168.2.2
Управление через порт Mnt
**Создаем изолированные пространства для каждого порта**
_PORT_A/PORT_B - это просто названия_
```
ip netns add PORT_A
ip netns add PORT_B
```
**Добавляем порты в свои пространства**
```
ip link set dev gbe0 netns PORT_A
ip link set dev gbe1 netns PORT_B
```
**Далее выполняем стандартную настройку, но вначале команды необходимо указывать в рамках какого простанства мы работаем**
```
ip netns exec PORT_A ip addr add 192.168.1.1/24 dev gbe0
ip netns exec PORT_B ip addr add 192.168.2.1/24 dev gbe1
ip netns exec PORT_A ip link set dev gbe0 up
ip netns exec PORT_B ip link set dev gbe1 up
ip netns exec PORT_A ip route add 192.168.2.0/24 via 192.168.2.2
ip netns exec PORT_B ip route add 192.168.1.0/24 via 192.168.1.2
```
**Проверка**
```
ip netns exec PORT_A ping 192.168.2.1
ip netns exec PORT_A traceroute 192.168.2.1
ip netns exec PORT_B ping 192.168.1.1
ip netns exec PORT_B traceroute 192.168.1.1
```

View File

@ -0,0 +1,39 @@
### Маршрут по-умолчанию Linux (default gateway)
Маршрут по-умолчанию задается при настройке сетевых интерфейсов в файле
`/etc/network/interfaces`
пример:
```
auto eth0
iface eth0 inet static
address 192.168.5.2
netmask 255.255.255.0
gateway 192.168.5.1
```
Применение измений этого файла произойдут после перезагрузки системы.
Если необходимо сменить маршрут по-умолчанию немедленно:
_Узнать текущее значение можно_
```bash
ip ro sh
```
_Сначала необходимо удалить существующее значение маршрута по-умолчанию, это можно сделать несколькими командами_
```bash
sudo ip route delete default
```
_или_
```bash
sudo ip route del 0/0
```
_Теперь присвоить новое значение_
_Например, если IP - адрес роутера 192.168.1.1 и он соединен с локальным интерфейсом eth0, то:_
```bash
sudo route add default gw 192.168.1.1 eth0
```
_или_
```bash
sudo route add default gw 192.168.1.1
```
_или_
```bash
sudo ip route add default via 192.168.1.1
```

View File

@ -0,0 +1,10 @@
#### Маршрутизация (Route)
**Включить маршрутизацию трафика**
```bash
sudo nano /etc/sysctl.conf
```
раскомментировать строку `net.ipv4.ip_forward=1`
перезагрузить raspberry
```bash
sudo reboot
```

View File

@ -0,0 +1,22 @@
Монтирование образа
kpartx -- Linux утилита, которая позволяет легко подмонтировать образ SD-карты (в частности для наших приборов):
$ sudo kpartx -a etln10g.bin
$ lsblk
...
loop19 7:19 0 3,8G 0 loop
├─loop19p1 253:0 0 1M 0 part
├─loop19p2 253:1 0 1,4G 0 part
├─loop19p3 253:2 0 1K 0 part
├─loop19p5 253:3 0 600M 0 part
├─loop19p6 253:4 0 600M 0 part
├─loop19p7 253:5 0 180M 0 part
├─loop19p8 253:6 0 180M 0 part
├─loop19p9 253:7 0 360M 0 part
└─loop19p10 253:8 0 360M 0 part
...
$ mkdir p2
$ sudo mount -o rw -t ext4 /dev/mapper/loop19p2 p2
удалять созданный loop по имени образа:
sudo kpartx -d etln10g.bin

View File

@ -0,0 +1,91 @@
## Настройка VNC Ubuntu Server 20.04 Rspberry PI 4
*Установку и настройку ОС выполнял по документации*
[How to install Ubuntu on your Raspberry PI](https://ubuntu.com/tutorials/how-to-install-ubuntu-on-your-raspberry-pi#1-overview)
**Установим DE**
```bash
sudo apt update
sudo apt upgrade
sudo apt install xubuntu-desktop
sudo reboot
```
**TightVNC Server**
*За основу взял эти статьи:*
[Установка и настройка VNC в Ubuntu 20.04](https://www.8host.com/blog/ustanovka-i-nastrojka-vnc-v-ubuntu-20-04/)
[Как настроить и использовать сервер TigerVNC в Linux](https://zalinux.ru/?p=3905)
*TigerVNC настроить не получилось, сервер не пускал к себе никого*
`sudo apt install tightvncserver`
*при первом запуске нужно задать пароль*
`vncserver`
*Если в будущем понадобиться изменить пароль или добавить пароль для просмотра, это можно сделать с помощью команды vncpasswd:*
`vncpasswd`
*При первом запуске VNC использует порт 5901. Чтобы изменить настройки сервера VNC, нужно остановить экземпляр, использующий порт 5901.*
`vncserver -kill :1`
*Резервная копия файла xstartup:*
`mv ~/.vnc/xstartup ~/.vnc/xstartup.bak`
*Затем создать новый файл xstartup*
`nano ~/.vnc/xstartup`
```bash
#!/bin/bash
PATH=/usr/bin:/usr/sbin
unset SESSION*MANAGER
unset DBUS*SESSION*BUS*ADDRESS
exec ЗАПУСК &
```
*Вместо слова `ЗАПУСК` должен быть указан исполнимый файл, запускающий X сессию.*
*Для Cinnamon:* `cinnamon-session-cinnamon`
*Для XFCE:* `startxfce4`
*Для GNOME:* `/usr/bin/gnome-session`
*Для Kodi:* `kodi-standalone`
*Для Mate:* `mate-session`
*Для lxqt:* `startlxqt`
*Узнать исполняемый файл для любого окружения рабочего стола установленного в системе -* `ls /usr/share/xsessions/`
*В этой папке лежат файлы с расширением `.desktop`, например:*
`cinnamon2d.desktop cinnamon.desktop gnome.desktop gnome-xorg.desktop kodi.desktop`
*Открыть любой, найти там строку, которая начинается на «Exec», например для файла xfce.desktop:*
`Exec=cinnamon-session-cinnamon`
*сделать файл исполняемым:* `chmod +x ~/.vnc/xstartup`
**Настройка VNC как сервиса systemd**
`sudo nano /etc/systemd/system/vncserver@.service`
```bash
[Unit]
Description=Start TightVNC server at startup
After=syslog.target network.target
[Service]
Type=forking
User=da2001
Group=da2001
WorkingDirectory=/home/da2001
PIDFile=/home/da2001/.vnc/%H:%i.pid
ExecStartPre=-/usr/bin/vncserver -kill :%i > /dev/null 2>&1
ExecStart=/usr/bin/vncserver -depth 24 -geometry 1280x720 :%i
ExecStop=/usr/bin/vncserver -kill :%i
[Install]
WantedBy=multi-user.target
```
*сохранить, закрыть*
*Затем сообщите системе про новый юнит-файл.*
`sudo systemctl daemon-reload`
*И включите его:*
`sudo systemctl enable vncserver@1.service`
*Цифра 1, идущая за @, определяет, какой номер дисплея должен отображаться в сервисе, в этом случае это значение по умолчанию :1.*
*Остановите текущий экземпляр сервера VNC, если он еще запущен.*
`vncserver -kill :1`
*Теперь попробуйте запустить его как любой другой сервис systemd:*
`sudo systemctl start vncserver@1`
*Чтобы убедиться, что сервер запущен, проверьте его состояние:*
`sudo systemctl status vncserver@1`

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,19 @@
При старте системы NGINX не стартовал автоматически, приходилось стартовать руками командой
sudo service nginx restart
Оказалось, это происходило из-за того, что nginx стартовал раньше сети, это приводило к ошибке и остановке nginx.
Нужно в скрипте автозапуска nginx прописать запуск сервиса после поднятия сети.
Для этого в файле
/lib/systemd/system/nginx.service
в секцию UNIT добавляем
[Unit]
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
при этом нужно закомментировать то, что там было в After
сохраняем, перезагружаемся.
На Debian 9.9 помогло

82
Образ_SD_dd.md Normal file
View File

@ -0,0 +1,82 @@
### Образ SD-карты с помощью dd
_Чтобы размер образа занимал как можно меньше места и, соответственно быстрее создавался, необходимо на SD-карте уменьшить размер раздела (отрезать всё свободное место), т.к. в создаваемый образ оно тоже попадает_
_Уменьшить размер раздела можно с помощью стандартной утилиты **Диски** (Linux Mint), **Gparted**, **parted**_
1. Расчет размера разделов
```bash
sudo fdisk -l /dev/sdb
```
вывод будет примерно такой:
Диск /dev/sdb: 29,29 GiB, 31439454208 байт, 61405184 секторов
Disk model: Card Reader
Единицы: секторов по 1 * 512 = 512 байт
Размер сектора (логический/физический): 512 байт / 512 байт
Размер I/O (минимальный/оптимальный): 512 байт / 512 байт
Тип метки диска: dos
Идентификатор диска: 0x1238ae1a
Устр-во Загрузочный начало Конец Секторы Размер Идентификатор Тип
/dev/sdb1 8192 532479 524288 256M c W95 FAT32 (LBA)
/dev/sdb2 532480 5279743 4747264 2,3G 83 Linux
Обратим внимание на 2 параметра:
Конец - **5279743** (это последний сектор нашего раздела)</br>
Размер секторов - **Единицы: секторов по 1 \* 512 = 512 байт**</br>
Таким образом нам необходимо сохранить:</br>
5279743 + 1 (первый сектор начинается с 0) = 5279744 секторов</br>
5279744 \* 512 (размер сектора) = 2703228928 байт</br>
2703228928 / 1024 / 1024 = 2578 Мб (обязательно округляем в большую сторону)</br>
2. Создание образа
еобходимо запустить запись с нужными параметрами_
```bash
sudo dd if=/dev/sdb of=$HOME/Backup/image.img bs=1M count=2578 conv=noerror,sync status=progress
```
либо с учетом пустого места (без параметра count)
```bash
sudo dd if=/dev/sdb of=$HOME/Backup/image.img bs=1M conv=noerror,sync status=progress
```
if=/dev/sdb - откуда
of=/$HOME/Backup/image.img - куда
bs=1M - размер одного блока при передаче данных (влияет на скорость записи)
с - один символ;
b - 512 байт;
kB - 1000 байт;
K - 1024 байт;
MB - 1000 килобайт;
M - 1024 килобайт;
GB - 1000 мегабайт;
G - 1024 мегабайт.
count=2578 - количество записываемых блоков
conv=noerror,sync - norerror -игнорировать ошибки, sync -записывать 0 в ошибочные секторы, чтобы не нарушить структуру
status=progress - выводить в консоль сведения о процессе записи
образ можно сразу сжать при создании
```bash
sudo dd if=/dev/sdb bs=1M count=2578 conv=noerror,sync | gzip -c > /$HOME/Backup/image.img.gz
```
3. Восстановление образа
если образ создавали без сжатия
```bash
sudo dd if=$HOME/Backup/image.img of=/dev/sdb bs=1M conv=noerror,sync status=progress
```
если создавали со сжатием
```bash
gunzip -c $HOME/Backup/image.img.gz | sudo dd of=/dev/sdb conv=noerror,sync status=progress
```

View File

@ -0,0 +1,17 @@
### Пересоздание ключей ssh сервера
_Иногда требуется пересоздать ключи сервера SSH. Например при компрометации системы, чтобы в дальнейшем злоумышленнику было невозможно расшифровать SSH трафик. Или если система распространяется одним образом для всех (например Kali Linux для Raspberry Pi)._
Для пересоздания ключей сначала удалим старые ключи:
```bash
rm /etc/ssh/ssh_host_*
```
Переконфигурируем пакет SSH сервера:
```bash
dpkg-reconfigure openssh-server
```
Перезапустим SSH сервер:
```bash
service ssh restart
```
Обновление ключей закончено.

View File

@ -0,0 +1,132 @@
#### Изменяем приветствие консоли сервера
Изначально видим
```
Linux DNAS 4.9.0-9-amd64 #1 SMP Debian 4.9.168-1+deb9u2 (2019-05-13) x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Mon Jun 10 14:15:12 2019 from 193.164.201.34
```
1) За отказ от ответственности
```
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
```
отвечает файл `/etc/motd`
для его быстрой очистки используем
```bash
sudo cp /dev/null /etc/motd
```
2) Информация о последнем подключении
```
Last login: Mon Jun 10 14:15:12 2019 from 193.164.201.34
```
Чтобы отключить сообщение о последнем входе (что я не рекомендую делать), надо отредактировать вот этот файл:
`/etc/ssh/sshd_config`
Найдите вот эту опцию и замените `yes` на `no`:
`PrintLastLog no`
Теперь, когда вы будете входить, вы этого сообщения не увидите. Из соображений безопасности всё же не рекомендую так делать.
3) Вывод данных о системе
```
Linux DNAS 4.9.0-9-amd64 #1 SMP Debian 4.9.168-1+deb9u2 (2019-05-13) x86_64
```
Содержится в файле `/etc/update-motd.d/10-uname`
Чтобы отключить его вывод, достаточно снять с файла права на запуск
4) Создадим свой скрипт вывода
_Можно создавать свои скрипты, которые будут отображаться при успешной авторизации. Эти скрипты хранятся по адресу `/etc/profile.d/`_
Создадим свой скрипт:
```bash
sudo nano /etc/profile.d/ssh-info.sh
```
Вставим следующий текст:
```bash
#!/bin/sh
#
# Text Color Variables http://misc.flogisoft.com/bash/tip_colors_and_formatting
tcLtG="\033[00;37m" # LIGHT GRAY
tcDkG="\033[01;30m" # DARK GRAY
tcLtR="\033[01;31m" # LIGHT RED
tcLtGRN="\033[01;32m" # LIGHT GREEN
tcLtBL="\033[01;34m" # LIGHT BLUE
tcLtP="\033[01;35m" # LIGHT PURPLE
tcLtC="\033[01;36m" # LIGHT CYAN
tcW="\033[01;37m" # WHITE
tcRESET="\033[0m"
tcORANGE="\033[38;5;209m"
#
# Время суток
HOUR=$(date +"%H")
if [ $HOUR -lt 12 -a $HOUR -ge 4 ]; then TIME="Доброе утро!"
elif [ $HOUR -lt 17 -a $HOUR -ge 12 ]; then TIME="Добрый день!"
elif [ $HOUR -lt 23 -a $HOUR -ge 17 ]; then TIME="Добрый вечер!"
else TIME="Доброй ночи!"
fi
#
# Время с момента перезагрузки
uptime=`cat /proc/uptime | cut -f1 -d.`
upDays=$((uptime/60/60/24))
upHours=$((uptime/60/60%24))
upMins=$((uptime/60%60))
#
# System + Memory
SYS_LOADS=`cat /proc/loadavg | awk '{print $1}'`
MEMORY_USED=`free -m | grep Mem | awk '{print $3}'`
MEMORY_TOTAL=`free -m | grep Mem | awk '{print $2}'`
SWAP_USED=`free -m | grep Swap | awk '{print $3}'`
SWAP_TOTAL=`free -m | grep Swap | awk '{print $2}'`
NUM_PROCS=`ps aux | wc -l`
IPADDRESS=`hostname --all-ip-addresses`
SDA1SIZE=`df -h /dev/sda1 | grep /dev/sda1 | awk '{print $2}'`
SDA1OST=`df -h /dev/sda1 | grep /dev/sda1 | awk '{print $3}'`
SDA1MOUNT=`df -h /dev/sda1 | grep /dev/sda1 | awk '{print $6}'`
SDB1SIZE=`df -h /dev/sdb1 | grep /dev/sdb1 | awk '{print $2}'`
SDB1OST=`df -h /dev/sdb1 | grep /dev/sdb1 | awk '{print $3}'`
SDB1MOUNT=`df -h /dev/sdb1 | grep /dev/sdb1 | awk '{print $6}'`
SDC1SIZE=`df -h /dev/sdc1 | grep /dev/sdc1 | awk '{print $2}'`
SDC1OST=`df -h /dev/sdc1 | grep /dev/sdc1 | awk '{print $3}'`
SDC1MOUNT=`df -h /dev/sdc1 | grep /dev/sdc1 | awk '{print $6}'`
SDD1SIZE=`df -h /dev/sdd1 | grep /dev/sdd1 | awk '{print $2}'`
SDD1OST=`df -h /dev/sdd1 | grep /dev/sdd1 | awk '{print $3}'`
SDD1MOUNT=`df -h /dev/sdd1 | grep /dev/sdd1 | awk '{print $6}'`
#
echo -e $tcDkG "==============================================================="
echo -e $tcLtG " $TIME $tcORANGE $USER"
echo -e $tcDkG "==============================================================="
echo -e $tcLtG " * Хост :$tcW `hostname -f`"
echo -e $tcLtG " * IP Адрес :$tcW $IPADDRESS"
echo -e $tcLtG " * Версия :$tcW $(lsb_release -s -d)"
echo -e $tcLtG " * Ядро : `uname -a | awk '{print $1" "$3" "$12}'`"
echo -e $tcLtG " * Пользователи : Авторизованных пользователей - `users | wc -w`"
echo -e $tcLtG " * Время на сервере : `date +"%A, %d %B %Y г., %T"`"
echo -e $tcLtG " * Загрузка системы : $SYS_LOADS / $NUM_PROCS запущенных процессов"
echo -e $tcLtG " * Память, RAM : Исп.: $MEMORY_USED Мб / Всего: $MEMORY_TOTAL Мб"
echo -e $tcLtG " * SWAP : Исп.: $SWAP_USED Мб / Всего: $SWAP_TOTAL Мб"
echo -e $tcLtG " * После включения : $upDays дней $upHours часов $upMins минут"
echo -e $tcDkG "==============================================================="
echo -e $tcLtG " * Диски : sda1 $SDA1OST / $SDA1SIZE | sdb1 $SDB1OST / $SDB1SIZE"
echo -e $tcLtG " Исп. / Всего : sdc1 $SDC1OST / $SDC1SIZE | sdd1 $SDD1OST / $SDD1SIZE"
echo -e $tcDkG "==============================================================="
echo -e $tcRESET ""
#
```
Делаем файл исполняемым
```bash
sudo chmod +x /etc/profile.d/ssh-info.sh
```
После перезагрузки видим, что-то типа:
![Пример приветствия](images/greeting.png)
5) Информация о доступных обновлениях
В Ubuntu за это отвечает пакет `update-notifier`, но в Debian он считается устаревшим и исключен из репозиториев
Пока решение не найдено

Binary file not shown.

View File

@ -0,0 +1,94 @@
#### Статический маршрут (Static route)
**На Raspberry PI, чтобы маршрут сохранился после рестарта, его необходимо добавлять в эту папку `/lib/dhcpcd/dhcpcd-hooks/`. Подробнее в отдельной заметке**
Добавить маршрут можно используя route или через ip ro. Он будет сохранен до следующей перезагрузки
**синтаксис route**
```bash
route add [-net|-host] <IP/Net> netmask gw <Gateway IP> dev <Int>X
```
Пример:
```bash
route add -net 192.168.2.0 netmask 255.255.255.0 gw 192.168.0.1
route add -net 192.168.2.0/24 gw 192.168.0.1
route add -host 192.168.3.158 gw 192.168.0.1
```
**синтаксис ip ro**
```bash
ip route add <IP/Net> via <Gateway IP>
```
Все параметры можно посмотреть ip route help
Пример:
```bash
ip ro add 192.168.2.0/24 via 192.168.0.1
ip ro add 192.168.3.159/32 via 192.168.0.1
```
_в команде ip можно использовать сокращенный синтаксис ip ro … в место ip route …_
Для удаления статического маршрута используйте **del** вместо **add**
Добавить маршрут по умолчанию
```bash
ip route add default via 10.7.0.1 dev enp1s0
```
маршрут через 10.7.0.1(допустим наш роутер) через интерфейс с именем enp1s0
**Как сохранить статический маршрут**
_Все эти маршруты будут добавлены в память и сохранятся до перезагрузки. Если необходимо, добавлять маршруты при загрузке системы, необходимо прописать их в файл конфигурации интерфейсов (для ubuntu и debian). `/etc/network/interfaces`_
Добавим в конец файла следующую сточку:
```bash
up ip ro add 192.168.2.0/24 via 192.168.0.1
```
пример файла конфигурации.
```bash
root@linux:~# cat /etc/network/interfaces
```
```
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto eth0
iface eth0 inet static
address 172.16.0.69
netmask 255.255.255.0
network 172.16.0.0
broadcast 172.16.0.255
gateway 172.16.0.1
# dns-* options are implemented by the resolvconf package, if installed
dns-nameservers 172.16.0.1 172.16.0.3
#static route
up ip ro add 192.168.0.0/16 via 172.16.0.2
```
**Как посмотреть маршруты в системе**
```bash
root@linux:~# netstat -rn
```
```
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 172.16.0.1 0.0.0.0 UG 0 0 0 eth0
172.16.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
192.168.0.0 172.16.0.2 255.255.0.0 UG 0 0 0 eth0
```
```bash
root@linux:~# ip ro sh
```
```
default via 172.16.0.1 dev eth0
172.16.0.0/24 dev eth0 proto kernel scope link src 172.16.0.69
192.168.0.0/16 via 172.16.0.2 dev eth0
```
или ещё короче
```bash
root@linux:~# ip r s
```
```
default via 172.16.0.1 dev eth0
172.16.0.0/24 dev eth0 proto kernel scope link src 172.16.0.69
192.168.0.0/16 via 172.16.0.2 dev eth0
```

View File

@ -0,0 +1,79 @@
### Уменьшение размера образа .img
При создании образа SD-карты с помощью стандартной утилиты Диски в Linux Mint, образ получается размером равным размеру SD-карты вне зависимости от занятого места на ней. Таким образом, восстановить этот образ на диск меньшего размера не получится. Необходимо привести размер образа максимально к приближенному значению занятого в нем места.
*это перевод англоязычной инструкции. Работоспособность метода проверена на себе.*
*Используемая ОС - Debian based*
1. Создать loopback device (как это корректно перевести не понял - устройство петли?)
Включим создание петли
```bash
sudo modprobe loop
```
Создадим новый (пустой) `loopback device`
```bash
sudo losetup -f
```
команда вернет путь к устройству
```bash
/dev/loop0
```
Подключаем наш образ к созданному устройству
```bash
sudo losetup /dev/loop0 myimage.img
```
Чтобы получить доступ к разделам, которые есть в образе, нужно сказать ядру ​​загрузить и их
```bash
sudo partprobe /dev/loop0
```
2. Уменьшение размера раздела в образе
После создания `loopback device` в стандартном приложении Диски (Linux Mint) появится новый диск.
Чтобы изменить размер раздела в образе нужно: выбрать нужный раздел -> нажать шестеренку ниже -> в выпадающем меню выбрать пункт *Изменить размер*
Эту же процедуру можно выполнить с помощью **Gparted**, но при запуске приложения `loopback device` будет отсутствовать в списке доступных дисков. Gparted нужно запускать явно указав на устройство
```bash
sudo gparted /dev/loop0
```
После изменения размера образа loopback-устройство нам больше не нужно, отключим его
```bash
sudo losetup -d /dev/loop0
```
3. Уменьшение размера образа
*уменьшение раздела никак не повлияло на размер самого образа, в нем появилось свободное место*
Теперь нужно удалить ненужное свободное место в образе.
*узнаем где оно начинается*
```bash
fdisk -l myimage.img
```
*увидим нечто подобное*
```bash
Disk myimage.img: 6144 MB, 6144000000 bytes, 12000000 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000ea37d
Device Boot Start End Blocks Id System
myimage.img1 2048 9181183 4589568 b W95 FAT32
```
_Обратите внимание на две вещи в выводе:
Раздел заканчивается на блоке 9181183 (End).
Размер блока составляет 512 байт (Units = sectors of 1 * 512 = 512 bytes)._
Теперь уменьшаем файл образа до размера, содержащего данные. С помощью команды *truncate* необходимо указать размер файла в байтах. Последний блок был *9181183*, а номера блоков начинались с *0*. Это означает, что нам нужно **(9181183 + 1) * 512** байт. **Это важно, иначе раздел не поместится в образ.**
```bash
truncate --size=$[(9181183+1)*512] myimage.img
```
Если *truncate* по какой-то причине не доступна, можно с помощью *dd* создать новый образ на основе нашего, скопировав в него только необходимые нам сектора (мы их вычислили)
`(9181183+1)*512 (размер сектора) = 4700766208 байт`
`4700766208 / 1024 / 1024 = 4483 Мб` (обязательно округляем в большую сторону)
*образ можно сразу сжать при создании*
```bash
sudo dd if=myimage.img bs=1M count=2578 conv=noerror,sync | gzip -c > /$HOME/Backup/image.img.gz
```
4. Восстановление образа
если образ создавали без сжатия
```bash
sudo dd if=$HOME/Backup/image.img of=/dev/sdb bs=1M conv=noerror,sync status=progress
```
если создавали со сжатием
```bash
gunzip -c $HOME/Backup/image.img.gz | sudo dd of=/dev/sdb conv=noerror,sync status=progress
```

View File

@ -0,0 +1,27 @@
### Как добавить команды в автозапуск Linux (Debian 10 Buster)?
Самый простой способ - добавить команду(ы) в `/etc/rc.local`. В Debian 10 Buster файл `/etc/rc.local` хоть и не создан, но как сервис зарегистрирован, соответственно его надо просто создать и активировать сервис:
```bash
su -
mount -o rw,remount /
vi /etc/rc.local
```
добавить в файл необходимые команды и/или ссылки на пользовательские исполняемые скрипты
```bash
#!/bin/sh -e
# команды,
# которые
# необходимо добавить в автозапуск
# или абсолютные пути до пользовательских исполняемых скриптов
exit 0
```
сделать файл исполняемым и включить сервис
```bash
chmod +x /etc/rc.local
systemctl enable rc-local
systemctl start rc-local.service
```

View File

@ -0,0 +1,23 @@
Если заливаем/удаляем файлы мимо web интерфейса или приложения, в базе данных нет сведений об изменении структуры файлов. Нужно провести индексацию. Это можно сделать встроенной в Nextcloud утилитой occ.
Переходим в папку с установленным Nextcloud
```bash
cd /var/www/nc
```
И запускаем команду индексирования
```bash
sudo -u www-data php occ files:scan --all
```
или указывая полный путь
```bash
sudo -u www-data php /var/www/nc/occ files:scan --all
```
в настройках nextcloud по адресу
`/var/www/nextcloud/config/config.php`
добавим строку
`'filesystem_check_changes' => 1,`

View File

@ -0,0 +1,15 @@
чтобы корректно работали почтовые уведомления с домена da2001.ru
с обслуживанием на Яндекс.почте, в настройках необходимо указать следующее:
адрес почтового сервера — smtp.yandex.ru;
защита соединения — SSL;
порт — 587 (через 465 порт уведомления не приходят)
Для доступа к почтовому серверу укажите ваш логин и пароль на Яндексе
(или пароль приложения, если вы включили двухфакторную аутентификацию).
Если вы настраиваете получение почты с ящика вида «login@yandex.ru»,
логином является часть адреса до знака «@». Если вы используете Яндекс.Почту
для домена, в качестве логина необходимо указывать
полный адрес почтового ящика.