commit 0a6b63b4e6e34349cdd645db86d2e068949eeb1f Author: Долгий Артём Date: Sat May 7 22:12:11 2022 +0300 init diff --git a/Markdown.docx b/Markdown.docx new file mode 100644 index 0000000..090a4d3 Binary files /dev/null and b/Markdown.docx differ diff --git a/Markdown.pdf b/Markdown.pdf new file mode 100644 index 0000000..e70cdfb Binary files /dev/null and b/Markdown.pdf differ diff --git a/OnlyOffice.md b/OnlyOffice.md new file mode 100644 index 0000000..70343ff --- /dev/null +++ b/OnlyOffice.md @@ -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 + diff --git a/Proxmox/Proxmox Cloud-Init Support.md b/Proxmox/Proxmox Cloud-Init Support.md new file mode 100644 index 0000000..e964e1d --- /dev/null +++ b/Proxmox/Proxmox Cloud-Init Support.md @@ -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 +``` \ No newline at end of file diff --git a/Proxmox/Proxmox to KVM.md b/Proxmox/Proxmox to KVM.md new file mode 100644 index 0000000..98ca905 --- /dev/null +++ b/Proxmox/Proxmox to KVM.md @@ -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` в качестве загрузочного диска diff --git a/Proxmox/Proxmox_add_hdd_to_vm.md b/Proxmox/Proxmox_add_hdd_to_vm.md new file mode 100644 index 0000000..e0485ee --- /dev/null +++ b/Proxmox/Proxmox_add_hdd_to_vm.md @@ -0,0 +1,91 @@ +### Proxmox, подключение физического жесткого диска в виртуальную машину + +1. В общем случае это можно сделать одной простой командой: +``` +qm set -[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 +``` \ No newline at end of file diff --git a/Proxmox/proxmox_iso_path.md b/Proxmox/proxmox_iso_path.md new file mode 100644 index 0000000..a7a7eb8 --- /dev/null +++ b/Proxmox/proxmox_iso_path.md @@ -0,0 +1,4 @@ +**образы iso по-умолчанию лежат в папке** +``` +/var/lib/vz/template/iso +``` \ No newline at end of file diff --git a/Proxmox/Настройка Proxmox 6.docx b/Proxmox/Настройка Proxmox 6.docx new file mode 100644 index 0000000..96909db Binary files /dev/null and b/Proxmox/Настройка Proxmox 6.docx differ diff --git a/Proxmox/Настройка Proxmox 6.pdf b/Proxmox/Настройка Proxmox 6.pdf new file mode 100755 index 0000000..d221ed2 Binary files /dev/null and b/Proxmox/Настройка Proxmox 6.pdf differ diff --git a/alias.md b/alias.md new file mode 100644 index 0000000..a04f56b --- /dev/null +++ b/alias.md @@ -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 +``` + +[⬆ Наверх](#содержание) diff --git a/ansible.md b/ansible.md new file mode 100644 index 0000000..79fb695 --- /dev/null +++ b/ansible.md @@ -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 +``` diff --git a/atom_default_file_type.md b/atom_default_file_type.md new file mode 100644 index 0000000..949d437 --- /dev/null +++ b/atom_default_file_type.md @@ -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'` diff --git a/autofs.md b/autofs.md new file mode 100644 index 0000000..29f9230 --- /dev/null +++ b/autofs.md @@ -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` + diff --git a/autofs_dnas.md b/autofs_dnas.md new file mode 100644 index 0000000..08f1f50 --- /dev/null +++ b/autofs_dnas.md @@ -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 +``` \ No newline at end of file diff --git a/certbot.md b/certbot.md new file mode 100644 index 0000000..c0191f0 --- /dev/null +++ b/certbot.md @@ -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 сертификатов пока решил отказаться. diff --git a/dnsmasq_sample_conf.conf b/dnsmasq_sample_conf.conf new file mode 100644 index 0000000..23bd58b --- /dev/null +++ b/dnsmasq_sample_conf.conf @@ -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. diff --git a/docker.md b/docker.md new file mode 100644 index 0000000..ac0f7a2 --- /dev/null +++ b/docker.md @@ -0,0 +1,1486 @@ +###### top +## Docker - справка + +*** + +[Базовые понятия Docker](#part1) +- [Управление контейнерами](#chapter1) +- [Логи и статистика работы](#chapter2) +- [Команды в контейнере](#chapter3) + +[Docker image](#part2) +- [Общие данные](#chapter4) +- [Dockerfile](#chapter5) +- [Создание образа](#chapter6) + +[Сеть в Docker](#part3) +- [Устройство сети](#chapter7) +- [Драйвер bridge](#chapter8) +- [Проброс портов](#chapter9) +- [Драйвера host и null](#chapter10) +- [DNS](#chapter11) + +[Docker volumes](#part4) +- [Устройство и типы volumes](#chapter12) +- [Использование volumes](#chapter13) +- [Volume в Dockerfile](#chapter14) +- [bind mounts](#chapter15) +- [tmpfs](#chapter16) +- [Копирование данных](#chapter17) + +[Docker compose](#part5) +- [YAML](#chapter18) +- [Простой конфиг](#chapter19) +- [Профили](#chapter20) +- [Запуск отдельных сервисов](#chapter21) +- [Переменные окружения](#chapter22) +- [Объединение конфигураций](#chapter23) +- [](#chapter24) +- [](#chapter25) +- [](#chapter26) +- [](#chapter27) +- [](#chapter28) +- [](#chapter29) +- [](#chapter30) + +*** + +`docker --help` + +*** + +###### part1 +## Базовые понятия Docker +[вверх](#top) + +###### Chapter1 +### Управление контейнерами + +`docker run nginx` - создать и запустить контейнер из образа nginx, если образа нет локально, образ будет скачан из репозитория. +`docker run --name my-nginx -d nginx` - создать и запустить контейнер с указанным именем `--name my-nginx`; в фоновом процессе `-d` - detach; из образа nginx +*кроме этого есть команды:* +`create` - создать контейнер, не запуская +`start`, `stop`, `pause` + +`docker ps` - показать все запущенные контейнеры +`docker ps -a` - показать все контейнеры, в том числе остановленные + +`docker rm nginx` - удалить остановленный контейнер с именем nginx +`docker rm -f nginx` - удалить контейнер с именем nginx принудительно, даже если он запущен +`docker container prune` - удалить все остановленные контейнеры + +[вверх](#top) + +*** + +###### Chapter2 +### Логи и статистика работы + +`docker stats` - статистика по используемым ресурсам запущенных контейнеров +```bash +CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS +6ed9807997de my-web 0.00% 3.348MiB / 1.941GiB 0.17% 1.22kB / 0B 0B / 16.4kB 3 +08d3dc4c1595 mongo 0.22% 147.2MiB / 1.941GiB 7.41% 1.51kB / 0B 3.1MB / 43.9MB 33 +^C +``` + +`docker inspect` - информация о контейнере или локальном образе +*можно получить выдержку из состояния, использовав ключ `-f` - format* +```bash +da2001@us:~$ docker inspect my-web -f '{{.State.Status}}' +running +``` + +***форматирование и фильтрация вывода доступна во многих командах, например*** +```bash +da2001@us:~$ docker inspect --help + +Usage: docker inspect [OPTIONS] NAME|ID [NAME|ID...] + +Return low-level information on Docker objects + +Options: + -f, --format string Format the output using the given Go template + -s, --size Display total file sizes if the type is container + --type string Return JSON for specified type +``` +*или* +```bash +da2001@us:~$ docker ps --help + +Usage: docker ps [OPTIONS] + +List containers + +Options: + -a, --all Show all containers (default shows just running) + -f, --filter filter Filter output based on conditions provided + --format string Pretty-print containers using a Go template + -n, --last int Show n last created containers (includes all states) (default -1) + -l, --latest Show the latest created container (includes all states) + --no-trunc Don't truncate output + -q, --quiet Only display container IDs + -s, --size Display total file sizes +``` + +```bash +da2001@us:~$ docker ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +6ed9807997de nginx "/docker-entrypoint.…" 5 seconds ago Up 3 seconds 80/tcp my-web +08d3dc4c1595 mongo "docker-entrypoint.s…" About an hour ago Up About an hour 27017/tcp mongo +``` + +```bash +da2001@us:~$ docker ps --filter +ancestor= exited= health= is-task= name= publish= status= +before= expose= id= label= network= since= volume= +``` + +```bash +da2001@us:~$ docker ps --filter name=my-web +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +6ed9807997de nginx "/docker-entrypoint.…" About an hour ago Up About an hour 80/tcp my-web +``` + +**Логи** +`docker logs my-web` - показать логи контейнера +`docker logs my-web | grep 'default.conf'` - вывести логи и отфильтровать по сочетанию `default.conf` +`docker logs my-web | grep 'default.conf' -A 2` - строка соответствующая сочетанию `default.conf` + 2 строки после +`docker logs my-web | grep 'default.conf' -B 2` - строка соответствующая сочетанию `default.conf` + 2 строки перед +`docker logs my-web -f` - отображать логи в реальном времени + +[вверх](#top) + +*** + +###### Chapter3 +### Команды в контейнере + +```bash +da2001@us:~$ docker exec --help + +Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...] + +Run a command in a running container + +Options: + -d, --detach Detached mode: run command in the background + --detach-keys string Override the key sequence for detaching a container + -e, --env list Set environment variables + --env-file list Read in a file of environment variables + -i, --interactive Keep STDIN open even if not attached + --privileged Give extended privileges to the command + -t, --tty Allocate a pseudo-TTY + -u, --user string Username or UID (format: [:]) + -w, --workdir string Working directory inside the container +``` + +*В контейнере `mongo` перейти в директорию `/root` и выполнить команду `pwd`* +```bash +da2001@us:~$ docker exec -w /root mongo pwd +/root +``` + +*Задать переменную в контейнере и вывести список всех переменных окружения, доступных в контейнере* +```bash +da2001@us:~$ docker exec -e MYVAR=1 mongo printenv +PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin +HOSTNAME=08d3dc4c1595 +GOSU_VERSION=1.12 +JSYAML_VERSION=3.13.1 +MONGO_PACKAGE=mongodb-org +MONGO_REPO=repo.mongodb.org +MONGO_MAJOR=5.0 +MONGO_VERSION=5.0.3 +MYVAR=1 +HOME=/root +``` + +*Покдлючиться к оболочке контейнера в интерактивном режиме* +```bash +da2001@us:~$ docker exec -it mongo bash +root@08d3dc4c1595:/# +``` + +*Выполнить в контейнере команду `mongo --version`* +```bash +da2001@us:~$ docker exec mongo mongo --version +MongoDB shell version v5.0.3 +Build Info: { + "version": "5.0.3", + "gitVersion": "657fea5a61a74d7a79df7aff8e4bcf0bc742b748", + "openSSLVersion": "OpenSSL 1.1.1f 31 Mar 2020", + "modules": [], + "allocator": "tcmalloc", + "environment": { + "distmod": "ubuntu2004", + "distarch": "x86_64", + "target_arch": "x86_64" + } +} +``` + +`docker exec mongo mongo --version > ver.txt` - перенаправить вывод в файл на хосте +`docker exec mongo bash -c 'mongo --version > ver.txt'` - перенаправить вывод в файл в контейнере + +[вверх](#top) + +*** + +###### part2 +## Docker image +[вверх](#top) + +###### Chapter4 +### Общие данные + +`docker image --help` +`docker images` - показать скачанные образы +`docker save --output nginx.tar nginx` - сохранить образ в текущую директорию +`docker image import --help` - импорт ранее сохранённого образа +`docker history nginx` - информация о создании образа +`docker inspect nginx` - информация об образе + +`docker pull nginx` - скачать образ nginx не запуская контейнер +`docker push --help` - опубликовать созданный образ во внешнем реестре образов + +*`ls` - аналог `docker images`* +```bash +da2001@us:~$ docker image ls +REPOSITORY TAG IMAGE ID CREATED SIZE +mongo latest fefd78e9381a 12 days ago 699MB +nginx latest 87a94228f133 2 weeks ago 133MB +``` + +*вывести определённую колонку, название колонки с **большой** буквы* +```bash +da2001@us:~$ docker image ls --format {{.Tag}} +latest +latest +``` +```bash +da2001@us:~$ docker image ls --format {{.Repository}} +mongo +nginx +``` + +*если образов много, вывод можно отфильтровать* +```bash +da2001@us:~$ docker image ls --filter +before= dangling= label= reference= since= +``` + +`docker image rm hello-world` - удалить образ +`docker rmi hello-world` - удалить образ +`docker image rm hello-world -f` - удалить образ даже если его использует какой-то контейнер, контейнер удалён НЕ будет +`docker image prune` - удалить все образы без тега + +[вверх](#top) + +*** + +###### Chapter5 +### Dockerfile + +`FROM ubuntu:20.04` - установит базовый образ, на основе которого будет создаваться текущий образ. Если тег `20.04` не указан, будет использован образ `latest` +`LABEL ENV=”DEVELOPMENT”` - пара ключ-значение, используемая для указания метаданных информации образа +`RUN apt-get update` +`RUN apt-get install tomcat` - используется для выполнения команды на базовом образе и создает новый слой +`CMD [“java”, “-jar”, “app.jar”]` - используется для задания команды, которая будет выполняться первой при запуске контейнера +`EXPOSE 8080` - откроет порт для доступа к контейнеру. Контейнер будет прослушивать этот сетевой порт +`MAINTAINER devops@admin.in` - предоставит подробную информацию об авторе, который создал этот образ +`ENV DB_NAME=”MySQL”` +`ENV DB_VERSION=”8.0”` - используется для установки переменных среды в паре ключ-значение. Эти переменные устанавливаются во время сборки образа и доступны после создания контейнера +`COPY /target/devops.jar devops.jar` - используется для копирования локальных файлов в контейнер +`ADD devops.tar.xz / .` +`ADD http://example.com/abc.git /usr/local/devops/` - работает так же, как COPY, но имеет некоторые дополнительные функции, такие например, что мы можем извлечь локальный tar и добавить удаленный URL +`ENTRYPOINT [“java”, “-jar”, “app.jar”]` - используется для установки основной команды для образа. Он работает так же, как инструкция CMD. Разница между CMD и ENTRYPOINT в том, что инструкции не перезаписываются в ENTRYPOINT +`VOLUME /app/devops` - создает точку монтирования с указанным именем +`USER [:]` +`USER [:]` - устанавливает имя пользователя и группу пользователей при запуске образа +`WORKDIR /var/lib/` - установит рабочий каталог. Он создаст каталог, если его нет + +[вверх](#top) + +*** + +###### Chapter6 +### Создание образа + +`docker build --help` + +*Пример сборки образа* +```bash +docker build -f ./apps/api/Dockerfile -t test:latest . +``` +`-f` - указать путь к Dockerfile, если он не в текущей директории +`-t` - указать имя образа с тегом, если тег не будет указан, по-умолчанию присвоится `:latest` +`.` - брать контекст для образа из текущей директории + +[вверх](#top) + +*** + +###### part3 +## Сеть в Docker +[вверх](#top) + +- `bridge` мост — это сетевой драйвер по умолчанию. Бридж сеть используется, когда приложения запускаются в автономных контейнерах, которые должны взаимодействовать между собой (Наглядный пример Nginx + MySQL); + +- `host` хост — это сетевой драйвер для автономных контейнеров (удаленная сетевая изоляция между контейнером и Docker хостом). Данный драйвер доступен только для docker-swarm; + +- `overlay/overlay2` оверлей (наложенная сеть), — это сетевой драйвер для соединения нескольких демонов Docker между собой и которые позволяют docker-swarm службам взаимодействовать друг с другом. Также можно использовать оверлейные сети для облегчения связи между docker-swarm и автономным контейнером или между двумя отдельными контейнерами на разных Docker демонах. Эта стратегия устраняет необходимость выполнения маршрутизации на уровне ОС между этими контейнерами; + +- `macvlan` маквлан — это сетевой драйвер, который позволяют назначать MAC-адрес контейнеру, делая его отображаемым как физическое устройство в сети. Docker демон направляет трафик на контейнеры по их MAC-адресам. Использование macvlan драйвера иногда является лучшим выбором при работе с устаревшими приложениями, которые ожидают, что они будут напрямую подключены к физической сети; + +- `none` — это сетевой драйвер, который умеет отключать всю сеть для контейнеров. Обычно используется в сочетании с пользовательским сетевым драйвером; + +- `Network plugins` — кроме этого, можно установить и использовать сторонние сетевые плагины с Docker контейнерами. Эти плагины доступны в Docker Store или у сторонних поставщиков услуг. + +###### Chapter7 +### Устройство сети + +```bash +Usage: docker network COMMAND + +Manage networks + +Commands: + connect Connect a container to a network + create Create a network + disconnect Disconnect a container from a network + inspect Display detailed information on one or more networks + ls List networks + prune Remove all unused networks + rm Remove one or more networks +``` + +*Отобразить имеющиеся сети* +```bash +da2001@us:~$ docker network ls +NETWORK ID NAME DRIVER SCOPE +222826f8b512 bridge bridge local +5f64c40ea352 host host local +79350884305f none null local +``` + +*Создать сеть типа `bridge` с именем `br2`* +```bash +da2001@us:~$ docker network create br2 +40ff1259ca7e103736c74da0309d6fde5d8439d6844d6f5997b216912d05a705 +``` +или +```bash +da2001@us:~$ docker network create --driver=bridge br2 +``` + +По-умолчанию, всегда создаётся мост +```bash +da2001@us:~$ docker network ls +NETWORK ID NAME DRIVER SCOPE +40ff1259ca7e br2 bridge local +222826f8b512 bridge bridge local +5f64c40ea352 host host local +79350884305f none null local +``` + +*пример создания оверлей-сети* +```bash +da2001@us:~$ docker network create --driver overlay overlay-net +``` +для создания оверлей-сети необходимо активировать docker-swarm + +[вверх](#top) + +*** + +###### Chapter8 +### Драйвер bridge + +Сеть с драйвером bridge создаётся по-умолчанию. +Контейнеры, использующие одну сеть могут видеть друг друга по выделенному им IP адресу. +Посмотреть детальную информацию о сети можно с помощью команды `inspect` +```bash +da2001@us:~$ docker network inspect bridge +[ + { + "Name": "bridge", + "Id": "222826f8b512e0803fc5d6fa26c443af23908be03f46b15f41d1a932557a9df5", + "Created": "2021-10-29T15:30:59.140332733+03:00", + "Scope": "local", + "Driver": "bridge", + "EnableIPv6": false, + "IPAM": { + "Driver": "default", + "Options": null, + "Config": [ + { + "Subnet": "172.17.0.0/16", + "Gateway": "172.17.0.1" + } + ] + }, + "Internal": false, + "Attachable": false, + "Ingress": false, + "ConfigFrom": { + "Network": "" + }, + "ConfigOnly": false, + "Containers": { + "08d3dc4c15953ed7a25e629b983ecba977ed64f73bf3d138943bb12e644c463b": { + "Name": "mongo", + "EndpointID": "f24d0dfbe08458bc7c7c5ca31cec04832c00e3ba062f18757277033754d4e4bb", + "MacAddress": "02:42:ac:11:00:03", + "IPv4Address": "172.17.0.3/16", + "IPv6Address": "" + }, + "56e21d5c7bbdf562e75a5ee614e43648273e9960bc72678285a02863c46b2061": { + "Name": "node-1", + "EndpointID": "788fcfc6ce612363128d7b3d8c16fd259ea0bd84c0114702fefb64ec739161d6", + "MacAddress": "02:42:ac:11:00:04", + "IPv4Address": "172.17.0.4/16", + "IPv6Address": "" + }, + "6ed9807997de2bed3d6f2aeafc2fca5f2d843a55e10b1611e7f5e474f2be473d": { + "Name": "my-web", + "EndpointID": "a7d5032f4ea38edb0cf7f6f3ecbed7eada2e0cf9184dfb5c393b67cfb6f72c57", + "MacAddress": "02:42:ac:11:00:02", + "IPv4Address": "172.17.0.2/16", + "IPv6Address": "" + }, + "f4331c7520ba749fbdf33d98c1fcb5284a2df63e510f841e7dcd655878c43941": { + "Name": "node-2", + "EndpointID": "82baf3a4d8fcddd3538b86cf3237e710b53d9975a78ec98a07e3055fb7ee80a8", + "MacAddress": "02:42:ac:11:00:05", + "IPv4Address": "172.17.0.5/16", + "IPv6Address": "" + } + }, + "Options": { + "com.docker.network.bridge.default_bridge": "true", + "com.docker.network.bridge.enable_icc": "true", + "com.docker.network.bridge.enable_ip_masquerade": "true", + "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", + "com.docker.network.bridge.name": "docker0", + "com.docker.network.driver.mtu": "1500" + }, + "Labels": {} + } +] +``` +*в длинном выводе указана вся информация о сети, её адресации и контейнерах, которые используют эту сеть.* +***Чтобы контейнеры могли обращаться друг к другу по имени, необходимо создать новую сеть и добавить в неё эти контейнеры*** +```bash +da2001@us:~$ docker network create br2 +40ff1259ca7e103736c74da0309d6fde5d8439d6844d6f5997b216912d05a705 +da2001@us:~/docker-demo-3$ docker run -d --name node-1 demo3 +56e21d5c7bbdf562e75a5ee614e43648273e9960bc72678285a02863c46b2061 +da2001@us:~/docker-demo-3$ docker run -d --name node-2 demo3 +f4331c7520ba749fbdf33d98c1fcb5284a2df63e510f841e7dcd655878c43941 +da2001@us:~/docker-demo-3$ docker network connect br2 node-1 +da2001@us:~/docker-demo-3$ docker network connect br2 node-2 +da2001@us:~/docker-demo-3$ docker network inspect br2 +[ + { + "Name": "br2", + "Id": "40ff1259ca7e103736c74da0309d6fde5d8439d6844d6f5997b216912d05a705", + "Created": "2021-10-31T11:20:50.595291142+03:00", + "Scope": "local", + "Driver": "bridge", + "EnableIPv6": false, + "IPAM": { + "Driver": "default", + "Options": {}, + "Config": [ + { + "Subnet": "172.18.0.0/16", + "Gateway": "172.18.0.1" + } + ] + }, + "Internal": false, + "Attachable": false, + "Ingress": false, + "ConfigFrom": { + "Network": "" + }, + "ConfigOnly": false, + "Containers": { + "56e21d5c7bbdf562e75a5ee614e43648273e9960bc72678285a02863c46b2061": { + "Name": "node-1", + "EndpointID": "9ac4317d24147360565c69e021e4c6bc7a407103c2e6a907475f707f4deed32a", + "MacAddress": "02:42:ac:12:00:02", + "IPv4Address": "172.18.0.2/16", + "IPv6Address": "" + }, + "f4331c7520ba749fbdf33d98c1fcb5284a2df63e510f841e7dcd655878c43941": { + "Name": "node-2", + "EndpointID": "3e41fd9618f71446878a7c585d9289bc4a099c7c15f8cf835084c0015c87ed54", + "MacAddress": "02:42:ac:12:00:03", + "IPv4Address": "172.18.0.3/16", + "IPv6Address": "" + } + }, + "Options": {}, + "Labels": {} + } +] +``` +*из вывода видно, что к сети br2 подключено 2 контейнера: node-1(172.18.0.2) и node-2(172.18.0.3)* +*подключимся к node-1 и попробуем пинговать node-2* +```bash +da2001@us:~$ docker exec -it node-1 sh +/opt/app # ip a +1: lo: mtu 65536 qdisc noqueue state UNKNOWN qlen 1000 + link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 + inet 127.0.0.1/8 scope host lo + valid_lft forever preferred_lft forever +11: eth0@if12: mtu 1500 qdisc noqueue state UP + link/ether 02:42:ac:11:00:04 brd ff:ff:ff:ff:ff:ff + inet 172.17.0.4/16 brd 172.17.255.255 scope global eth0 + valid_lft forever preferred_lft forever +15: eth1@if16: mtu 1500 qdisc noqueue state UP + link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff + inet 172.18.0.2/16 brd 172.18.255.255 scope global eth1 + valid_lft forever preferred_lft forever +/opt/app # ping 172.17.0.5 +PING 172.17.0.5 (172.17.0.5): 56 data bytes +64 bytes from 172.17.0.5: seq=0 ttl=64 time=0.099 ms +64 bytes from 172.17.0.5: seq=1 ttl=64 time=0.065 ms +64 bytes from 172.17.0.5: seq=2 ttl=64 time=0.058 ms +64 bytes from 172.17.0.5: seq=3 ttl=64 time=0.058 ms +^C64 bytes from 172.17.0.5: seq=4 ttl=64 time=0.060 ms +64 bytes from 172.17.0.5: seq=5 ttl=64 time=0.057 ms +^C +--- 172.17.0.5 ping statistics --- +6 packets transmitted, 6 packets received, 0% packet loss +round-trip min/avg/max = 0.057/0.066/0.099 ms +/opt/app # ping node-2 +PING node-2 (172.18.0.3): 56 data bytes +64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.060 ms +64 bytes from 172.18.0.3: seq=1 ttl=64 time=0.061 ms +64 bytes from 172.18.0.3: seq=2 ttl=64 time=0.061 ms +64 bytes from 172.18.0.3: seq=3 ttl=64 time=0.067 ms +64 bytes from 172.18.0.3: seq=4 ttl=64 time=0.062 ms +^C +--- node-2 ping statistics --- +5 packets transmitted, 5 packets received, 0% packet loss +round-trip min/avg/max = 0.060/0.062/0.067 ms +/opt/app # +``` + +*контейнер можно создавать сразу с подключением к необходимоу сети* +```bash +da2001@us:~$ docker run -d --name node-3 --network br2 demo3 +daa1712392be54aa26b8f14365d3a9cdfa13cf19ad0524afe1db352d9c3e4e77 +``` + +[вверх](#top) + +*** + +###### Chapter9 +### Проброс портов + +Для взаимодействия с приложениями внутри контейнеров из хост системы необходимо выполнить проброс портов в контейнер +```bash +da2001@us:~$ docker run -d --name node-4 --network br2 -p 2000:3000 demo3 +25dfcaa0e29e7e99f2e93b45dbdbd3268b9781998215343323afceaeefff8c72 +``` +порт 2000 хоста пробросили на порт 3000 контейнера +```bash +da2001@us:~$ docker ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +25dfcaa0e29e demo3 "docker-entrypoint.s…" 2 minutes ago Up About a minute 0.0.0.0:2000->3000/tcp, :::2000->3000/tcp node-4 +``` +*теперь с хоста к контейнеру можно обратиться на порт 2000* +```bash +da2001@us:~$ curl localhost:2000 +{"eth0":["172.18.0.5"]} +``` +*при этом, порт 3000 дотсупен не будет* +```bash +da2001@us:~$ curl localhost:3000 +curl: (7) Failed to connect to localhost port 3000: Connection refused +``` + +[вверх](#top) + +*** + +###### Chapter10 +### Драйвера host и null + +Если дополнительный слой абстракции в виде сети внутри контейнера не нужен, можно создать контейнер с сетью `host`, тогда у контейнера будет IP адрес сети docker0 хоста +```bash +da2001@us:~$ docker run -d --name node-5 --network host demo3 +e7ea1e790aca5e122883e994e836fae835e8b9f4bd0c02acbc0a691ed7a5a2bc +``` +*посмотрим IP адрес хоста* +```bash +da2001@us:~$ ip a +1: lo: mtu 65536 qdisc noqueue state UNKNOWN qlen 1000 + link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 + inet 127.0.0.1/8 scope host lo + valid_lft forever preferred_lft forever + inet6 ::1/128 scope host + valid_lft forever preferred_lft forever +2: ens18: mtu 1500 qdisc fq_codel state UP qlen 1000 + link/ether 8e:eb:ab:c6:9b:ff brd ff:ff:ff:ff:ff:ff + inet 192.168.13.254/24 brd 192.168.13.255 scope global dynamic ens18 + valid_lft 328sec preferred_lft 328sec + inet6 fe80::8ceb:abff:fec6:9bff/64 scope link + valid_lft forever preferred_lft forever +3: docker0: mtu 1500 qdisc noqueue state UP + link/ether 02:42:50:59:0e:e1 brd ff:ff:ff:ff:ff:ff + inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 + valid_lft forever preferred_lft forever + inet6 fe80::42:50ff:fe59:ee1/64 scope link + valid_lft forever preferred_lft forever +``` +*подключимся к контейнеру и проверим его IP* +```bash +da2001@us:~$ docker exec -it node-5 sh +/opt/app # ip a +1: lo: mtu 65536 qdisc noqueue state UNKNOWN qlen 1000 + link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 + inet 127.0.0.1/8 scope host lo + valid_lft forever preferred_lft forever + inet6 ::1/128 scope host + valid_lft forever preferred_lft forever +2: ens18: mtu 1500 qdisc fq_codel state UP qlen 1000 + link/ether 8e:eb:ab:c6:9b:ff brd ff:ff:ff:ff:ff:ff + inet 192.168.13.254/24 brd 192.168.13.255 scope global dynamic ens18 + valid_lft 328sec preferred_lft 328sec + inet6 fe80::8ceb:abff:fec6:9bff/64 scope link + valid_lft forever preferred_lft forever +3: docker0: mtu 1500 qdisc noqueue state UP + link/ether 02:42:50:59:0e:e1 brd ff:ff:ff:ff:ff:ff + inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 + valid_lft forever preferred_lft forever + inet6 fe80::42:50ff:fe59:ee1/64 scope link + valid_lft forever preferred_lft forever +``` +***IP адреса на хосте и в контейнере идентичны*** + +Обратная ситуация, когда для работы контейнера сеть не нужна совсем. +*в этом случае необходимо создать контейнер с сетью `none`* +```bash +da2001@us:~$ docker run -d --name node-6 --network none demo3 +9fc34160933654ac7b2ec8ec57c8de9a488de080262d836d3fd97c7ff43d26ac +``` +*подключимся к контейнеру и проверим его сетевые интерфейсы* +```bash +da2001@us:~$ docker exec -it node-6 sh +/opt/app # ip a +1: lo: mtu 65536 qdisc noqueue state UNKNOWN qlen 1000 + link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 + inet 127.0.0.1/8 scope host lo + valid_lft forever preferred_lft forever +``` + +[вверх](#top) + +*** + +###### Chapter11 +### DNS + +Если необходимо в контейнере указать определённый DNS сервер, его можно передать в качестве параметра при создании контейнера +```bash +da2001@us:~$ docker run -d --name node-7 --dns 8.8.8.8 demo3 +8c0e984de40f504f1a747a5c85fed2c8b7b6e8f5e8379a9bbc0da352ad77612d +da2001@us:~$ docker exec -it node-7 sh +/opt/app # cat /etc/resolv.conf +search da2001.ru +nameserver 8.8.8.8 +``` + +[вверх](#top) + +*** + +###### part4 +## Docker volumes +[вверх](#top) + +###### Chapter12 +### Устройство и типы volumes + +- `tmpfs` - данные хранятся внутри контейнера, доступны только в нём и цикл жизни этих данных совпадается с циклом жизни контейнера. Т.е. при остановке/удалении контейнера, данные недоступны; + +- `volumes` - ***тома хранения данных, рекомендуемый разработчиками Docker способ хранения данных***. В Linux тома находятся по умолчанию в `/var/lib/docker/volumes/`. Другие программы не должны получать к ним доступ напрямую, только через контейнер. + * Тома создаются и управляются средствами Docker: командой docker volume create, через указание тома при создании контейнера в Dockerfile или docker-compose.yml. + * В контейнере том видно как обычный каталог, который мы определяем в Dockerfile. Тома могут быть с именами или без — безымянным томам Docker сам присвоит имя. + * Один том может быть примонтирован одновременно в несколько контейнеров. Когда никто не использует том, он не удаляется, а продолжает существовать. Команда для удаления томов: `docker volume prune`. + * Можно выбрать специальный драйвер для тома и хранить данные не на хосте, а на удалённом сервере или в облаке. +*Для чего стоит использовать тома в Docker:* + + шаринг данных между несколькими запущенными контейнерами; + + решение проблемы привязки к ОС хоста; + + удалённое хранение данных; + + бэкап или миграция данных на другой хост с Docker (для этого надо остановить все контейнеры и скопировать содержимое из каталога тома в нужное место). + +- `bind mounts` - монтирование каталога хоста. Более простая концепция: файл или каталог с хоста просто монтируется в контейнер. + +[вверх](#top) + +*** + +###### Chapter13 +### Использование volumes + +```bash +da2001@us:~$ docker volume --help + +Usage: docker volume COMMAND + +Manage volumes + +Commands: + create Create a volume + inspect Display detailed information on one or more volumes + ls List volumes + prune Remove all unused local volumes + rm Remove one or more volumes + +Run 'docker volume COMMAND --help' for more information on a command. +``` + +*Создадим volume с именем demo* +```bash +da2001@us:~$ docker volume create demo +demo +da2001@us:~$ docker volume ls +DRIVER VOLUME NAME +local demo +``` + +```bash +da2001@us:~$ docker volume inspect demo +[ + { + "CreatedAt": "2021-10-31T13:41:28+03:00", + "Driver": "local", + "Labels": {}, + "Mountpoint": "/var/lib/docker/volumes/demo/_data", + "Name": "demo", + "Options": {}, + "Scope": "local" + } +] +``` + +`/var/lib/docker/volumes/demo` - путь к папке с созданным томом на хосте. Данные контейнера будут храниться в папке `_data` + +*сейчас эта папка пуста* +```bash +da2001@us:~$ sudo ls /var/lib/docker/volumes/demo/_data +[sudo] password for da2001: +da2001@us:~$ sudo du -hs /var/lib/docker/volumes/demo/_data +4,0K /var/lib/docker/volumes/demo/_data +``` + +*Создадим 2 контейнера и в качестве аргумента укажем использовать созданный том* +```bash +da2001@us:~$ docker run -d --name web-1 -v demo:/data nginx:alpine +1d0eeceefa56d2a60d4deb3c7dadfcf90b75df42e497c6dbd91546510b33ce6b +da2001@us:~$ docker run -d --name web-2 -v demo:/data nginx:alpine +eb5d5a92157e4bce9c61c8e9735b53217268fa4777354a493dca3765950a93b4 +da2001@us:~$ docker ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +eb5d5a92157e nginx:alpine "/docker-entrypoint.…" 56 seconds ago Up 54 seconds 80/tcp web-2 +1d0eeceefa56 nginx:alpine "/docker-entrypoint.…" About a minute ago Up About a minute 80/tcp web-1 +``` + +*подключимся к контейнеру `web-1` и создадим файл в папке `/data`* +```bash +da2001@us:~$ docker exec -it web-1 sh +/ # echo TEST > /data/file +/ # cat /data/file +TEST +``` + +*проверим наличие файла на хосте* +```bash +da2001@us:~$ sudo cat /var/lib/docker/volumes/demo/_data/file +TEST +``` + +*проверим доступность этого файла в контейнере `web-2` и добавим в этот файл еще одну строку* +```bash +da2001@us:~$ docker exec -it web-2 sh +/ # cat /data/file +TEST +/ # echo TEST from web-2 >> /data/file +``` + +*убедимся, что в контейнере `web-1` в файле также появилась новая строка* +```bash +da2001@us:~$ docker exec -it web-1 sh +/ # cat /data/file +TEST +TEST from web-2 +``` + +*При попытке удалить том, который используется контейнерами, получим ошибку* +```bash +da2001@us:~$ docker volume rm demo +Error response from daemon: remove demo: volume is in use - [1d0eeceefa56d2a60d4deb3c7dadfcf90b75df42e497c6dbd91546510b33ce6b, eb5d5a92157e4bce9c61c8e9735b53217268fa4777354a493dca3765950a93b4] +``` + +*после остановки и удаления контейнеров, том удаляется без ошибок* +```bash +da2001@us:~$ docker stop web-1 web-2 +web-1 +web-2 +da2001@us:~$ docker container prune +WARNING! This will remove all stopped containers. +Are you sure you want to continue? [y/N] y +Deleted Containers: +eb5d5a92157e4bce9c61c8e9735b53217268fa4777354a493dca3765950a93b4 +1d0eeceefa56d2a60d4deb3c7dadfcf90b75df42e497c6dbd91546510b33ce6b + +Total reclaimed space: 2.308kB +da2001@us:~$ docker volume rm demo +demo +``` + +[вверх](#top) + +*** + +###### Chapter14 +### Volume в Dockerfile + +Создадим свой образ на основе официального образа nginx, но добавим в Dockerfile данные о необходимом томе. Создадим том, положим в него тестовую html страницу и примонтируем том к контейнеру. + +1. Создадим Dockerfile +```dockerfile +FROM nginx +WORKDIR /usr/share/nginx/html +VOLUME ["/usr/share/nginx/html"] +EXPOSE 80 +``` +2. Создадим том +```bash +da2001@us:~$ docker volume create web +web +``` +3. Добавим в созданные том тестовую html страницу +```bash +da2001@us:~$ sudo bash -c 'echo "Welcome to static site from volume" > /var/lib/docker/volumes/web/_data/index.html' +``` +4. Создадим образ на основе Dockerfile +```bash +da2001@us:~$ docker build -t my-nginx . +Sending build context to Docker daemon 145.3MB +Step 1/4 : FROM nginx +latest: Pulling from library/nginx +b380bbd43752: Pull complete +fca7e12d1754: Pull complete +745ab57616cb: Pull complete +a4723e260b6f: Pull complete +1c84ebdff681: Pull complete +858292fd2e56: Pull complete +Digest: sha256:644a70516a26004c97d0d85c7fe1d0c3a67ea8ab7ddf4aff193d9f301670cf36 +Status: Downloaded newer image for nginx:latest + ---> 87a94228f133 +Step 2/4 : WORKDIR /usr/share/nginx/html + ---> Running in 3a87fe17392b +Removing intermediate container 3a87fe17392b + ---> 9637854f3611 +Step 3/4 : VOLUME ["/usr/share/nginx/html"] + ---> Running in f332cde38eef +Removing intermediate container f332cde38eef + ---> 75291905e821 +Step 4/4 : EXPOSE 80 + ---> Running in d5faf760b570 +Removing intermediate container d5faf760b570 + ---> f194075a481b +Successfully built f194075a481b +Successfully tagged my-nginx:latest +``` + +```bash +da2001@us:~$ docker images +REPOSITORY TAG IMAGE ID CREATED SIZE +my-nginx latest f194075a481b 7 seconds ago 133MB +nginx latest 87a94228f133 3 weeks ago 133MB +``` +5. Создадим контейнер на основе нового образа +```bash +da2001@us:~$ docker run -d --name web-demo -v web:/usr/share/nginx/html -p 8080:80 my-nginx +97c4b627bd7a7248ffdb33e90a2ec65678a432bb68db9fa16ad27061ae625f59 +``` +6. Теперь убедимся, что том подключился к контейнеру и тестовая html страница доступна из контейнера +```bash +da2001@us:~$ curl localhost:8080 +Welcome to static site from volume +``` + +[вверх](#top) + +*** + +###### Chapter15 +### bind mounts +`bind mounts` - позволяет примонтировать папку/файл из хостовой системы в контейнер + +Пример: создадим в текущей директории хоста папку `html` и положим в неё файл `index.html` +```bash +da2001@us:~$ mkdir html +da2001@us:~$ echo 'Start page from bind mounts' > html/index.html +``` + +Теперь запустим контейнер и примонтируем в него созданную папку +```bash +da2001@us:~$ docker run -d --name web-2 -v /home/da2001/html:/usr/share/nginx/html -p 8080:80 nginx +ddeefdec9653793acb01b2c25ee412fb60a7b5cdb42330d211113c3e299d6c1d +``` + +Проверим работу nginx запущенного контейнера - должна открыться созданная ранее html страница +```bash +da2001@us:~$ curl localhost:8080 +Start page from bind mounts +``` + +[вверх](#top) + +*** + +###### Chapter16 +### tmpfs +`tmpfs` - указанные данные этого типа существуют только пока контейнер работает, после остановки контейнера данные удаляются + +Для монтирования можно использовать 2 вида записи +```bash +da2001@us:~$ docker run -d --name demo --tmpfs /vardir -p 8080:80 nginx +```` +или +```bash +da2001@us:~$ docker run -d --name demo --mount type=tmpfs,dectination=/vardir -p 8080:80 nginx +``` +*второй тип записи применим и для других типов монтирования* + +[вверх](#top) + +*** + +###### Chapter17 +### Копирование данных + +Если возникает необходимость скопировать какие-то данные в контейнер или из него, можно воспользоваться командой `docker cp` + +```bash +da2001@us:~$ docker ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +ddeefdec9653 nginx "/docker-entrypoint.…" 20 minutes ago Up 20 minutes 0.0.0.0:8080->80/tcp, :::8080->80/tcp web-2 +``` + +*скопировать папку html хоста в папку html в контейнере* +```bash +da2001@us:~/html$ docker cp /home/da2001/html web-2:/usr/share/nginx/html +``` +*скопировать содержимое папки html хоста в папку html в контейнере* +```bash +da2001@us:~/html$ docker cp /home/da2001/html/. web-2:/usr/share/nginx/html +``` + +*обратная задача - скопировать данные из контейнера на хост* +``` +da2001@us:~/html$ docker cp web-2:/usr/share/nginx/html /home/da2001/html +``` + +[вверх](#top) + +*** + +###### part5 +## Docker compose +[вверх](#top) + +###### Chapter18 +### YAML + +`yaml` - считается наиболее удобным для восприятия человеком среди подобных форматов: yaml, xml, json. +В основе лежит принцип ключ: значение и отступы для создания структуры подчинённости. +Стандартный размер отступа - 2 пробела. + +```yaml +# comment + +# text +name: test +name2: "test \n" +name3: 'test 234' + + +# digit +age: 35 +version: 2.3 +``` + +Логические значения могут быть заданы тремя равнозначными способами +```yaml +# boolean +isDev: True +isDev2: False + +isDev3: on +isDev4: off + +isDev5: yes +isDev6: no +``` + +Описание объектов +```yaml +user: + name: Василий + age: 25 + position: engineer +``` + +Списки +```yaml +users: + - name: Дмитрий + age: 34 + position: administrator + - name: Анна + age: 24 + position: accountant +``` +*альтернативная запись списков без отступов* +```yaml +users: +- name: Дмитрий + age: 34 + position: administrator +- name: Анна + age: 24 + position: accountant +``` +*списки без ключей* +```yaml +users: + - Николай + - Андрей +``` +*описание списков в виде json* +```yaml +versions: [1.7, 2.3, 'latest'] +``` + +Описание строк +*многострочная строка* +```yaml +multiline: | + Эта строка сохранит своё + форматирование и будет + отображаться в несколько строк +``` +*длинная строка без переноса* +```yaml +singleline: > + Это очень длинная строка, + но она будет отображена без + использования переносов +``` + +Если в рамках одного yaml файла необходимо описать несколько независимых сущностей, их можно отделить друг от друга с помощью `---` + +[вверх](#top) + +*** + +###### Chapter19 +### Пример файла docker-compose.yml + +```yaml +version: '3.1' + +services: + + wordpress: + image: wordpress + restart: always + ports: + - 8080:80 + depends_on: + - db + environment: + WORDPRESS_DB_NAME: wp_db + WORDPRESS_DB_HOST: db + WORDPRESS_DB_USER: db_user + WORDPRESS_DB_PASSWORD: wp_db_pass + + volumes: + ["./:/var/www/html"] + + db: + image: mysql:5.7 + restart: always + environment: + MYSQL_DATABASE: wp_db + MYSQL_USER: db_user + MYSQL_PASSWORD: wp_db_pass + MYSQL_ROOT_PASSWORD: db_root_pass + volumes: + - db:/var/lib/mysql + +volumes: + db: +``` + +Эта конфигурация запустит 2 контенера: mysql и wordpress + +**Разбор параметров** + + `version: '3.1'` - в зависимости от используемой версии, compose может принимать или нет некоторые директивы, также зависит от установленной версии docker + +*Зависимость версии compose от версии docker указана в таблице на сайте с документацией. Также объясняются возможные директивы, которые могут быть описаны в файле docker-compose.yml* + +[*>> документация по compose <<*](https://docs.docker.com/compose/compose-file/compose-file-v3/) + +*Каждая директива может быть описана в краткой и полной форме. Формы записи равнозначны, полная запись может быть проще для восприятия, но длиннее в записи. В данном примере будет рассмотрена краткая форма описания.* + +`services:` - из названия понятно, что в этой секции описаны используемые сервисы. Указаны образы, на основе которых будут запущены контейнеры и параметры запуска: хранилища, сеть, переменные и пр. + +`wordpress:` - произвольное название сервиса, который собираемся запустить + +`image:` - указан образ, на основе которого будет запущен контейнер. Может быть указан с конкретной версией `mysql:5.7`, `wordpress:latest`, так и без указания версии `wordpress`, в этом случае будет подставлен тег `latest` + +`restart:` - опция перезапуска контейнера. Может принимать значения: `"no"`, `always`, `on-failure`, `unless-stopped`. Игнорируется при запуске в swarm. + +`ports:` - проброс портов. В данном примере - на порт 8080 хоста будет проброшен порт 80 контейнера. + +`depends_on:` - зависимость при запуске. Если параметр указан, контейнер этой секции будет запущен после того, который указан в параметре. В данном примере - `wordpress` будет запущен только после успешного запуска `db`. + +`environment:` - переменные, которые необходимо передать в контейнер в формате `ключ: значение`. Необходимые переменные для успешного запуска, обычно указаны на странице описания образа в docker hub. + +`volumes:` - в секции services описывает тома, которые будут использованы в контейнере. В контейнер можно подключить созданный в docker том или выполнить монтирование директории или отдельного файла из хоста. Используется, когда необходимо сохранить данные после остановки/удаления контейнера, например базу данных, конфигурационные файлы, контент сайта и т.д. + +`volumes:` - в отдельной секции описывает название томов, которые необходимо создать посредством docker для использования в контейнерах. + +В данном примере не описано, но часто применяется на практике: + +`networks:` - в секции services описывает сеть, к которой должен подключиться контейнер, если секция указана, её необходимо обязательно создать. +Кроме ситуации, в которой контейнеру запрещается использовать сеть: +```yaml + app: + build: ./app + networks: + - none +``` +или когда используется сеть хоста +```yaml + app: + build: ./app + networks: + - host +``` + +`networks:` - в отдельной секции описывает сети, которые необходимо создать для использования в контейнерах. Для режимов сети без дополнительных плагинов, используются три драйвера: `bridge` - контейнерам выделяются IP адреса из одной подсети, `host` - контейнеры используют сеть хоста, `none` - контейнеры не используют сеть. + +[вверх](#top) + +*** + +###### Chapter20 +### Профили + +Иногда возникают ситуации, когда при запуске compose нет необходимости стартовать все сервисы, например, в целях тестирования или отладки. В таких ситуациях можно создать профили и добавить необходимые сервисы в эти профили. В этом случае, compose можно запускать явно указав какие профили необходимо запустить. +```yaml + wordpress: + image: wordpress + restart: always + ports: + - 8080:80 + profile: + - wordpress_1 +``` +Теперь, чтобы запустить контейнер с указанным профилем, его необходимо явно указать при запуске +```bash +da2001@us:~/wp$ docker-compose --profile wordpress_1 up -d +``` +*этой командой будут запущены контейнеры у которых указан профиль `wordpress_1` и не указан профиль вообще.* + +Если необходимо запустить контейнеры с несколькими профилями, каждый необходимо отдельно указать +```bash +da2001@us:~/wp$ docker-compose --profile wordpress_1 --profile database up -d +``` + +Кроме этого, может встречаться и другая запись, когда перед стартом через запятую передаются все необходимые профили в виде переменных окружения +```bash +da2001@us:~/wp$ COMPOSE_PROFILES=wordpress_1 docker-compose up -d +``` + +Стоит иметь ввиду, если один сервис зависит от другого - указана директива `depends_on`, нужно внимательно использовать профили. Например, если взять предыдущий пример compose и добавить в секцию сервиса `db` профиль, а в секции сервиса `wordpress` профиль указан не будет: +```yaml +services: + + wordpress: + image: wordpress + restart: always + ports: + - 8080:80 + depends_on: + - db + + db: + image: mysql:5.7 + restart: always + profile: + - database +``` +команда `docker-compose up -d` завершится ошибкой, т.к. при таком запуске будут стартовать только контейнеры без указанного профиля, а в этом примере - контейнер без профиля зависит от успешного запуска контейнера с указанным профилем. + +[вверх](#top) + +*** + +###### Chapter21 +### Запуск отдельных сервисов + +При использовании compose можно запустить отдельные сервисы явно указав это в команде запуска +```bash +da2001@us:~/wp$ docker-compose run wordpress -d +``` +*НО, в нашем примере будут запущены оба контейнера, т.к. запуск wordpress зависит от успешного запуска db* + +Кроме этого стоит брать во внимание особенности запуска при использовании профилей. + +[вверх](#top) + +*** + +###### Chapter22 +### Переменные окружения + +Переменные окружения удобно использовать для передачи значений в запускаемые контейнеры, например для указания имён контейнеров или передачи значений имени, пароля, названия базы данных и пр. +По-умолчанию, compose считывает значения из файла `.env`, находящегося в той же директории что и `docker-compose.yml`. +Например: +```bash +da2001@us:~/wp$ cat .env +wp_container_name=wp +db_container_name=db + +db_name=wp_db +db_root_pass=db_root_pass +db_user=db_user +db_pass=wp_db_pass +``` + +```bash +da2001@us:~/wp$ cat docker-compose.yml +version: '3.1' + +services: + + wordpress: + image: wordpress + container_name: "${wp_container_name}" + restart: always + ports: + - 8080:80 + depends_on: + - db + environment: + WORDPRESS_DB_NAME: "${db_name}" + WORDPRESS_DB_HOST: db + WORDPRESS_DB_USER: "${db_user}" + WORDPRESS_DB_PASSWORD: "${db_pass}" + volumes: + - wp:/var/www/html + + db: + image: mysql:5.7 + container_name: "${db_container_name}" + restart: always + environment: + MYSQL_DATABASE: "${db_name}" + MYSQL_USER: "${db_user}" + MYSQL_PASSWORD: "${db_pass}" + MYSQL_ROOT_PASSWORD: "${db_root_pass}" + volumes: + - db:/var/lib/mysql + +volumes: + db: + wp: +``` + +Если файл с описанием переменных называется не `.env`, тогда при запуске compose нужно это явно указать +```bash +da2001@us:~/wp$ docker-compose --env-file .env-web up -d +``` + +Также можно указать для каждого сервиса свой файл с переменными окружения и указать в нём необходимые имена и значения переменных +```bash +da2001@us:~/wp$ cat docker-compose.yml +version: '3.1' + +services: + + wordpress: + image: wordpress + container_name: "${wp_container_name}" + restart: always + ports: + - 8080:80 + depends_on: + - db + env_file: + - .env-wp + volumes: + - wp:/var/www/html + + db: + image: mysql:5.7 + container_name: "${db_container_name}" + restart: always + env_file: + - .env-db + volumes: + - db:/var/lib/mysql + +volumes: + db: + wp: +``` + +Перед запуском compose будет полезным посмотреть верно ли подставились переменные, для этого используется следующая команда: +```bash +docker-compose config +``` +или если указано своё имя для файла с переменными +```bash +docker-compose --env-file .env-web config +``` +в результате на экране будет показан compose с уже подставленными значениями переданных переменных + +[вверх](#top) + +*** + +###### Chapter23 +### Объединение конфигураций + +Описание конфигурации можно разделить на несколько файлов, например для возможности запуска с разными параметрами +`docker-compose.yml` +```yaml +version: '3.1' + +services: + + wordpress: + image: wordpress + restart: always + depends_on: + - db + + volumes: + ["./:/var/www/html"] + + db: + image: mysql:5.7 + restart: always + environment: + MYSQL_DATABASE: wp_db + MYSQL_USER: db_user + MYSQL_PASSWORD: wp_db_pass + MYSQL_ROOT_PASSWORD: db_root_pass + volumes: + - db:/var/lib/mysql + +volumes: + db: +``` + +`docker-compose.wp.yml` +```yaml +version: '3.1' + +services: + + wordpress: + ports: + - 8080:80 + environment: + WORDPRESS_DB_NAME: wp_db + WORDPRESS_DB_HOST: db + WORDPRESS_DB_USER: db_user + WORDPRESS_DB_PASSWORD: wp_db_pass +``` + +Описание проброса портов и переменные перенесли в отдельный файл. Теперь запускать эти контейнеры можем используя как и раньше, но без проброса портов и передачи переменных в контейнер `docker-compose up -d`. + +Так и объединив оба конфигурационных файла для полного запуска +```bash +docker-compose -f docker-compose.yml -f docker-compose.wp.yml up -d +``` + +Также можно добавить ссылку на другой конфиг в самом описании +`docker-compose.yml` +```yaml +version: '3.1' + +services: + + wordpress: + extends: + file: docker-compose.wp.yml + service: wordpress + depends_on: + - db + + db: + image: mysql:5.7 + restart: always + environment: + MYSQL_DATABASE: wp_db + MYSQL_USER: db_user + MYSQL_PASSWORD: wp_db_pass + MYSQL_ROOT_PASSWORD: db_root_pass + volumes: + - db:/var/lib/mysql + +volumes: + db: +``` + +`docker-compose.wp.yml` +```yaml +version: '3.1' + +services: + + wordpress: + image: wordpress + restart: always + ports: + - 8080:80 + environment: + WORDPRESS_DB_NAME: wp_db + WORDPRESS_DB_HOST: db + WORDPRESS_DB_USER: db_user + WORDPRESS_DB_PASSWORD: wp_db_pass + + volumes: + ["./:/var/www/html"] + +``` + +В этом случае перечислять конфигурационные файлы при запуске не нужно. + +[вверх](#top) + +*** + + +```bash +git add . && git commit -m 'mod docker' && git push +``` + diff --git a/git.md b/git.md new file mode 100644 index 0000000..3707846 --- /dev/null +++ b/git.md @@ -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 +``` diff --git a/hostname.md b/hostname.md new file mode 100644 index 0000000..a8e329a --- /dev/null +++ b/hostname.md @@ -0,0 +1,13 @@ +**Изменить имя хоста linux** +**Change hostname linux** + +Чтобы сделать изменения постоянными нужно изменить содержимое двух файлов: `/etc/hostname` и `/etc/hosts` +``` +sudo nano /etc/hostname +``` + +``` +sudo nano /etc/hosts +``` + +Изменения вступят в силу после перезагрузки \ No newline at end of file diff --git a/images/cups_web.png b/images/cups_web.png new file mode 100644 index 0000000..8cd09d0 Binary files /dev/null and b/images/cups_web.png differ diff --git a/images/greeting.png b/images/greeting.png new file mode 100644 index 0000000..4fe74f5 Binary files /dev/null and b/images/greeting.png differ diff --git a/ip_сайта.md b/ip_сайта.md new file mode 100644 index 0000000..337e811 --- /dev/null +++ b/ip_сайта.md @@ -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. +``` \ No newline at end of file diff --git a/iperf.md b/iperf.md new file mode 100644 index 0000000..c7a87e5 --- /dev/null +++ b/iperf.md @@ -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 +``` + diff --git a/linux_usefull.md b/linux_usefull.md new file mode 100644 index 0000000..de2f002 --- /dev/null +++ b/linux_usefull.md @@ -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 - .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 может отличаться в зависимости от установленной версии* +между тегами `` и `` +добавить/отредактировать +```bash + +``` + +[вверх](#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) diff --git a/luks.md b/luks.md new file mode 100644 index 0000000..4cbcc0a --- /dev/null +++ b/luks.md @@ -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 +``` diff --git a/mikrotik.md b/mikrotik.md new file mode 100644 index 0000000..93a805e --- /dev/null +++ b/mikrotik.md @@ -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 +``` +коммутатор применит настройки и перезагрузится diff --git a/minicom.md b/minicom.md new file mode 100644 index 0000000..ff9b1b1 --- /dev/null +++ b/minicom.md @@ -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 модемах из детства :)* + diff --git a/nano.md b/nano.md new file mode 100644 index 0000000..ccc3367 --- /dev/null +++ b/nano.md @@ -0,0 +1,14 @@ +### nano + +**показать/скрыть номера строк** +в латинской раскладке **Alt + Shift + 3** + +**номера строк отображаются по умолчанию** +в домашней папке пользователя создать/отредактировать файл **.nanorc**, добавить +``` +set linenumbers +``` + +**переход к определенной строке** +Alt + G +_работает не во всех эмуляторах терминала (Gnome connection manager)_ \ No newline at end of file diff --git a/plug-ins_Plex.txt b/plug-ins_Plex.txt new file mode 100644 index 0000000..e9098c4 --- /dev/null +++ b/plug-ins_Plex.txt @@ -0,0 +1 @@ +/var/lib/plexmediaserver/Library/Application Support/Plex Media Server/Plug-ins diff --git a/python/python_notes.md b/python/python_notes.md new file mode 100644 index 0000000..5822b73 --- /dev/null +++ b/python/python_notes.md @@ -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) + +*** diff --git a/rpi_VLAN.md b/rpi_VLAN.md new file mode 100644 index 0000000..d023d2f --- /dev/null +++ b/rpi_VLAN.md @@ -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 +``` \ No newline at end of file diff --git a/rpi_printserver.md b/rpi_printserver.md new file mode 100644 index 0000000..4578a54 --- /dev/null +++ b/rpi_printserver.md @@ -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, привести к виду: + +``` + + Order allow,deny + Allow all + +``` + +В секции Location /admin закомментировать строку `Order allow,deny` + +``` + + +``` + +Перезапустить службу печати + +```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 +``` diff --git a/rpi_serial_num.md b/rpi_serial_num.md new file mode 100644 index 0000000..6f15e1d --- /dev/null +++ b/rpi_serial_num.md @@ -0,0 +1,4 @@ +**Вывести серийный номер Raspberry в консоль** +``` +cat /proc/cpuinfo | grep Serial | cut -d' ' -f2 +``` \ No newline at end of file diff --git a/rpi_static_route.md b/rpi_static_route.md new file mode 100644 index 0000000..6260f6b --- /dev/null +++ b/rpi_static_route.md @@ -0,0 +1,52 @@ +### Статический маршрут на Raspberry Pi + +**синтаксис ip ro** +```bash +ip route add via +``` +Все параметры можно посмотреть `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 + +``` diff --git a/rpi_wifi_disable.md b/rpi_wifi_disable.md new file mode 100644 index 0000000..a964840 --- /dev/null +++ b/rpi_wifi_disable.md @@ -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` diff --git a/rpi_Сетевой_мост_(bridge).md b/rpi_Сетевой_мост_(bridge).md new file mode 100644 index 0000000..dfb429d --- /dev/null +++ b/rpi_Сетевой_мост_(bridge).md @@ -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 +``` \ No newline at end of file diff --git a/serial_con.md b/serial_con.md new file mode 100644 index 0000000..1010823 --- /dev/null +++ b/serial_con.md @@ -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 +``` +*для вступления изменений в силу необходимо перелогиниться.* \ No newline at end of file diff --git a/ssh.md b/ssh.md new file mode 100644 index 0000000..fd2ddc0 --- /dev/null +++ b/ssh.md @@ -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 +``` \ No newline at end of file diff --git a/start_bash.md b/start_bash.md new file mode 100644 index 0000000..b560f59 --- /dev/null +++ b/start_bash.md @@ -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) + +*** diff --git a/start_linux.md b/start_linux.md new file mode 100644 index 0000000..cbf2710 --- /dev/null +++ b/start_linux.md @@ -0,0 +1,1443 @@ +### Материал для подготовки к RHCSA + +#### ls +`ls` - list, просмотр содержимого каталогов +``` +ls опции /путь/к/папке +``` +-l - выводить подробный список, в котором будет отображаться владелец, группа, дата создания, размер и другие параметры; +-a - отображать все файлы, включая скрытые, это те, перед именем которых стоит точка; +```bash +[da2001@co1 ~]$ ls -l +total 4 +-rw-rw-r--. 2 da2001 da2001 0 May 24 09:59 connectedfile +lrwxrwxrwx. 1 da2001 da2001 10 May 24 09:59 hosts -> /etc/hosts +-rw-rw-r--. 2 da2001 da2001 0 May 24 09:59 newfile +drwxrwxr-x. 2 da2001 da2001 6 May 24 08:57 oldfiles +lrwxrwxrwx. 1 da2001 da2001 11 May 24 09:58 passwd -> /etc/passwd +-rw-rw-r--. 1 da2001 da2001 0 May 24 08:55 unhidden +drwxr-xr-x. 2 da2001 da2001 6 May 16 09:17 Видео +``` + +*** + +#### cat / tac +`cat` - catenate, вывод содержимого файла +`tac` - вывод содержимого файла с обратной сортировкой строк +``` +cat опции файл1 файл2 ... +``` +-b - нумеровать только непустые строки; +-E - показывать символ $ в конце каждой строки; +-n - нумеровать все строки; +-s - удалять пустые повторяющиеся строки; +-T - отображать табуляции в виде ^I. +```bash +[da2001@co1 ~]$ cat welcome +Добро пожаловать в Linux! +Развивайтесь. +``` +```bash +[da2001@co1 ~]$ tac welcome +Развивайтесь. +Добро пожаловать в Linux! +``` + +*** + +#### cd +`cd` - change directory, смена рабочей директории +``` +cd опции папка_назначения +``` +```bash +[da2001@co1 ~]$ cd /var/log +[da2001@co1 log]$ +``` + +*** + +#### chmod +`chmod` - change mode, изменение прав доступа к файлу/папке +``` +chmod опции права /путь/к/файлу +``` +**Три варианта записи прав пользователя** +``` +двоичная восьмеричная символьная права на файл права на каталог +000 0 --- нет нет +001 1 --x выполнение чтение файлов и их свойств +010 2 -w- запись нет +011 3 -wx запись и выполнение всё, кроме чтения списка файлов +100 4 r-- чтение чтение имён файлов +101 5 r-x чтение и выполнение доступ на чтение +110 6 rw- чтение и запись чтение имён файлов +111 7 rwx все права все права +``` +``` +Reference Class Описание +u user Владелец файла +g group Пользователи, входящие в группу владельца файла +o others Остальные пользователи +a all Все пользователи (или ugo) +``` +``` +Operator Описание ++ добавить определённые права +- удалить определённые права += установить определённые права +``` +``` +Mode Name Описание +r read чтение файла или содержимого каталога +w write запись в файл или в каталог +x execute выполнение файла или чтение содержимого каталога +X special execute выполнение, если файл является каталогом или уже имеет право на выполнение для какого-нибудь пользователя +s setuid/gid установленные атрибуты SUID или SGID позволяют запускать файл на выполнение с правами владельца файла или группы соответственно +t sticky устанавливая t-бит на каталог, мы меняем это правило таким образом, что удалить файл может только владелец этого файла +``` + +Разрешение | Применяется к файлам | Применяется к каталогам +---------- | -------------------------- | ----------------------- +Read | Открыть файл | Просмотр содержимого каталога +Write | Изменить содержимое файла | Создавать и удалять файлы +Execute | Выполнить программный файл | Перейти в каталог + +Разрешение | Числовое представление +---------- | :---------------------: +Read | 4 +Write | 2 +Execute | 1 + +**Примеры** +Установить права «rwxr-rx-x» (0755) для файла: +`chmod u=rwx,g=rx,o=x filename` + +Установить права на выполнение для владельца файла, удалить права на выполнение у группы, удалить права на запись и выполнение у остальных пользователей: +`chmod u+x,g-x,o-wx filename` + +Установить рекурсивно права на чтение для всех пользователей: +`chmod -R a+r directory` + +Рекурсивно удалить атрибуты SUID и SGID: +`chmod -R u-s,g-s directory` + +**Особенности** +Значениями по умолчанию являются: +для файлов: `644 (-rw-r--r--)` +для каталогов: `755 (drwxr-xr-x)` +_Значения разные для файлов и каталогов потому, что флаг «выполнения» по-разному действует на файлы и каталоги. Для обычных файлов «выполнение» означает открытие файлов, для исполняемых файлов — их запуск, а для каталогов — просмотр содержимого._ + +Следующая команда выполнит рекурсивное применение правил для всех файлов в каталоге «/home/test», а также для всех файлов во всех подкаталогах: +```bash +find /home/test -type f -exec chmod 644 {} \; +``` +Следующая команда выполнит рекурсивное применение правил для всех каталогов в каталоге «/home/test», а также для всех каталогов во всех подкаталогах: +```bash +find /home/test -type d -exec chmod 755 {} \; +``` +Того же результата можно добиться и без использования find (обратите внимание на заглавную X): +```bash +chmod -R go=rX,u=rwX /home/test +``` +Установить для file1 разрешения аналогичные file2 +```bash +chmod --reference file1 file2 +``` + +*** + +#### SUID, SGID и Sticky Bit +Разрешение | Числовое значение | Относительное значение | Применительно к файлам | Применительно к каталогам +---------- | :---------------: | :--------------------: | ---------------------- | ------------------------- +SUID | 4 | u+s | пользователь запускает файл с разрешениями владельца файла | не имеет смысла +SGID | 2 | g+s | пользователь запускает файл с разрешениями владельца группы | Файлы, созданные в каталоге, получают одного и того же владельца группы +Sticky bit | 1 | +t | не имеет смысла | запрещает пользователям удалять файлы других пользователей, даже если есть права на запись + +Установка SGID для каталога sales (группа sales) позволит создавать все новые файлы, группой которых будет группа sales, а назначение Sticky Bit запретит пользователям удалять файлы, созданные другими пользователями, даже если есть права на запись +```bash +chmod g+s,o+t /data/sales +``` + +*** + +#### chown +`chown` - change owner, утилита, изменяющая владельца и/или группу для указанных файлов. +``` +chown [-cfhvR] [--dereference] [--reference=rfile] пользователь[:группа] файл… +``` +-c, --changes Подробно описывать действие для каждого файла, владелец которого действительно изменяется. +-f, --silent, --quiet Не выдавать сообщения об ошибках для файлов, чей владелец не может быть изменён. +-h, --no-dereference Работать с самими символьными ссылками, а не с файлами, на которые они указывают. Данная опция доступна, только если имеется системный вызов lchown. +-R, --recursive Рекурсивное изменение владельца каталогов и их содержимого. +-v, --verbose Подробное описание действия (или отсутствия действия) для каждого файла. +--dereference Изменить владельца файла, на который указывает символьная ссылка, вместо самой символьной ссылки. +--reference=rfile Изменить владельца файла на того, который является владельцем файла. + +**Примеры использования** +Изменить владельца (owner) для `/var/run/httpd.pid` на `root` +```bash +chown root /var/run/httpd.pid +``` +Поменять владельца для `strace.log` в `rob` и идентификатор группы в `developers` +```bash +chown rob:developers strace.log +``` +*разделителем также может быть точка* +Поменять имя владельца для `/tmp` и `/var/tmp` на `nobody` + поменять группу для `/tmp` и `/var/tmp` на `nogroup` +```bash +chown nobody.nogroup /tmp /var/tmp +``` +Поменять идентификатор группы на `newgroup` для `/home` +```bash +chown :newgroup /home +``` +или +```bash +chown .newgroup /home +``` +Поменять имя владельца для `base` на `us` и выполнить это рекурсивно, т.е. всех вложенных в каталог `base` файлов (-R). +```bash +chown -R us base +``` +Поменять владельца для `noodlefrytasticy` на `mein` +```bash +chown mein noodlefrytasticy +``` + +*** + +#### newgrp +`newgrp` - изменение основной группы пользователя в текущей сессии +*при создании нового файла/каталога он создаётся от имени пользователя и основной группы этого пользоватля* +```bash +[da2001@co1 mydir]$ touch file +[da2001@co1 mydir]$ ll +total 0 +-rw-rw-r--. 1 da2001 da2001 0 Jun 8 08:43 file +``` +*группы, в которых состоит пользователь* +```bash +[da2001@co1 ~]$ groups +da2001 wheel sales +``` +Чтобы все новые файлы в текущей сессии создавались от группы sales +```bash +[da2001@co1 mydir]$ newgrp sales +[da2001@co1 mydir]$ touch file2 +[da2001@co1 mydir]$ ll +total 0 +-rw-rw-r--. 1 da2001 da2001 0 Jun 8 08:43 file +-rw-r--r--. 1 da2001 sales 0 Jun 8 08:50 file2 +``` + + +*** + +#### cp +`cp` - copy, копировать файлы и директории +``` +$ cp опции файл-источник файл-приемник +``` +или +``` +$ cp опции файл-источник директория-приемник/ +``` +--attributes-only - не копировать содержимое файла, а только флаги доступа и владельца; +-f, --force - перезаписывать существующие файлы; +-i, --interactive - спрашивать, нужно ли перезаписывать существующие файлы; +-L - копировать не символические ссылки, а то, на что они указывают; +-n - не перезаписывать существующие файлы; +-P - не следовать символическим ссылкам; +-r - копировать папку Linux рекурсивно; +-s - не выполнять копирование файлов в Linux, а создавать символические ссылки; +-u - скопировать файл, только если он был изменён; +-x - не выходить за пределы этой файловой системы; +-p - сохранять владельца, временные метки и флаги доступа при копировании; +-t - считать файл-приемник директорией и копировать файл-источник в эту директорию. + +*** + +#### dd +`dd` - dataset definition, копирование побайтово +https://habr.com/ru/post/117050/ +больше примеров в файле `Образ_SD_dd.md` +``` +dd if=источник_копирования of=место_назначения параметры +``` +bs - указывает сколько байт читать и записывать за один раз; +cbs - сколько байт нужно записывать за один раз; +count - скопировать указанное количество блоков, размер одного блока указывается в параметре bs; +conv - применить фильтры к потоку данных; +ibs - читать указанное количество байт за раз; +obs - записывать указанное количество байт за раз; +seek - пропустить указанное количество байт в начале устройства для чтения; +skip - пропустить указанное количество байт в начале устройства вывода; +status - указывает насколько подробным нужно сделать вывод; +iflag, oflag - позволяет задать дополнительные флаги работы для устройства ввода и вывода, основные из них: nocache, nofollow. + +**Примеры** +Создание образа диска: +```bash +dd if=/dev/cdrom of=image.iso +``` +игнорировать ошибки чтения +```bash +dd if=/dev/cdrom of=image.iso conv=noerror +``` +создать образ диска и отправить по ssh, заранее нужно настроить доступ по ключам +```bash +dd if=/dev/DEVICE | ssh user@host «dd of=/home/user/DEVICE.img» +``` +записать на диск 0 +```bash +dd if=/dev/zero of=/dev/DEVICE +``` +создать файл с записанными 0 +```bash +dd if=/dev/zero of=zerofile bs=1M count=100 +``` + +*** + +#### df +`df` - disk free, показать свободное место на диске +``` +df опции устройство +``` +-a, --all - отобразить все файловые системы, в том числе виртуальные, псевдо и недоступные; +-B - изменить размер одного блока перед выводом данных, например, можно использовать BM, чтобы вывести все данные в мегабайтах; +-h - выводить размеры в читаемом виде, в мегабайтах или гигабайтах; +-H - выводить все размеры в гигабайтах; +-i - выводить информацию об inode; +-k - выводить размеры в килобайтах; +--output - использовать специальный формат вывода, если не задано, выводит все поля. Доступны такие варианты: `source`, `fstype`, `itotal`, `iused`, `iavail`, `ipcent`, `size`, `used`, `avail`, `pcent`, `file` и `target`; +-P - использовать формат вывода POSIX; +--total - выводить всю информацию про использованное и доступное место; +-t, --type - выводить информацию только про указанные файловые системы; +-x - выводить информацию обо всех, кроме указанных файловых систем; +```bash +df -h +``` + +*** + +#### diff +`diff` - сравнение текстовых файлов +https://pingvinus.ru/note/compare-files-diff-in-linux +``` +diff опции файл1 файл2 +``` +-q - выводить только отличия файлов; +-s - выводить только совпадающие части; +-с - выводить нужное количество строк после совпадений; +-u - выводить только нужное количество строк после отличий; +-y - выводить в две колонки; +-e - вывод в формате ed скрипта; +-n - вывод в формате RCS; +-a - сравнивать файлы как текстовые, даже если они не текстовые; +-t - заменить табуляции на пробелы в выводе; +-l - разделить на страницы и добавить поддержку листания; +-r - рекурсивное сравнение папок; +-i - игнорировать регистр; +-E - игнорировать изменения в табуляциях; +-Z - не учитывать пробелы в конце строки; +-b - не учитывать пробелы; +-B - не учитывать пустые строки. +**Примеры** +Сравнение двух текстовых файлов +```bash +diff myfile1 myfile2 +``` +Перенаправление результата сравнения в файл +```bash +diff myfile1 myfile2 > changes.diff +``` +Сравнение директорий, содержащих текстовые файлы +```bash +diff -r mydir1 mydir2 > changes.diff +``` +Исключить файлы из сравнения +Создадим файл `excludeFiles` и запишем в него шаблоны и названия файлов, которые мы не должны сравнивать. Например, содержимое `excludeFiles` может иметь вид: +``` +*.o +ChangeLog* +*.bak +*.exe +``` +```bash +diff -r -X excludeFiles mydir1 mydir2 > changes.diff +``` + +*** + +#### du +`du` - disk usage, отображение использования диска +``` +$ du опции /путь/к/папке +``` +-a, --all - выводить размер для всех файлов, а не только для директорий, по умолчанию размер выводится только для папок; +-B, --block-size - указать единицы вывода размера, доступно: K,M,G,T,P,E,Z,Y для 1024 и KB, MB и так далее для 1000; +-c, --total - выводить в конце общий размер всех папок; +-d, --max-depth - максимальная глубина вложенности директорий; +-h, --human-readable - выводить размер в единицах измерения удобных для человека; +--inodes - выводить информацию об использованию inode; +-L, --dereference - следовать по всем символическим ссылкам; +-l, --count-links - учитывать размер файла несколько раз для жестких ссылок; +-P, --no-dereference - не следовать по символическим ссылкам, это поведение используется по умолчанию; +-S, --separate-dirs - не включать размер подпапок в размер папки; +--si - выводить размер файлов и папок в системе си, используется 1000 вместо 1024; +-s, --summarize - выводить только общий размер; +-t, --threshold - не учитывать файлы и папки с размером меньше указанного; +--time - отображать время последней модификации для файла или папки, вместо времени модификации можно выводить такие метки: atime, access, use, ctime; +-X, --exclude - исключить файлы из подсчёта; +-x, --one-file-system - пропускать примонтированные файловые системы; +--version - вывести версию утилиты. +```bash +du -h /var +``` + +*** + +#### echo +`echo` - утилита bash, для вывода данных +``` +echo опции строка +``` +-n - не выводить перевод строки; +-e - включить поддержку вывода Escape последовательностей; +-E - отключить интерпретацию Escape последовательностей. + +если включена опция -e, можно использовать такие Escape последовательности для вставки специальных символов: + +\c - удалить перевод строки; +\t - горизонтальная табуляция; +\v - вертикальная табуляция; +\b - удалить предыдущий символ; +\n - перевод строки; +\r - символ возврата каретки в начало строки. +**Примеры** +```bash +echo Linux Open Source Software Technologies +``` +```bash +echo -e "Linux \nopen \nsource \nsoftware \ntechnologies" +``` + +*** + +#### file +`file` - отобразить тип файла +```bash +da2001@Metromint:~$ file vim.pdf +vim.pdf: PDF document, version 1.5 + +da2001@Metromint:~$ file vim.docx +vim.docx: Microsoft Word 2007+ + +da2001@Metromint:~$ file явки +явки: UTF-8 Unicode text +``` + +*** + +#### find +`find` - поиск файлов по критериям с возможностью выполнения определённых действий с результатами поиска +https://habr.com/ru/company/alexhost/blog/525394/ +https://losst.ru/komanda-find-v-linux +``` +find [папка] [параметры] критерий шаблон [действие] +``` +папка - каталог в котором будем искать +параметры - дополнительные параметры, например, глубина поиска, и т д +критерий - по какому критерию будем искать: имя, дата создания, права, владелец и т д. +шаблон - непосредственно значение по которому будем отбирать файлы. +**Основные параметры** +-P никогда не открывать символические ссылки +-L получает информацию о файлах по символическим ссылкам. Важно для дальнейшей обработки, чтобы обрабатывалась не ссылка, а сам файл. +-maxdepth максимальная глубина поиска по подкаталогам, для поиска только в текущем каталоге установите 1. +-depth искать сначала в текущем каталоге, а потом в подкаталогах +-mount искать файлы только в этой файловой системе. +-version показать версию утилиты find +-print выводить полные имена файлов +-type f искать только файлы +-type d поиск папки в Linux +**Критерии поиска** +-name - поиск файлов по имени +-perm - поиск файлов в Linux по режиму доступа +-user - поиск файлов по владельцу +-group - поиск по группе +-mtime - поиск по времени модификации файла +-atime - поиск файлов по дате последнего чтения +-nogroup - поиск файлов, не принадлежащих ни одной группе +-nouser - поиск файлов без владельцев +-newer - найти файлы новее чем указанный +-size - поиск файлов в Linux по их размеру +Найти все файлы txt в папке dir +```bash +find /dir -name '*.txt' +``` +Найти все файлы пользователя da2001 +```bash +find / -user da2001 +``` +Найти все файлы, принадлежащие группе sales +```bash +find / -group sales +``` + +*** + +#### grep +`grep` - global regular expression print, сортировка и фильтрация текста +``` +$ grep [опции] шаблон [имя файла...] +``` +или: +``` +$ команда | grep [опции] шаблон +``` +*`опции`* - это дополнительные параметры, с помощью которых указываются различные настройки поиска и вывода, например количество строк или режим инверсии. +*`шаблон`* - это любая строка или регулярное выражение, по которому будет вестись поиск +*`файл и команда`* - это то место, где будет вестись поиск. Как вы увидите дальше, grep позволяет искать в нескольких файлах и даже в каталоге, используя рекурсивный режим. +возможность фильтровать стандартный вывод пригодится,например, когда нужно выбрать только ошибки из логов или найти PID процесса в многочисленном отчёте утилиты ps. + +**опции** +-b - показывать номер блока перед строкой; +-c - подсчитать количество вхождений шаблона; +-h - не выводить имя файла в результатах поиска внутри файлов Linux; +-i - не учитывать регистр; +-r - рекурсивный поиск; +-l - отобразить только имена файлов, в которых найден шаблон; +-n - показывать номер строки в файле; +-s - не показывать сообщения об ошибках; +-v - инвертировать поиск, выдавать все строки кроме тех, что содержат шаблон; +-w - искать шаблон как слово, окружённое пробелами; +-e - использовать регулярные выражения при поиске; +-An - показать вхождение и n строк до него; +-Bn - показать вхождение и n строк после него; +-Cn - показать n строк до и после вхождения; +**Примеры** +`ls | grep 'My Documents'` + +`grep 'Class 1' Students.txt` +Поиск по нескольким параметрам +`grep -e 'Class 1' -e Todd Students.txt` +Поиск слова word во всех файлах директории directory и вложенных директориях +`grep -rn word /directory` + +*** + +#### head +`head` - head выводит начальные строки (по умолчанию — 10) из одного или нескольких документов. Также она может показывать данные, которые передает на вывод другая утилита +``` +head опции файл +``` +опции — это параметр, который позволяет настраивать работу команды таким образом, чтобы результат соответствовал конкретным потребностям пользователя. +Файл — это имя документа (или имена документов, если их несколько). Если это значение не задано либо вместо него стоит знак «-», команда будет брать данные из стандартного вывода. +Чаще всего к команде head применяются такие опции: + +-c (--bytes) — позволяет задавать количество текста не в строках, а в байтах. При записи в виде --bytes=[-]NUM выводит на экран все содержимое файла, кроме NUM байт, расположенных в конце документа. +-n (--lines) — показывает заданное количество строк вместо 10, которые выводятся по умолчанию. Если записать эту опцию в виде --lines=[-]NUM, будет показан весь текст кроме последних NUM строк. +-q (--quiet, --silent) — выводит только текст, не добавляя к нему название файла. +-v (--verbose) — перед текстом выводит название файла. +-z (--zero-terminated) — символы перехода на новую строку заменяет символами завершения строк. +**Примеры** +вывести первые 10 строк файла +```bash +head file-name.txt +``` +вывод из нескольких файлов +```bash +head file-name1.txt file-name2.txt +``` +отобразить название файла в выводе +```bash +head -v file-name.txt +``` +изменить количество строк в выводе +```bash +head -n 20 file-name.txt +``` + +*** + +#### history +`history` - история введенных команд +**Примеры** +Вывод всей истории команд +`history` +Вывод команды с номером 154 +`!154` +Вывод истории с возможностью прокрутки +`history | less` +Последние 5 команд +`history -5` +Повторить последнюю команду +`!!` +полезно, если забыл указать `sudo` +`sudo !!` +сохранить список в файл `.bash_history` +`history -w` +дополнить файл сохранённой истории команд +`history -a` +очистить историю +`history -c` +удалить команды 102 131 +`history -d 102 131` + +*** + +#### ln +`ln` - link, создание ссылок на файлы +Создать жесткую ссылку +`ln target_file link_name` +*жесткую ссылку можно создать на только на файл, который находится в этой же файловой системе* +*жесткую ссылку нельзя создать на папку* +Создать мягкую ссылку +`ln -s target_file link_name` +Обновить существующую мягкую ссылку +`ln -sf new_file existing_soft_link` +Показать оригинальный файл по цепочке ссылок +`readlink -f soft_link` + +*** + +#### locate +`locate` - поиск файлов и каталогов по их именам +Команда locate выполняет поиск заданного шаблона в файле базы данных, сгенерированном командой updatedb. Найденные результаты отображаются на экране, по одному на строку. + +Во время установки пакета mlocate создается задание cron, которое запускает команду updatedb каждые 24 часа. Это гарантирует, что база данных регулярно обновляется. Для получения дополнительной информации о работе cron проверьте файл `/etc/cron.daily/mlocate`. + +Базу данных можно обновить вручную +`sudo updatedb` +найти файл с именем .bashrc +`locate .bashrc` +Если список результатов длинный, можно направить вывод в команду less: +`locate .bashrc | less` +Найти все md файлы +`locate *.md` +Ограничить поиск 10 результатами +`locate -n 10 *.py` +Поиск без учёта регистра +`locate -i readme.md` +Отобразить количество найденных файлов +`locate -c .bashrc` +Чтобы отобразить только имена файлов, которые существуют в данный момент +*По умолчанию locate не проверяет, существуют ли найденные файлы в файловой системе. Если файл был удалён после последнего обновления базы данных и он соответствует шаблону поиска, файл будет включен в результаты поиска.* +`locate -e *.json` +Поиск с применением регулярного выражения +`locate -r -i "(\.mp4|\.avi)"` + +*** + +#### mkdir +`mkdir` - создание директорий +`mkdir mydir` +Создать несколько директорий +`mkdir mydir1 mydir2 mydir3` +Создание директории с указанием относительного пути +`mkdir Downloads/torrents` +Чтобы создать все директории, которые содержатся в пути, используется ключ -p: +`mkdir -p subdir/somedir/mydir` +Задать права доступа к папке при создании (синтаксис такой же как у chmod) +`mkdir -m=765 mydir23` + +*** + +#### mv +`mv` - используется для перемещения одного или нескольких файлов (или директорий) в другую директорию, а также для переименования файлов и директорий +Опции +`-b`, `--backup`, `--backup=МЕТОД` - создать резервную копию существующих файлов, которые будут перезаписаны или удалены. Имя для резервной копии может создаваться по определенным правилам. В качестве значения МЕТОД можно указать: +* `none` или `off` — не делать резервных копий, даже если включена опция --backup +* `numbered` или `t` — имя резервной копии получит числовой индекс (пример: `myfile.txt~2~`). +* `existing` или `nil` — если в директории уже есть резервные копии с числовыми индексами, то использовать числовые индексы для новых резервных копий, во всех остальных случаях использовать метод simple. +* `simple` или `never` — делать обычные резервные копии (пример: `myfile.txt~`). +`-f` или `--force` - при перезаписи существующих файлов не спрашивать разрешения пользователя. +`-i` или `--interactive` - при перезаписи существующих файлов спрашивать разрешение пользователя на подтверждение операции. +`-n` или `--no-clobber` - не перезаписывать существующие файлы. +`--strip-trailing-slashes` - удалить завершающий символ слеш / (если он там есть) из имени файла-источника. +`-S СУФФИКС` или `--suffix=СУФФИКС` - изменить символ суффикса, который добавляется к именам резервных копий (при использовании опции --backup). По умолчанию СУФФИКС равен значку тильды `~` +`-t ДИРЕКТОРИЯ` или `--target-directory=ДИРЕКТОРИЯ` - переместить все исходные файлы в директорию, которая указана в аргументе опции. +`-u` или `--update` - перемещать только если исходный файл новее, чем файл назначения или если файл-назначения отсутствует. +`-v` или `--verbose` - выводить информацию о каждом файле, который обрабатывает команда mv. +`-Z` или `--context` - установить контекст (метки) SELinux для файлов назначения в значение по умолчанию. +**Примеры** +Переместить файл myfile1.txt в директорию mydir/ (директория должна существовать) +`mv myfile1.txt mydir/` +Переименовать файл +`mv myfile1.txt myfile2.txt` +Переименовать директорию +`mv mydir1 mydir2` +Создавать резервные копии существующих файлов +*Предположим, что нам нужно переименовать файл myfile1.txt в myfile2.txt, но файл myfile2.txt уже существует* +`mv -b myfile1.txt myfile2.txt` +*В результате сначала существующий файл myfile2.txt будет переименован в myfile2.txt~, то есть будет создана его резервная копия, и только потом файл myfile1.txt будет переименован в myfile2.txt.* +Вместо значка тильда `~` можно добавлять к именам резервных копий произвольный суффикс. Например, `.bak` +`mv -b -S ".bak" myfile1.txt myfile2.txt` +Переместить несколько файлов в директорию mydir/ +`mv myfile1 myfile2 myfile3 mydir/` +Переместить все файлы из текущей директории в директорию mydir/ +`mv * mydir/` +Переместить только те файлы, которых нет в директории назначения +`mv -n mydir1/* mydir2/` +Переместить только те файлы, которые новее +`mv -u mydir1/* mydir2/` +Если в имени файла есть пробелы их нужно экранировать или брать в ковычки +`mv "My file1.txt" "My file2.txt"` +Или +`mv My\ file1.txt My\ file2.txt` + +*** + +#### pwd +`pwd` - present working directory, отобразить текущую директорию +```bash +[da2001@co1 ~]$ pwd +/home/da2001 +``` + +*** + +#### rm +`rm` - remove, удаление файлов и папок +-f или --force - игнорировать несуществующие файлы и аргументы. Никогда не выдавать запросы на подтверждение удаления +-i - выводить запрос на подтверждение удаления каждого файла. +-I - выдать один запрос на подтверждение удаления всех файлов, если удаляется больше трех файлов или используется рекурсивное удаление. Опция применяется, как более «щадящая» версия опции -i +-r или -R или --recursive - удаление директорий и их содержимого. Рекурсивное удаление. +-d или --dir - удалять пустые директории. +**Примеры** +Удалить файл +`rm myfile.txt` +Удалить несколько файлов +`rm myfile1.txt myfile2.txt myfile3.txt` +Удалить защищенный файл +`rm -f myfile.txt` +Удалить все файлы в текущей директории +`rm *` +Выдавать запрос перед удалением каждого файла +`rm -i myfile*.txt` +Выдать запрос на удаление один раз +`rm -I myfile*.txt` +Удалить директорию и её содержимое +`rm -r mydir` + +*** + +#### rmdir +`rmdir` - удалить пустой каталог +`rmdir test-dir` +Удалить всю цепочку пустых каталогов +`rmdir -p test/test-dir/` + +*** + +#### tail +`tail` - вывод нескольких последних строк файла. По умолчанию 10 +-c - выводить указанное количество байт с конца файла; +-f - обновлять информацию по мере появления новых строк в файле; +-s - частота обновления файла, применяется совместно с опцией -f, по умолчанию 1 секунда; +-n - выводить указанное количество строк из конца файла; +--pid - используется с опцией -f, позволяет завершить работу утилиты, когда завершится указанный процесс; +-q - не выводить имена файлов; +--retry - повторять попытки открыть файл, если он недоступен; +-v - выводить подробную информацию о файле; +*В качестве значения параметра -c можно использовать число с приставкой b, kB, K, MB, M, GB, G T, P, E, Z, Y* +Вывод последних 10 строк +`tail /var/log/syslog` +Вывод последних 100 строк +`tail -n 100 /var/log/syslog` +Вывод новых строк по мере добавления их в файл +`tail -f /var/log/syslog` +Просмотр нескольких файлов +`tail /var/log/syslog /var/log/Xorg.0.log` +Изменить частоту обновления файла на 5 секунд +`tail -f -s 5 /var/log/syslog` + +*** + +#### tar +**Создать архив** +```bash +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 + + +**Создать архив со сжатием** +```bash +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 + + +**Добавить файл в существующий архив** +```bash +tar -rvf /root/homes.tar /etc/hosts +``` +-r, --append append files to the end of an archive + + +**Обновить файлы в существующем архиве** +```bash +tar -uvf /root/homes.tar /home +``` +-u, --update only append files newer than copy in archive + + +**Просмотр содержимого архива** +```bash +tar -tvf /root/homes.tar +``` +-t, --list list the contents of an archive + + +**Извлечь файлы из архива в текущий каталог** +```bash +tar -xvf /archivename +``` +-x, --extract, --get extract files from an archive + + +**Извлечь файлы из сжатого архива** +```bash +tar -xzvf archivename.tar.gz +``` + + +**Извлечь файлы из архива в другой каталог** +```bash +tar -xvf /archivename -C /tmp +``` +-C, --directory=DIR change to directory DIR + + +**Извлечь определённый файл из архива** +```bash +tar -xvf /root/etc.tar etc/hosts +``` + +*** + +#### top +`top` - table of processes, консольная команда, которая выводит список работающих в системе процессов и информацию о них. По умолчанию она в реальном времени сортирует их по нагрузке на процессор. +*С помощью ключей можно гибко настроить вывод информации о запущенных процессах* +```bash +top - 09:14:09 up 3 days, 8 min, 1 user, load average: 0.02, 0.02, 0.00 +Tasks: 164 total, 1 running, 163 sleeping, 0 stopped, 0 zombie +%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st +MiB Mem : 1818.6 total, 569.6 free, 569.1 used, 679.9 buff/cache +MiB Swap: 1024.0 total, 1024.0 free, 0.0 used. 1085.1 avail Mem + + PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND + 1 root 20 0 180100 14216 9176 S 0.0 0.8 0:09.25 systemd + 2 root 20 0 0 0 0 S 0.0 0.0 0:00.17 kthreadd + 3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp + 4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp + 6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H-kblockd + 8 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 mm_percpu_wq +................. +``` +*существует более удобная утилита `htop`* + +*** + +#### ps +`ps` - process status, вывод информации о запущенных процессах +Некоторый опции +-A, -e, (a) - выбрать все процессы; +-a - выбрать все процессы, кроме фоновых; +-d, (g) - выбрать все процессы, даже фоновые, кроме процессов сессий; +-N - выбрать все процессы кроме указанных; +-С - выбирать процессы по имени команды; +-G - выбрать процессы по ID группы; +-p, (p) - выбрать процессы PID; +--ppid - выбрать процессы по PID родительского процесса; +-s - выбрать процессы по ID сессии; +-t, (t) - выбрать процессы по tty; +-u, (U) - выбрать процессы пользователя. + +Опции форматирования: +-с - отображать информацию планировщика; +-f - вывести максимум доступных данных, например, количество потоков; +-F - аналогично -f, только выводит ещё больше данных; +-l - длинный формат вывода; +-j, (j) - вывести процессы в стиле Jobs, минимум информации; +-M, (Z) - добавить информацию о безопасности; +-o, (o) - позволяет определить свой формат вывода; +--sort, (k) - выполнять сортировку по указанной колонке; +-L, (H)- отображать потоки процессов в колонках LWP и NLWP; +-m, (m) - вывести потоки после процесса; +-V, (V) - вывести информацию о версии; +-H - отображать дерево процессов; + +**Примеры** +Процессы текущей оболочки +`ps` +Все процессы кроме фоновых +`ps -a` +Вывести больше данных +`ps -f` +Опции можно комбинировать +`ps -af` + +*** + +#### touch +`touch` - используется для изменения временных меток файлов, однако один из наиболее распространенных способов использования - создание нового пустого файла. +Обновить метки времени существующего файла или создать новый, если файл с таким именем не существует +`touch file.txt` +Обновить метки времени/создать несколько файлов +`touch file1.txt file2.txt file3.txt` +Обновить временные метки, если файл не существует НЕ создавать его +`touch -c file.txt` +Обновить только время доступа к файлу +`touch -a file.txt` +Обновить только время изменения файла +`touch -m file.txt` +Использовать временные метки другого файла +`touch -r file.txt` +Задать конкретное время доступа и модификации в формате YYMMDDhhmm +`touch -t 202105251224 file.txt` + +*** + +#### time +`time` - время выполнения команды/скрипта +```bash +[da2001@co1 ~]$ time ls + connectedfile link newfiles passwd test Видео Загрузки Музыка 'Рабочий стол' + hosts newfile oldfiles symlinkfile unhidden Документы Изображения Общедоступные Шаблоны + +real 0m0.002s +user 0m0.001s +sys 0m0.001s +``` + +*** + +#### which +`which` - команда отображает путь к исполняемому файлу запрашиваемой программы +```bash +[da2001@co1 ~]$ which time +/usr/bin/time +``` + +*** + +#### PATH +`$PATH` - переменная, в которой хранятся пути поиска исполняемых файлов +```bash +[da2001@co1 ~]$ echo $PATH +/home/da2001/.local/bin:/home/da2001/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin +``` + +*** + +#### Перенаправление ввода/вывода +``` +Название Использование при перенаправлении Значение дискриптора +STDIN < или 0< 0 +STDOUT > или 1> 1 +STDERR 2> 2 +``` +`>` или `1>` - перенаправление вывода. Если указано перенаправление в файл, файл будет перезаписан. +`>>` - допишет данные в конец файла +`2>` - перенаправление потока ошибок +`2>&1` или `&>` - перенаправление вывода и потока ошибок в одно место `ls test test2 > errout 2>&1` +`> /dev/null` - перенаправление в пустоту + +*** + +#### pipe | +`pipe |` - перенаправление вывода первой команды на вход второй команды +``` +[da2001@co1 ~]$ cat /etc/passwd | grep da2001 +da2001:x:1000:1000:da2001:/home/da2001:/bin/bash +``` + +*** + +#### uname +`uname` - утилита командной строки, которая печатает основную информацию об имени операционной системы и системном оборудовании +-s, ( –kernel-name) – печатает имя ядра. Значение по-умолчанию. +-n, ( –nodename) – печатает имя узла системы (имя хоста). Это имя, которое система использует при общении по сети. При использовании с опцией -n uname показывает тот же вывод, что и команда hostname. +-r, ( –kernel-release) – печатает выпуск ядра. +-v, ( –kernel-version) – печатает версию ядра. +-m, ( –machine) – печатает название аппаратного имени аппарата. +-p, ( –processor) – печатает архитектуру процессора. +-i, ( –hardware-platform) – печатает аппаратной платформы. +-o, ( –operating-system) – распечатает название операционной системы. В системах Linux это «GNU/Linux» +-a, ( –all) – при использовании опции -a uname ведет себя так же, как если бы были заданы опции -snrvmo. + +*** + +#### wget +`wget` - загрузка файлов из сети +**Примеры** +Загрузка одного файла +`wget http://ftp.gnu.org/gnu/wget/wget-1.5.3.tar.gz` +Сохранить файл с другим именем +`wget -O wget.zip http://ftp.gnu.org/gnu/wget/wget-1.5.3.tar.gz` +Скачать несколько файлов +`wget http://ftp.gnu.org/gnu/wget/wget-1.5.3.tar.gz ftp://ftp.gnu.org/gnu/wget/wget-1.10.1.tar.gz.sig` +Взять адрес из файла +`wget -i /wget/url.txt` +Продолжить прерванную загрузку +`wget -c http://ftp.gnu.org/gnu/wget/wget-1.5.3.tar.gz` +Загрузка в фоне +*-b - background, загрузка в фоне +-o - output-file, сохранение лога в файл* +`wget -b -o ~/wget.log http://ftp.gnu.org/gnu/wget/wget-1.5.3.tar.gz` +Ограничение скорости загрузки +`wget --limit-rate=100k ftp://ftp.iinet.net.au/debian/debian-cd/8.4.0/amd64/iso-dvd/debian-8.4.0-amd64-DVD-1.iso` +*k - килобит, m - мегабит, g - гигабит* +Подключение по логину и паролю +`wget --http-user=narad --http-password=password http://mirrors.hns.net.in/centos/6.3/isos/x86_64/CentOS-6.3-x86_64-LiveDVD.iso` +или +`wget --ftp-user=narad --ftp-password=password ftp://ftp.iinet.net.au/debian/debian-cd/6.0.5/i386/iso-dvd/debian-6.0.5-i386-DVD-1.iso` +Указать директорию загрузки +`wget -P ~/Downloads/ http://ftp.gnu.org/gnu/wget/wget-1.5.3.tar.gz` + +*** + +#### zip/unzip +Создать архив из `archive.zip` файлов `file1.txt file2.log` +`zip archive.zip file1.txt file2.log` +Добавить в существующий архив папку с файлами +`zip archive.zip -r /var/log/` +Установить пароль на архив можно с помощью ключа -P, а ключ -e скроет пароль при вводе +`zip archive.zip -Pe /var/log/` +Распаковать архив в текущую директорию +`unzip archive.zip` +Распаковать в другую директорию +`unzip archive.zip -d /tmp` +Просмотреть список файлов в архиве без распаковки +`unzip archive.zip -l` +Распаковать определённый файлы архива +`unzip archive.zip 1.txt 2.txt` +**Пример создания архива.** +Заархивируем все файлы и папки в директории /var/log/ и директорию /var/spool/ +`zip -r -9 test-archive.zip /var/log/* /var/spool/* -x "/var/log/apt/*"` +`-r` - архивировать рекурсивно +`-9` - степень сжатия от 1 до 9. 0 - без сжатия. +`test-archive.zip` - имя архива +`/var/log/* /var/spool/*` - архивируемые директории через пробел +`-x "/var/log/apt/*"` - опция, позволяющая исключить указанную папку или файл из архива + +*** + +#### findmnt +`findmnt` - показать точки монтирования +Просмотр устройств и точек их монтирования +`findmnt --real` +- ключ `--real` появился недавно, в версии 2.32, кот. используется в CentOS 8 его еще нет, а в Mint 20, установлена версия 2.34, там уже есть. +`findmnt` без опций покажет больше данных +Отображать процесс монтирования/отмонтирования в реальном времени +`findmnt -p` + +*** + +#### mount +`mount` - монтирование файловых систем +-v - подробный режим; +-a, --all - примонтировать все устройства, описанные в fstab; +-F, --fork - создавать отдельный экземпляр mount для каждого отдельного раздела; +-f, --fake - не выполнять никаких действий, а только посмотреть что собирается делать утилита; +-n, --no-mtab - не записывать данные о монтировании в /etc/mtab; +-l, --show-labels - добавить метку диска к точке монтирования; +-c - использовать только абсолютные пути; +-r, --read-only - монтировать раздел только для чтения; +-w, --rw - монтировать для чтения и записи; +-L, --label - монтировать раздел по метке; +-U, --uuid - монтировать раздел по UUID; +-T, --fstab - использовать альтернативный fstab; +-B, --bind - монтировать локальную папку; +-R, --rbind - перемонтировать локальную папку +Показать все смонтированные ФС +`mount` +Смонтировать ФС, прописанные в `/etc/fstab` +`sudo mount -a` +Монтирование диска в папку +`sudo mount /dev/sdb6 /mnt/` +Монтирование с указанием файловой системы +`sudo mount -t ext4 /dev/sdb6 /mnt` +Монтирование только для чтения +`sudo mount -r /dev/sdb6 /mnt` +или +`sudo mount -o ro /dev/sdb6 /mnt` +**Дополнительные опции монтирования** +Запрет запуска исполняемых файлов в примонтированной папке +`sudo mount -o noexec /dev/sdb6 /mnt` +Перемонтировать раздел в режим только для чтения +`sudo mount -o rw,remount /dev/sdb6 /mnt` +Перемонтировать корень файловой системы в режим чтения-записи +`sudo mount -o rw,remount /` +Монтирование одной папки в другую +`sudo mount --bind /mnt/ /media/` +Монтирование образа +`sudo mount ~/file.iso /mnt` +Зеркало папки +`sudo mount /dev/sdb1 /home/user/Видео` +`sudo mount --bind /home/user/Видео /home/user/Документы` +*в итоге `/dev/sdb1` будет смонтирован сразу в две папки* + +#### umount +`umount` - размонтирование ФС +`sudo umount /mnt` +*иногда может возникнуть ошибка размонтирования. Система сообщит, что устройство занято: `umount: /mnt: target is busy`* +Проблему можно решить закрыв все программы, которые могут использовать любой файл в этой папке. Какие именно это программы вы можете узнать с помощью команды `lsof` +` lsof -w /mnt` +`lsof -w /dev/sdb6` +С опцией `-l`, файловая система будет отключена немедленно, несмотря на то, что она занята +`sudo umount -l /mnt` + +*** + +#### cut +`cut` - вырезать часть текста +-b (--bytes=LIST) — номер байта, набор или диапазон байтов, подлежащих вырезанию. +-c (--characters=LIST) — символ, который следует вырезать. Также можно указывать набор либо диапазон символов. +-d (--delimiter=DELIM) — с помощью этой опции пользователь устанавливает свой разделитель вместо стандартного TAB. +-f (--fields=LIST) — перечень полей для вырезания. +-s (--only-delimited) — если была применена эта опция, cut не выводит строки, где нет разделителя. +--complement — задает байты, символы или поля, которые останутся в файле или тексте из стандартного ввода. Все остальное будет вырезано. +--output-delimiter=STRING — по умолчанию выходной разделитель соответствует входному. Эта опция позволяет задать другой выходной разделитель. +-z, --zero-terminated — вместо символа новой строки разделителем будет NULL. +*для примеров создан файл* +```bash +[da2001@co1 ~]$ cat cut_command_example.txt +Winter: white: snow: frost +Spring: green: grass: warm +Summer: colorful: blossom: hot +Autumn: yellow: leaves: cool +``` +1. Работа с байтами (`-b`) +*вырезать из текста 1 байт* +```bash +[da2001@co1 ~]$ echo "The sky was yellow as brass." | cut -b 1 +T +``` +*вырезать несколько конкретных байт и диапазон* +```bash +[da2001@co1 ~]$ echo "I looked at my watch; not eight o'clock." | cut -b 5,8,17,18-21 +odatch; +``` +*также можно работать с файлами* +```bash +[da2001@co1 ~]$ cut -b 1,9 cut_command_example.txt +Ww +Sg +Sc +Ay +``` +*вырезать все байты начиная с 5 и до конца строки* +```bash +[da2001@co1 ~]$ cut -b 5- cut_command_example.txt +er: white: snow: frost +ng: green: grass: warm +er: colorful: blossom: hot +mn: yellow: leaves: cool +``` +*вырезать байты 1-16* +```bash +[da2001@co1 ~]$ cut -b -16 cut_command_example.txt +Winter: white: s +Spring: green: g +Summer: colorful +Autumn: yellow: +``` +2. Работа с символами аналогична работе с байтами за исключением того, что необходимо использовать ключ `-c` +```bash +[da2001@co1 ~]$ cut -c -16 cut_command_example.txt +Winter: white: s +Spring: green: g +Summer: colorful +Autumn: yellow: +``` +3. Работа со столбцами (`-d` - разделитель, `-f` - номер столбца) +```bash +[da2001@co1 ~]$ echo "From the inn issued a smell of frying liver." | cut -d ' ' -f 1 +From +``` +*первый столбец файла с разделителем `:`* +```bash +[da2001@co1 ~]$ cat cut_command_example.txt +Winter: white: snow: frost +Spring: green: grass: warm +Summer: colorful: blossom: hot +Autumn: yellow: leaves: cool + +[da2001@co1 ~]$ cut -d ':' -f 1 cut_command_example.txt +Winter +Spring +Summer +Autumn +``` +*вырезать несколько столбцов* +```bash +[da2001@co1 ~]$ cut -d ':' -f 1,2,3 cut_command_example.txt +Winter: white: snow +Spring: green: grass +Summer: colorful: blossom +Autumn: yellow: leaves +``` +Команда cut также пригодится при работе с массивными CSV-документами. Ее синтаксис и опции в этом случае остаются неизменными. Например, при таком написании будут вырезаны первые два столбца файла с названием file_example.csv: +```bash +cut -d ',' -f 1,2 file_example.csv +``` + +*** + +#### sort +`sort` - сортировка текста +Строки с цифрами размещаются выше других строк +Строки, начинающиеся с букв нижнего регистра размещаются выше +Сортировка выполняется в соответствии алфавиту +Строки сначала сортируются по алфавиту, а уже вторично по другим правилам. +-b - не учитывать пробелы +-d - использовать для сортировки только буквы и цифры +-i - сортировать только по ASCII символах +-n - сортировка строк linux по числовому значению +-r - сортировать в обратном порядке +-с - проверить был ли отсортирован файл +-o - вывести результат в файл +-u - игнорировать повторяющиеся строки +-m - объединение ранее отсортированных файлов +-k - указать поле по которому нужно сортировать строки, если не задано, сортировка выполняется по всей строке. +-f - использовать в качестве разделителя полей ваш символ вместо пробела +-R - сортировка в случайном порядке +```bash +[da2001@co1 ~]$ cat test.txt +computer +mouse +LAPTOP +data +RedHat +laptop +debian +laptop +``` +Сортировка по алфавиту +```bash +[da2001@co1 ~]$ sort test.txt +computer +data +debian +laptop +laptop +LAPTOP +mouse +RedHat +``` +Сортировка в обратном порядке +```bash +[da2001@co1 ~]$ sort -r test.txt +RedHat +mouse +LAPTOP +laptop +laptop +debian +data +computer +``` +Сортировка вывода по 9-й колонке +```bash +[da2001@co1 ~]$ ls -l | sort -k9 +total 16 +-rw-rw-r--. 2 da2001 da2001 0 May 24 09:59 connectedfile +-rw-rw-r--. 1 da2001 da2001 114 May 28 13:49 cut_command_example.txt +-rw-rw-r--. 1 da2001 da2001 59 May 24 15:58 errout +lrwxrwxrwx. 1 da2001 da2001 10 May 24 09:59 hosts -> /etc/hosts +drwxrwxrwx. 2 da2001 da2001 6 May 26 13:55 mydir +drwxrw-r-x. 2 da2001 da2001 6 May 26 13:56 mydir2 +-rw-rw-r--. 2 da2001 da2001 0 May 24 09:59 newfile +``` +Сортировка 5-й колонки по числовому значению `-n` +```bash +[da2001@co1 ~]$ ls -l | sort -nk5 +lrwxrwxrwx. 1 da2001 da2001 7 May 24 10:08 symlinkfile -> newfile +lrwxrwxrwx. 1 da2001 da2001 10 May 24 09:59 hosts -> /etc/hosts +lrwxrwxrwx. 1 da2001 da2001 11 May 24 09:58 passwd -> /etc/passwd +drwxrwxr-x. 2 da2001 da2001 37 May 24 08:55 newfiles +-rw-rw-r--. 1 da2001 da2001 55 May 28 14:34 test.txt +-rw-rw-r--. 1 da2001 da2001 59 May 24 15:58 errout +-rw-rw-r--. 1 da2001 da2001 68 May 25 12:24 welcome +drwxrwxr-x. 2 da2001 da2001 91 May 28 09:58 test +-rw-rw-r--. 1 da2001 da2001 114 May 28 13:49 cut_command_example.txt +drwxrwxrwx. 2 da2001 da2001 142 May 28 14:44 mydir +``` +Сортировка со скрытием дублирующихся значений `-u` +```bash +[da2001@co1 ~]$ sort -u test.txt +computer +data +debian +laptop +LAPTOP +mouse +RedHat +``` + +*** + +#### w +`w` - показать авторизованных пользователей в системе +```bash +[da2001@co1 ~]$ w + 08:22:28 up 7 days, 23:16, 1 user, load average: 0.00, 0.00, 0.00 +USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT +da2001 pts/0 192.168.1.8 08:22 2.00s 0.11s 0.00s w +``` + +*** + +#### useradd +`useradd` - создать нового пользователя +основные параметры: +``` +-c, --comment КОММЕНТАРИЙ поле GECOS новой учётной записи +-d, --home-dir ДОМ_КАТ домашний каталог новой учётной записи +-D, --defaults показать или изменить настройки по умолчанию для useradd +-e, --expiredate ДАТА_УСТ дата устаревания новой учётной записи +-f, --inactive НЕАКТИВНОСТЬ период неактивности пароля новой учётной записи +-g, --gid ГРУППА имя или ID первичной группы новой учётной записи +-G, --groups ГРУППЫ список дополнительных групп новой учётной записи +-K, --key КЛЮЧ=ЗНАЧЕНИЕ заменить значение по умолчанию из /etc/login.defs +-m, --create-home создать домашний каталог пользователя +-M, --no-create-home не создавать домашний каталог пользователя +-N, --no-user-group не создавать группу с тем же именем что и у пользователя +-o, --non-unique разрешить создание пользователей с повторяющимися (не уникальными) UID +-s, --shell ОБОЛОЧКА регистрационная оболочка новой учётной записи +-u, --uid UID пользовательский ID новой учётной записи +-U, --user-group создать группу с тем же именем что и у пользователя +``` +Создать пользователя `linda`, id 1201 (`-u 1201`), `-m` создать домашний каталог, добавить пользователя в группы sales и ops (`-G sales,ops`) +```bash +useradd -m -u 1201 -G sales,ops linda +``` + +*** + +#### passwd +`passwd` - пароль учётной записи +основные параметры: +``` +-d, --delete удалить пароль заданной учётной записи +-e, --expire просрочить пароль заданной учётной записи +-l, --lock заблокировать заданную учётную запись +-n, --mindays МИН_ДНЕЙ установить минимальное число дней перед сменой пароля в МИН_ДНЕЙ +-S, --status показать состояние пароля заданной учётной записи +-u, --unlock разблокировать заданную учётную запись +-w, --warndays ПРЕДУП_ДНЕЙ установить количество дней с выдачей предупреждения в ПРЕДУП_ДНЕЙ +-x, --maxdays МАКС_ДНЕЙ установить максимальное число дней перед сменой пароля в МАКС_ДНЕЙ +``` +Задать пароль для пользователя `linda` +```bash +passwd linda +``` +Изменить свойства пароля. Срок действия пароля истекает через 90 дней (`-x 90`). За три дня до истечения срока действия пользователь получит предупреждение (`-w 3`), и пароль необходимо использовать не менее 30 дней, прежде чем (`-n 30`) его можно будет изменить. +```bash +passwd -n 30 -w 3 -x 90 linda +``` + +*** + +#### chage +`chage` - изменяет информацию об устаревании пароля пользователя +основные опции: +``` +-d, --lastday ПОСЛ_ДЕНЬ установить последний день смены пароля в ПОСЛ_ДЕНЬ +-E, --expiredate ДАТА_УСТ установить дату окончания действия учётной записи в ДАТА_УСТ +-I, --inactive НЕАКТИВНОСТЬ установить неактивность пароля после устаревания в значение НЕАКТИВНОСТЬ +-l, --list показать «возраст» учётной записи +-m, --mindays МИН_ДНЕЙ установить минимальное число дней перед сменой пароля в МИН_ДНЕЙ +-M, --maxdays МАКС_ДНЕЙ установить максимальное число дней перед сменой пароля в МАКС_ДНЕЙ +-W, --warndays ПРЕДУП_ДНЕЙ установить количество дней с выдачей предупреждения в ПРЕДУП_ДНЕЙ +``` +```bash +sudo chage -l laura +``` +``` +Last password change : Jun 03, 2021 +Password expires : Sep 01, 2021 +Password inactive : never +Account expires : never +Minimum number of days between password change : 0 +Maximum number of days between password change : 90 +Number of days of warning before password expires : 3 +``` + +*** + +#### groupadd +`groupadd` - создание группы +Создать группу `sales` +```bash +groupadd sales +``` +Создать группу `prod` и указать её GID +```bash +groupadd prod -g 1201 +``` + +*** + +#### usermod +`usermod` - изменяет учётную запись пользователя +Добавить пользователя linda в группу sales +```bash +usermod -aG sales linda +``` +Изменить основную группу пользователя на группу sales +```bash +usermod -g sales +``` + +*** + +#### id +`id` - информация о пользователе +```bash +da2001@Metromint:~$ id da2001 +uid=1000(da2001) gid=1000(da2001) группы=1000(da2001),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),108(kvm),114(lpadmin),134(sambashare),136(wireshark),139(libvirt) +``` + +*** + +#### wc +`wc` - подсчет количества строк, слов, символов, байт +``` +-c, --bytes напечатать количество байт +-m, --chars напечатать количество символов +-l, --lines напечатать количество новых строк +-w, --words напечатать количество слов +``` +запуск команды без параметров выдаст количество строк, слов, байт +```bash +da2001@Metromint:~$ cat test.txt +Привет +как +дела +da2001@Metromint:~$ wc test.txt + 3 3 29 test.txt +``` + +*** + +#### less +`less` - постраничный вывод текста на экран +Опций очень много, навигация по файлу осуществляется аналогично vim +``` +-c, --squeeze-blank-lines удалить лишние пустые строки +``` +Поиск по открытому файлу +/text - поиск слова text вперед +?text - поиск слова text назад + +*** diff --git a/tar.md b/tar.md new file mode 100644 index 0000000..7770cba --- /dev/null +++ b/tar.md @@ -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 +``` \ No newline at end of file diff --git a/tcpdump.md b/tcpdump.md new file mode 100644 index 0000000..dc8c82d --- /dev/null +++ b/tcpdump.md @@ -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)' +``` diff --git a/tmux.md b/tmux.md new file mode 100644 index 0000000..1751619 --- /dev/null +++ b/tmux.md @@ -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писок поддерживаемых команд diff --git a/utp.png b/utp.png new file mode 100644 index 0000000..518260c Binary files /dev/null and b/utp.png differ diff --git a/vim.pdf b/vim.pdf new file mode 100644 index 0000000..8b281b5 Binary files /dev/null and b/vim.pdf differ diff --git a/Дополнительный_IP_(secondary_ip).md b/Дополнительный_IP_(secondary_ip).md new file mode 100644 index 0000000..c174b1a --- /dev/null +++ b/Дополнительный_IP_(secondary_ip).md @@ -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 и т.д. \ No newline at end of file diff --git a/Изменить имя пользователя Linux.md b/Изменить имя пользователя Linux.md new file mode 100644 index 0000000..06d9065 --- /dev/null +++ b/Изменить имя пользователя Linux.md @@ -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 +``` + diff --git a/Изоляция_сетевых_интерфейсов.md b/Изоляция_сетевых_интерфейсов.md new file mode 100644 index 0000000..8798e36 --- /dev/null +++ b/Изоляция_сетевых_интерфейсов.md @@ -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 +``` \ No newline at end of file diff --git a/Маршрут_по-умолчанию_(default_gateway).md b/Маршрут_по-умолчанию_(default_gateway).md new file mode 100644 index 0000000..638c2c5 --- /dev/null +++ b/Маршрут_по-умолчанию_(default_gateway).md @@ -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 +``` \ No newline at end of file diff --git a/Маршрутизация_(route).md b/Маршрутизация_(route).md new file mode 100644 index 0000000..4d8c880 --- /dev/null +++ b/Маршрутизация_(route).md @@ -0,0 +1,10 @@ +#### Маршрутизация (Route) +**Включить маршрутизацию трафика** +```bash +sudo nano /etc/sysctl.conf +``` +раскомментировать строку `net.ipv4.ip_forward=1` +перезагрузить raspberry +```bash +sudo reboot +``` \ No newline at end of file diff --git a/Монтирование образа.md b/Монтирование образа.md new file mode 100644 index 0000000..96d8f59 --- /dev/null +++ b/Монтирование образа.md @@ -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 \ No newline at end of file diff --git a/Настройка VNC Ubuntu Server 20.04.md b/Настройка VNC Ubuntu Server 20.04.md new file mode 100644 index 0000000..f256e1f --- /dev/null +++ b/Настройка VNC Ubuntu Server 20.04.md @@ -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` diff --git a/Настройка сервера Debian 9.docx b/Настройка сервера Debian 9.docx new file mode 100755 index 0000000..22ec3b4 Binary files /dev/null and b/Настройка сервера Debian 9.docx differ diff --git a/Настройка сервера Debian 9.pdf b/Настройка сервера Debian 9.pdf new file mode 100755 index 0000000..46730ed Binary files /dev/null and b/Настройка сервера Debian 9.pdf differ diff --git a/Не_стартует_NGINX_автоматом.txt b/Не_стартует_NGINX_автоматом.txt new file mode 100644 index 0000000..2e24e3d --- /dev/null +++ b/Не_стартует_NGINX_автоматом.txt @@ -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 помогло diff --git a/Образ_SD_dd.md b/Образ_SD_dd.md new file mode 100644 index 0000000..818517c --- /dev/null +++ b/Образ_SD_dd.md @@ -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** (это последний сектор нашего раздела)
+Размер секторов - **Единицы: секторов по 1 \* 512 = 512 байт**
+Таким образом нам необходимо сохранить:
+5279743 + 1 (первый сектор начинается с 0) = 5279744 секторов
+5279744 \* 512 (размер сектора) = 2703228928 байт
+2703228928 / 1024 / 1024 = 2578 Мб (обязательно округляем в большую сторону)
+ +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 +``` diff --git a/Пересоздание ключей ssh сервера.md b/Пересоздание ключей ssh сервера.md new file mode 100644 index 0000000..ac004c2 --- /dev/null +++ b/Пересоздание ключей ssh сервера.md @@ -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 +``` +Обновление ключей закончено. \ No newline at end of file diff --git a/Приветствие ssh Debian 9.md b/Приветствие ssh Debian 9.md new file mode 100644 index 0000000..e87d21b --- /dev/null +++ b/Приветствие ssh Debian 9.md @@ -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 он считается устаревшим и исключен из репозиториев +Пока решение не найдено diff --git a/Приветствие ssh Debian 9.pdf b/Приветствие ssh Debian 9.pdf new file mode 100644 index 0000000..d86c87f Binary files /dev/null and b/Приветствие ssh Debian 9.pdf differ diff --git a/Статический_маршрут_(static_route).md b/Статический_маршрут_(static_route).md new file mode 100644 index 0000000..45754f8 --- /dev/null +++ b/Статический_маршрут_(static_route).md @@ -0,0 +1,94 @@ +#### Статический маршрут (Static route) + +**На Raspberry PI, чтобы маршрут сохранился после рестарта, его необходимо добавлять в эту папку `/lib/dhcpcd/dhcpcd-hooks/`. Подробнее в отдельной заметке** + +Добавить маршрут можно используя route или через ip ro. Он будет сохранен до следующей перезагрузки +**синтаксис route** +```bash +route add [-net|-host] netmask gw dev 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 via +``` +Все параметры можно посмотреть 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 +``` \ No newline at end of file diff --git a/Уменьшение размера образа img.md b/Уменьшение размера образа img.md new file mode 100644 index 0000000..1d42755 --- /dev/null +++ b/Уменьшение размера образа img.md @@ -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 +``` \ No newline at end of file diff --git a/автозапуск_(startup)_в_Linux.md b/автозапуск_(startup)_в_Linux.md new file mode 100644 index 0000000..50c10c9 --- /dev/null +++ b/автозапуск_(startup)_в_Linux.md @@ -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 + +``` \ No newline at end of file diff --git a/индексация_файлов_Nextcloud.md b/индексация_файлов_Nextcloud.md new file mode 100644 index 0000000..9c876ee --- /dev/null +++ b/индексация_файлов_Nextcloud.md @@ -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,` diff --git a/почтовые_уведомления_на_Яндекс.txt b/почтовые_уведомления_на_Яндекс.txt new file mode 100644 index 0000000..265f58e --- /dev/null +++ b/почтовые_уведомления_на_Яндекс.txt @@ -0,0 +1,15 @@ +чтобы корректно работали почтовые уведомления с домена da2001.ru +с обслуживанием на Яндекс.почте, в настройках необходимо указать следующее: + +адрес почтового сервера — smtp.yandex.ru; +защита соединения — SSL; +порт — 587 (через 465 порт уведомления не приходят) + +Для доступа к почтовому серверу укажите ваш логин и пароль на Яндексе +(или пароль приложения, если вы включили двухфакторную аутентификацию). +Если вы настраиваете получение почты с ящика вида «login@yandex.ru», +логином является часть адреса до знака «@». Если вы используете Яндекс.Почту +для домена, в качестве логина необходимо указывать +полный адрес почтового ящика. + +