init
commit
0a6b63b4e6
Binary file not shown.
Binary file not shown.
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
```
|
|
@ -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` в качестве загрузочного диска
|
|
@ -0,0 +1,91 @@
|
||||||
|
### Proxmox, подключение физического жесткого диска в виртуальную машину
|
||||||
|
|
||||||
|
1. В общем случае это можно сделать одной простой командой:
|
||||||
|
```
|
||||||
|
qm set <vm_id> -[virtio|sata|ide|scsi][№] /dev/sd[a|b|c|...]
|
||||||
|
```
|
||||||
|
где:
|
||||||
|
```
|
||||||
|
vm_id — номер виртуальной машины (в интерфейсе Proxmox указывается перед именем VM
|
||||||
|
-[virtio|sata|ide|scsi][№] — допустимый тип и номер HDD интерфейса
|
||||||
|
/dev/sd[a|b|c…] — пробрасывоемое физическое устройство
|
||||||
|
```
|
||||||
|
**Но при таком подходе может случится, что в систему прокинется не тот диск, если перепутать порты на материнской
|
||||||
|
плате, поэтому гораздо эффективней пробросить устройство по его id.**
|
||||||
|
|
||||||
|
Найдем id нашего диска:
|
||||||
|
```
|
||||||
|
ls -l /dev/disk/by-id/
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
da2001@Metromint:~$ ls -l /dev/disk/by-id/
|
||||||
|
итого 0
|
||||||
|
lrwxrwxrwx 1 root root 9 июн 9 09:58 ata-ST1000LM035-1RK172_ZDEH8TVK -> ../../sda
|
||||||
|
lrwxrwxrwx 1 root root 10 июн 9 09:58 ata-ST1000LM035-1RK172_ZDEH8TVK-part1 -> ../../sda1
|
||||||
|
lrwxrwxrwx 1 root root 10 июн 9 09:58 ata-ST1000LM035-1RK172_ZDEH8TVK-part2 -> ../../sda2
|
||||||
|
lrwxrwxrwx 1 root root 10 июн 9 09:58 ata-ST1000LM035-1RK172_ZDEH8TVK-part3 -> ../../sda3
|
||||||
|
lrwxrwxrwx 1 root root 13 июн 9 09:58 nvme-HFM256GDJTNG-8310A_NJ93N253310403M4A -> ../../nvme0n1
|
||||||
|
lrwxrwxrwx 1 root root 15 июн 9 09:58 nvme-HFM256GDJTNG-8310A_NJ93N253310403M4A-part1 -> ../../nvme0n1p1
|
||||||
|
lrwxrwxrwx 1 root root 15 июн 9 09:58 nvme-HFM256GDJTNG-8310A_NJ93N253310403M4A-part3 -> ../../nvme0n1p3
|
||||||
|
lrwxrwxrwx 1 root root 15 июн 9 09:58 nvme-HFM256GDJTNG-8310A_NJ93N253310403M4A-part4 -> ../../nvme0n1p4
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
qm set 150 -virtio2 /dev/disk/by-id/ata-ST1000LM035-1RK172_ZDEH8TVK
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Прописать в конфигурационный файл
|
||||||
|
*конфигурационные файлы виртуальных машин лежат по пути*
|
||||||
|
```
|
||||||
|
/etc/pve/qemu-server
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
root@pve:/etc/pve/qemu-server# ls -l
|
||||||
|
итого 6
|
||||||
|
-rw-r----- 1 root www-data 851 июн 9 13:06 100.conf
|
||||||
|
-rw-r----- 1 root www-data 504 янв 10 12:11 101.conf
|
||||||
|
-rw-r----- 1 root www-data 490 янв 17 11:51 102.conf
|
||||||
|
-rw-r----- 1 root www-data 310 июн 8 02:27 103.conf
|
||||||
|
-rw-r----- 1 root www-data 544 июн 9 13:06 104.conf
|
||||||
|
-rw-r----- 1 root www-data 333 мар 29 10:08 105.conf
|
||||||
|
-rw-r----- 1 root www-data 344 июн 8 02:34 106.conf
|
||||||
|
-rw-r----- 1 root www-data 731 июн 9 13:06 107.conf
|
||||||
|
-rw-r----- 1 root www-data 334 мая 14 09:16 108.conf
|
||||||
|
-rw-r----- 1 root www-data 368 июл 28 2020 109.conf
|
||||||
|
-rw-r----- 1 root www-data 330 июн 8 20:24 110.conf
|
||||||
|
-rw-r----- 1 root www-data 588 июн 9 13:06 112.conf
|
||||||
|
```
|
||||||
|
Выбираем необходимую виртуалку
|
||||||
|
```
|
||||||
|
vi 100.conf
|
||||||
|
```
|
||||||
|
Добавляем нужный диск
|
||||||
|
```
|
||||||
|
scsi1: /dev/disk/by-id/ata-ST2000VN000-1HJ164_W7200J60,backup=0
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
agent: 1,fstrim_cloned_disks=1
|
||||||
|
boot: cdn
|
||||||
|
bootdisk: scsi0
|
||||||
|
cores: 2
|
||||||
|
ide2: none,media=cdrom
|
||||||
|
memory: 4096
|
||||||
|
name: S-DNAS
|
||||||
|
net0: virtio=F6:79:BA:89:90:D5,bridge=vmbr0,firewall=1
|
||||||
|
numa: 0
|
||||||
|
onboot: 1
|
||||||
|
ostype: l26
|
||||||
|
protection: 1
|
||||||
|
scsi0: local-lvm:vm-100-disk-0,size=32G
|
||||||
|
scsi1: /dev/disk/by-id/ata-ST2000VN000-1HJ164_W7200J60,backup=0
|
||||||
|
scsi2: /dev/disk/by-id/ata-ST2000VN000-1HJ164_W7201D04,backup=0
|
||||||
|
scsihw: virtio-scsi-pci
|
||||||
|
smbios1: uuid=0a43c8e8-33f0-4472-9508-2b4b3d3c196f
|
||||||
|
sockets: 1
|
||||||
|
spice_enhancements: foldersharing=1
|
||||||
|
vga: qxl
|
||||||
|
vmgenid: 2d5bb546-186a-4b01-b469-94f3c56224be
|
||||||
|
```
|
|
@ -0,0 +1,4 @@
|
||||||
|
**образы iso по-умолчанию лежат в папке**
|
||||||
|
```
|
||||||
|
/var/lib/vz/template/iso
|
||||||
|
```
|
Binary file not shown.
Binary file not shown.
|
@ -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
|
||||||
|
```
|
||||||
|
|
||||||
|
[⬆ Наверх](#содержание)
|
|
@ -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
|
||||||
|
```
|
|
@ -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'`
|
|
@ -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`
|
||||||
|
|
|
@ -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
|
||||||
|
```
|
|
@ -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 сертификатов пока решил отказаться.
|
|
@ -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.
|
|
@ -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
|
||||||
|
```
|
|
@ -0,0 +1,13 @@
|
||||||
|
**Изменить имя хоста linux**
|
||||||
|
**Change hostname linux**
|
||||||
|
|
||||||
|
Чтобы сделать изменения постоянными нужно изменить содержимое двух файлов: `/etc/hostname` и `/etc/hosts`
|
||||||
|
```
|
||||||
|
sudo nano /etc/hostname
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
sudo nano /etc/hosts
|
||||||
|
```
|
||||||
|
|
||||||
|
Изменения вступят в силу после перезагрузки
|
Binary file not shown.
After Width: | Height: | Size: 111 KiB |
Binary file not shown.
After Width: | Height: | Size: 75 KiB |
|
@ -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.
|
||||||
|
```
|
|
@ -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
|
||||||
|
```
|
||||||
|
|
|
@ -0,0 +1,396 @@
|
||||||
|
## Linux useful
|
||||||
|
|
||||||
|
###### top
|
||||||
|
[Текущая директория сервера в браузере по адресу `http://server_ip:8000/`](#tip001)
|
||||||
|
[Запустить графическое приложение через ssh соединение `-Y`](#tip002)
|
||||||
|
[Отобразить все группы пользователя](#tip003)
|
||||||
|
[SSH соединение через промежуточный хост](#tip004)
|
||||||
|
[SSH соединение без проверки подлинности ключа и его сохранения](#tip005)
|
||||||
|
[Изменить первичную группу пользователя в текщем сеансе](#tip006)
|
||||||
|
[Сохранить man в pdf](#tip007)
|
||||||
|
[Прервать выполнение команды через 5 секунд](#tip008)
|
||||||
|
[Инфо об ОС](#tip009)
|
||||||
|
[Выполнить команду несколько раз в цикле](#tip010)
|
||||||
|
[Конвертировать изоражения heic в jpg](#tip011)
|
||||||
|
[Конвертировать jpg в pdf](#tip012)
|
||||||
|
[получить UUID диска для монтирования](#tip013)
|
||||||
|
[Сброс пароля root](#tip014)
|
||||||
|
[Проверить доступность диапазона хостов](#tip015)
|
||||||
|
[Конвертировать pdf в png](#tip016)
|
||||||
|
[Узнать загрузку процессора определённым процессом](#tip017)
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
###### tip001
|
||||||
|
:large_blue_circle: **Текущая директория сервера в браузере по адресу `http://server_ip:8000/`**
|
||||||
|
```bash
|
||||||
|
python -m SimpleHTTPServer
|
||||||
|
```
|
||||||
|
|
||||||
|
[вверх](#top)
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
###### tip002
|
||||||
|
:large_blue_circle: **Запустить графическое приложение через ssh соединение `-Y`**
|
||||||
|
*для текущей сессии*
|
||||||
|
```bash
|
||||||
|
ssh -Y pi@server_ip
|
||||||
|
```
|
||||||
|
*для всех подключений*
|
||||||
|
`ForwardX11 yes` в файле `/etc/ssh/ssh_config`
|
||||||
|
|
||||||
|
[вверх](#top)
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
###### tip003
|
||||||
|
:large_blue_circle: **Отобразить все группы пользователя**
|
||||||
|
```bash
|
||||||
|
da2001@Metromint:~$ groups da2001
|
||||||
|
da2001 : da2001 adm cdrom sudo dip plugdev kvm lpadmin sambashare wireshark libvirt
|
||||||
|
```
|
||||||
|
|
||||||
|
[вверх](#top)
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
###### tip004
|
||||||
|
:large_blue_circle: **SSH соединение через промежуточный хост**
|
||||||
|
```bash
|
||||||
|
ssh -t pi@192.168.89.2 ssh da2001@192.168.1.8
|
||||||
|
```
|
||||||
|
*сначала будет запрошен пароль от 192.168.89.2, затем от 192.168.1.8*
|
||||||
|
|
||||||
|
[вверх](#top)
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
###### tip005
|
||||||
|
:large_blue_circle: **SSH соединение без проверки подлинности ключа и его сохранения**
|
||||||
|
```bash
|
||||||
|
ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no admin@192.168.2.1
|
||||||
|
```
|
||||||
|
|
||||||
|
[вверх](#top)
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
###### tip006
|
||||||
|
:large_blue_circle: **Изменить первичную группу пользователя в текщем сеансе**
|
||||||
|
```bash
|
||||||
|
[lisa@server1 ~]$ groups
|
||||||
|
lisa account sales
|
||||||
|
[lisa@server1 ~]$ newgrp sales
|
||||||
|
[lisa@server1 ~]$ groups
|
||||||
|
sales lisa account
|
||||||
|
[lisa@server1 ~]$ touch file1
|
||||||
|
[lisa@server1 ~]$ ls -l
|
||||||
|
total 0
|
||||||
|
-rw-r--r--. 1 lisa sales 0 Feb 6 10:06 file1
|
||||||
|
```
|
||||||
|
*теперь все новые файлы будут принадлежать группе sales*
|
||||||
|
|
||||||
|
[вверх](#top)
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
###### tip007
|
||||||
|
:large_blue_circle: **Сохранить man в pdf**
|
||||||
|
```bash
|
||||||
|
man -t <программа> | ps2pdf - <filename>.pdf
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
man -t tar | ps2pdf - tar_man.pdf
|
||||||
|
```
|
||||||
|
|
||||||
|
[вверх](#top)
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
###### tip008
|
||||||
|
:large_blue_circle: **Прервать выполнение команды через 5 секунд**
|
||||||
|
```bash
|
||||||
|
timeout 5s command
|
||||||
|
```
|
||||||
|
|
||||||
|
[вверх](#top)
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
###### tip009
|
||||||
|
:large_blue_circle: **Инфо об ОС**
|
||||||
|
```bash
|
||||||
|
cat /etc/*release
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cat /etc/issue
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
uname -a
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cat /etc/lsb-release
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
da2001@Metromint:~$ neofetch
|
||||||
|
...-:::::-... da2001@Metromint
|
||||||
|
.-MMMMMMMMMMMMMMM-. ----------------
|
||||||
|
.-MMMM`..-:::::::-..`MMMM-. OS: Linux Mint 20.1 x86_64
|
||||||
|
.:MMMM.:MMMMMMMMMMMMMMM:.MMMM:. Host: VivoBook_ASUSLaptop X570DD_M570DD 1.0
|
||||||
|
-MMM-M---MMMMMMMMMMMMMMMMMMM.MMM- Kernel: 5.8.0-59-generic
|
||||||
|
`:MMM:MM` :MMMM:....::-...-MMMM:MMM:` Uptime: 1 day, 1 hour, 41 mins
|
||||||
|
:MMM:MMM` :MM:` `` `` `:MMM:MMM: Packages: 2750 (dpkg)
|
||||||
|
.MMM.MMMM` :MM. -MM. .MM- `MMMM.MMM. Shell: bash 5.0.17
|
||||||
|
:MMM:MMMM` :MM. -MM- .MM: `MMMM-MMM: Resolution: 1920x1080
|
||||||
|
:MMM:MMMM` :MM. -MM- .MM: `MMMM:MMM: DE: Cinnamon
|
||||||
|
:MMM:MMMM` :MM. -MM- .MM: `MMMM-MMM: WM: Mutter (Muffin)
|
||||||
|
.MMM.MMMM` :MM:--:MM:--:MM: `MMMM.MMM. WM Theme: Mint-Y-Dark (Mint-Y-Dark)
|
||||||
|
:MMM:MMM- `-MMMMMMMMMMMM-` -MMM-MMM: Theme: Mint-Y-Darker [GTK2/3]
|
||||||
|
:MMM:MMM:` `:MMM:MMM: Icons: Papirus-Dark [GTK2/3]
|
||||||
|
.MMM.MMMM:--------------:MMMM.MMM. Terminal: gnome-terminal
|
||||||
|
'-MMMM.-MMMMMMMMMMMMMMM-.MMMM-' CPU: AMD Ryzen 5 3500U with Radeon Vega Mobile Gfx (8) @ 2.100GHz
|
||||||
|
'.-MMMM``--:::::--``MMMM-.' GPU: NVIDIA GeForce GTX 1050 Mobile
|
||||||
|
'-MMMMMMMMMMMMM-' GPU: AMD ATI 05:00.0 Picasso
|
||||||
|
``-:::::-`` Memory: 4924MiB / 5952MiB
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
[вверх](#top)
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
###### tip010
|
||||||
|
:large_blue_circle: **Выполнить команду несколько раз в цикле**
|
||||||
|
```bash
|
||||||
|
da2001@Metromint:~$ for i in {1..5}; do echo $i; done
|
||||||
|
1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
4
|
||||||
|
5
|
||||||
|
```
|
||||||
|
*выполнение скрипта с параметрами в цикле*
|
||||||
|
```bash
|
||||||
|
for i in {1..20}; do ./wlt_start.py -c config_m716.cfg; done
|
||||||
|
```
|
||||||
|
|
||||||
|
[вверх](#top)
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
###### tip011
|
||||||
|
:large_blue_circle: **Конвертировать изоражения heic в jpg**
|
||||||
|
```bash
|
||||||
|
sudo apt-get install libheif-examples
|
||||||
|
```
|
||||||
|
*для конвертации одного изображения*
|
||||||
|
```bash
|
||||||
|
heif-convert IMG_1234.HEIC IMG_1234.jpg
|
||||||
|
```
|
||||||
|
*для конвертации всех изображений в папке*
|
||||||
|
```bash
|
||||||
|
mkdir jpg
|
||||||
|
for file in *.heic; do heif-convert $file ./jpg/${file/%.heic/.jpg}; done
|
||||||
|
```
|
||||||
|
|
||||||
|
[вверх](#top)
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
###### tip012
|
||||||
|
:large_blue_circle: **Конвертировать jpg в pdf**
|
||||||
|
*необходим установленный ImageMagick*
|
||||||
|
```bash
|
||||||
|
sudo apt install imagemagick
|
||||||
|
```
|
||||||
|
*для конвертации одного изображения*
|
||||||
|
```bash
|
||||||
|
convert image.jpg out.pdf
|
||||||
|
```
|
||||||
|
*для конвертации нескольких изображений*
|
||||||
|
```bash
|
||||||
|
convert image1.jpg image2.jpg image3.jpg out.pdf
|
||||||
|
```
|
||||||
|
***если в процессе конвертации будет получено сообщение об ошибке***
|
||||||
|
```bash
|
||||||
|
convert: attempt to perform an operation not allowed by the security policy `PDF' @ error/constitute.c/IsCoderAuthorized/408.
|
||||||
|
```
|
||||||
|
в файле `/etc/ImageMagick-7/policy.xml` необходимо изменить директиву доступа
|
||||||
|
*название папки ImageMagick-7 может отличаться в зависимости от установленной версии*
|
||||||
|
между тегами `<policymap>` и `</policymap>`
|
||||||
|
добавить/отредактировать
|
||||||
|
```bash
|
||||||
|
<policy domain="coder" rights="read | write" pattern="PDF" />
|
||||||
|
```
|
||||||
|
|
||||||
|
[вверх](#top)
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
###### tip013
|
||||||
|
:large_blue_circle: **получить UUID диска для монтирования**
|
||||||
|
**Вариант 1**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
lsblk -n -o uuid /dev/sda1
|
||||||
|
```
|
||||||
|
-n - не выводить заголовки
|
||||||
|
-o - отображаемое поле
|
||||||
|
*таким образом, для раздела с ФС ext4, запись в fstab можно добавить таким образом*
|
||||||
|
```bash
|
||||||
|
mkdir /mntdir
|
||||||
|
|
||||||
|
UUID=`lsblk -n -o uuid /dev/sda1`
|
||||||
|
sudo bash -c 'echo "UUID=$UUID /mntdir ext4 defaults 0 0" >> /etc/fstab'
|
||||||
|
```
|
||||||
|
|
||||||
|
**Вариант 2**
|
||||||
|
```bash
|
||||||
|
[root@server1 ~]# blkid -o export /dev/sda2 | grep '^UUID'
|
||||||
|
UUID=d056212f-b1ea-4bc5-ba4e-99d036e5531e
|
||||||
|
```
|
||||||
|
*таким образом, можно перенаправить вывод в `/etc/fstab` и руками дополнить параметры монтирования*
|
||||||
|
```bash
|
||||||
|
blkid -o export /dev/sda2 | grep '^UUID' >> /etc/fstab
|
||||||
|
```
|
||||||
|
|
||||||
|
[вверх](#top)
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
|
||||||
|
###### tip014
|
||||||
|
:large_blue_circle: **Сброс пароля root**
|
||||||
|
|
||||||
|
**CentOS/RedHat Linux**
|
||||||
|
1. В самом начале загрузки системы, когда появляется меню GRUB, необходимо нажать `e`, чтобы попасть в настройку загрузки
|
||||||
|
2. В строке загрузки ядра, которая начинается со слова `linux` в конец добавить `rd.break`, затем нажать Ctrl+x, для применения сделанных настроек и загрузки системы (внесенные изменения действуют только в текущей сессии загрузки)
|
||||||
|
3. После появления приглашения консоли необходимо получить доступ к образу системы
|
||||||
|
```bash
|
||||||
|
mount -o remount,rw /sysroot
|
||||||
|
```
|
||||||
|
4. Изменить корневой каталог
|
||||||
|
```bash
|
||||||
|
chroot /sysroot
|
||||||
|
```
|
||||||
|
5. Теперь можно изменить пароль root
|
||||||
|
```bash
|
||||||
|
passwd
|
||||||
|
```
|
||||||
|
будет предложено ввести новый пароль дважды.
|
||||||
|
6. Поскольку на ранней стадии загрузки SELinux еще не был активирован, тип контекста в `/etc/shadow` будет перепутан. Если сейчас перезагрузиться, никто не сможет войти в систему. Поэтому необходимо убедиться, что тип контекста установлен правильно. Для этого на этом этапе нужно загрузить политику SELinux с помощью команды
|
||||||
|
```bash
|
||||||
|
load_policy -i
|
||||||
|
```
|
||||||
|
7. Теперь нужно вручную установить правильный тип контекста в `/etc/shadow`.
|
||||||
|
```bash
|
||||||
|
chcon -t shadow_t /etc/shadow
|
||||||
|
```
|
||||||
|
**вместо 6,7 пунктов можно просто в корне создать файл `.autorelabel`**
|
||||||
|
```bash
|
||||||
|
touch /.autorelabel
|
||||||
|
```
|
||||||
|
|
||||||
|
8. Всё, после перезагрузки, у root будет новый пароль.
|
||||||
|
*для перезагрузки в данном режиме необходимо дважды ввести `reboot -f` или Ctrl+d*
|
||||||
|
```bash
|
||||||
|
reboot -f
|
||||||
|
```
|
||||||
|
|
||||||
|
**Debian**
|
||||||
|
1. В самом начале загрузки системы, когда появляется меню GRUB, необходимо нажать `e`, чтобы попасть в настройку загрузки
|
||||||
|
2. В строке загрузки ядра, которая начинается со слова `linux` в конец добавить `rd.break`, затем нажать Ctrl+x, для применения сделанных настроек и загрузки системы (внесенные изменения действуют только в текущей сессии загрузки)
|
||||||
|
3. После появления приглашения консоли необходимо получить доступ к образу системы
|
||||||
|
```bash
|
||||||
|
mount -o remount,rw /
|
||||||
|
```
|
||||||
|
4. Теперь можно изменить пароль root
|
||||||
|
```bash
|
||||||
|
passwd
|
||||||
|
```
|
||||||
|
будет предложено ввести новый пароль дважды.
|
||||||
|
5. Всё, после перезагрузки, у root будет новый пароль.
|
||||||
|
*для перезагрузки в данном режиме необходимо дважды ввести `reboot -f` или Ctrl+d*
|
||||||
|
```bash
|
||||||
|
reboot -f
|
||||||
|
```
|
||||||
|
|
||||||
|
[вверх](#top)
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
###### tip015
|
||||||
|
:large_blue_circle: **Проверить доступность диапазона хостов**
|
||||||
|
```bash
|
||||||
|
for i in {10..13}; do ping -c 2 192.168.1.$i > /dev/null && echo 192.168.1.$i - доступен || echo 192.168.1.$i - НЕ доступен; done
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
[da2001@co1 ~]$ for i in {10..13}; do ping -c 2 192.168.1.$i > /dev/null && echo 192.168.1.$i - доступен || echo 192.168.1.$i - НЕ доступен; done
|
||||||
|
192.168.1.10 - доступен
|
||||||
|
192.168.1.11 - доступен
|
||||||
|
192.168.1.12 - доступен
|
||||||
|
192.168.1.13 - НЕ доступен
|
||||||
|
```
|
||||||
|
|
||||||
|
[вверх](#top)
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
###### tip016
|
||||||
|
:large_blue_circle: **Конвертировать pdf в png**
|
||||||
|
```bash
|
||||||
|
pdftoppm input.pdf outputname -png
|
||||||
|
```
|
||||||
|
*в результате каждая страница в PDF будет сохранена в формате outputname-01.png, где 01 будет номером страницы*
|
||||||
|
**Конвертировать одну страницу или диапазон**
|
||||||
|
```bash
|
||||||
|
pdftoppm input.pdf outputname -png -f {page} -singlefile
|
||||||
|
```
|
||||||
|
*Измените `{page}` на номер страницы. Он проиндексирован как 1, поэтому `-f 1` будет первой страницей.*
|
||||||
|
|
||||||
|
*Если вы хотите работать с диапазоном страниц, вы также можете указать номер для флага `-l` (последняя страница), поэтому при использовании `-f 1 -l 30` будут указаны страницы от 1 до 30.*
|
||||||
|
|
||||||
|
**Указать разрешение преобразованного изображения**
|
||||||
|
*Разрешение по умолчанию для этой команды составляет 150 точек на дюйм.*
|
||||||
|
|
||||||
|
*Чтобы увеличить разрешение преобразованного PDF-файла, добавьте параметры `-rx` {разрешение} и `-ry` {разрешение}.*
|
||||||
|
```bash
|
||||||
|
pdftoppm input.pdf outputname -png -rx 300 -ry 300
|
||||||
|
```
|
||||||
|
|
||||||
|
[вверх](#top)
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
###### tip017
|
||||||
|
:large_blue_circle: **Узнать загрузку процессора определённым процессом**
|
||||||
|
**ps**
|
||||||
|
*по имени процесса*
|
||||||
|
```bash
|
||||||
|
ps -C iperf -o %cpu=
|
||||||
|
```
|
||||||
|
*по номеру процесса*
|
||||||
|
```bash
|
||||||
|
ps -p 23635 -o %cpu=
|
||||||
|
```
|
||||||
|
или
|
||||||
|
```bash
|
||||||
|
ps -p $(pgrep iperf) -o %cpu=
|
||||||
|
```
|
||||||
|
**top**
|
||||||
|
```bash
|
||||||
|
top -b -n 2 -d 0.2 -p PID_ID | tail -1 | awk '{print $9}'
|
||||||
|
```
|
||||||
|
**Нагрузить процессор для проверки**
|
||||||
|
```bash
|
||||||
|
cat /dev/zero > /dev/null
|
||||||
|
```
|
||||||
|
|
||||||
|
[вверх](#top)
|
|
@ -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
|
||||||
|
```
|
|
@ -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
|
||||||
|
```
|
||||||
|
коммутатор применит настройки и перезагрузится
|
|
@ -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 модемах из детства :)*
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
### nano
|
||||||
|
|
||||||
|
**показать/скрыть номера строк**
|
||||||
|
в латинской раскладке **Alt + Shift + 3**
|
||||||
|
|
||||||
|
**номера строк отображаются по умолчанию**
|
||||||
|
в домашней папке пользователя создать/отредактировать файл **.nanorc**, добавить
|
||||||
|
```
|
||||||
|
set linenumbers
|
||||||
|
```
|
||||||
|
|
||||||
|
**переход к определенной строке**
|
||||||
|
Alt + G
|
||||||
|
_работает не во всех эмуляторах терминала (Gnome connection manager)_
|
|
@ -0,0 +1 @@
|
||||||
|
/var/lib/plexmediaserver/Library/Application Support/Plex Media Server/Plug-ins
|
|
@ -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)
|
||||||
|
|
||||||
|
***
|
|
@ -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
|
||||||
|
```
|
|
@ -0,0 +1,191 @@
|
||||||
|
# Принт-сервер и сетевой сканер на Raspberry PI
|
||||||
|
|
||||||
|
_МФУ Samsung SCX3405W_
|
||||||
|
|
||||||
|
## Печать
|
||||||
|
|
||||||
|
Подразделени Samsung, которое занималось производством принтером было куплено компанией HP, поэтому справедливо установить драйвера HP и свободные драйвера
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install hplip printer-driver-splix -y
|
||||||
|
```
|
||||||
|
|
||||||
|
Установить службу печати линукс CUPS
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo apt-get install cups -y
|
||||||
|
```
|
||||||
|
|
||||||
|
Необходимо добавить пользователя в группу lpadmin
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo usermod -a -G lpadmin da2001
|
||||||
|
sudo reboot
|
||||||
|
```
|
||||||
|
|
||||||
|
Следующим этапом необходимо отредактировать конфигурационный файл службы печати
|
||||||
|
|
||||||
|
```bash
|
||||||
|
vim /etc/cups/cupsd.conf
|
||||||
|
```
|
||||||
|
|
||||||
|
строку `Listen localhost:631` необходимо изменить на `Port 631`
|
||||||
|
|
||||||
|
добваить две строки
|
||||||
|
|
||||||
|
```
|
||||||
|
BrowseRemoteProtocols CUPS dnssd
|
||||||
|
BrowseAddress @LOCAL
|
||||||
|
```
|
||||||
|
|
||||||
|
Внести изменения в секцию Location, привести к виду:
|
||||||
|
|
||||||
|
```
|
||||||
|
<Location />
|
||||||
|
Order allow,deny
|
||||||
|
Allow all
|
||||||
|
</Location>
|
||||||
|
```
|
||||||
|
|
||||||
|
В секции Location /admin закомментировать строку `Order allow,deny`
|
||||||
|
|
||||||
|
```
|
||||||
|
<Location /admin>
|
||||||
|
</Location>
|
||||||
|
```
|
||||||
|
|
||||||
|
Перезапустить службу печати
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo systemctl restart cups
|
||||||
|
```
|
||||||
|
|
||||||
|
Если всё настроено верно, должен отобразиться web-интрефейс https://print-server-ip:631
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
На вкладке Администрирование необходимо добавить новый принтер.
|
||||||
|
В случае с 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
|
||||||
|
```
|
|
@ -0,0 +1,4 @@
|
||||||
|
**Вывести серийный номер Raspberry в консоль**
|
||||||
|
```
|
||||||
|
cat /proc/cpuinfo | grep Serial | cut -d' ' -f2
|
||||||
|
```
|
|
@ -0,0 +1,52 @@
|
||||||
|
### Статический маршрут на Raspberry Pi
|
||||||
|
|
||||||
|
**синтаксис ip ro**
|
||||||
|
```bash
|
||||||
|
ip route add <IP/Net> via <Gateway IP>
|
||||||
|
```
|
||||||
|
Все параметры можно посмотреть `ip route help`
|
||||||
|
|
||||||
|
Пример:
|
||||||
|
```bash
|
||||||
|
ip ro add 192.168.2.0/24 via 192.168.0.1
|
||||||
|
ip ro add 192.168.3.159/32 via 192.168.0.1
|
||||||
|
```
|
||||||
|
*в команде ip можно использовать сокращенный синтаксис ip ro … в место ip route …*
|
||||||
|
Для удаления статического маршрута используйте **del** вместо **add**
|
||||||
|
|
||||||
|
Добавить маршрут по умолчанию
|
||||||
|
```bash
|
||||||
|
ip route add default via 10.7.0.1 dev enp1s0
|
||||||
|
```
|
||||||
|
маршрут через `10.7.0.1` (допустим наш роутер) через интерфейс с именем `enp1s0`
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
**Постоянный статический маршрут**
|
||||||
|
```bash
|
||||||
|
pi@raspberrypi:~ $ uname -a
|
||||||
|
Linux raspberrypi 4.19.57-v7+ #1244 SMP Thu Jul 4 18:45:25 BST 2019 armv7l GNU/Linux
|
||||||
|
pi@raspberrypi:~ $ lsb_release -a
|
||||||
|
No LSB modules are available.
|
||||||
|
Distributor ID: Raspbian
|
||||||
|
Description: Raspbian GNU/Linux 10 (buster)
|
||||||
|
Release: 10
|
||||||
|
Codename: buster
|
||||||
|
```
|
||||||
|
|
||||||
|
*чтобы маршрут сохранился после перезагрузки, его необходимо добавить в папку `/lib/dhcpcd/dhcpcd-hooks/`*
|
||||||
|
*по-умолчанию, в этой папке уже есть несколько конфигурационных файлов, можно воспользоваться ими или создать свой*
|
||||||
|
```bash
|
||||||
|
pi@raspberrypi:~ $ cat /lib/dhcpcd/dhcpcd-hooks/
|
||||||
|
01-test 02-dump 10-wpa_supplicant 20-resolv.conf 30-hostname 50-ntp.conf 90-static-routes.conf
|
||||||
|
```
|
||||||
|
Как видно из названия, статические маршруты описываются в этом файле `90-static-routes.conf`
|
||||||
|
*по-умолчанию, файл пустой*
|
||||||
|
Добавим маршрут
|
||||||
|
```bash
|
||||||
|
pi@raspberrypi:~ $ cat /lib/dhcpcd/dhcpcd-hooks/90-static-routes.conf
|
||||||
|
# route to inband management test nets
|
||||||
|
|
||||||
|
ip route add 10.254.0.0/16 via 192.168.90.100
|
||||||
|
|
||||||
|
```
|
|
@ -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`
|
|
@ -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
|
||||||
|
```
|
|
@ -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
|
||||||
|
```
|
||||||
|
*для вступления изменений в силу необходимо перелогиниться.*
|
|
@ -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
|
||||||
|
```
|
|
@ -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)
|
||||||
|
|
||||||
|
***
|
File diff suppressed because it is too large
Load Diff
|
@ -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
|
||||||
|
```
|
|
@ -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)'
|
||||||
|
```
|
|
@ -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писок поддерживаемых команд
|
|
@ -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 и т.д.
|
|
@ -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
|
||||||
|
```
|
||||||
|
|
|
@ -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
|
||||||
|
```
|
|
@ -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
|
||||||
|
```
|
|
@ -0,0 +1,10 @@
|
||||||
|
#### Маршрутизация (Route)
|
||||||
|
**Включить маршрутизацию трафика**
|
||||||
|
```bash
|
||||||
|
sudo nano /etc/sysctl.conf
|
||||||
|
```
|
||||||
|
раскомментировать строку `net.ipv4.ip_forward=1`
|
||||||
|
перезагрузить raspberry
|
||||||
|
```bash
|
||||||
|
sudo reboot
|
||||||
|
```
|
|
@ -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
|
|
@ -0,0 +1,91 @@
|
||||||
|
## Настройка VNC Ubuntu Server 20.04 Rspberry PI 4
|
||||||
|
|
||||||
|
*Установку и настройку ОС выполнял по документации*
|
||||||
|
[How to install Ubuntu on your Raspberry PI](https://ubuntu.com/tutorials/how-to-install-ubuntu-on-your-raspberry-pi#1-overview)
|
||||||
|
|
||||||
|
**Установим DE**
|
||||||
|
```bash
|
||||||
|
sudo apt update
|
||||||
|
sudo apt upgrade
|
||||||
|
sudo apt install xubuntu-desktop
|
||||||
|
sudo reboot
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
**TightVNC Server**
|
||||||
|
*За основу взял эти статьи:*
|
||||||
|
[Установка и настройка VNC в Ubuntu 20.04](https://www.8host.com/blog/ustanovka-i-nastrojka-vnc-v-ubuntu-20-04/)
|
||||||
|
[Как настроить и использовать сервер TigerVNC в Linux](https://zalinux.ru/?p=3905)
|
||||||
|
*TigerVNC настроить не получилось, сервер не пускал к себе никого*
|
||||||
|
|
||||||
|
`sudo apt install tightvncserver`
|
||||||
|
|
||||||
|
*при первом запуске нужно задать пароль*
|
||||||
|
`vncserver`
|
||||||
|
|
||||||
|
*Если в будущем понадобиться изменить пароль или добавить пароль для просмотра, это можно сделать с помощью команды vncpasswd:*
|
||||||
|
`vncpasswd`
|
||||||
|
|
||||||
|
*При первом запуске VNC использует порт 5901. Чтобы изменить настройки сервера VNC, нужно остановить экземпляр, использующий порт 5901.*
|
||||||
|
`vncserver -kill :1`
|
||||||
|
|
||||||
|
*Резервная копия файла xstartup:*
|
||||||
|
`mv ~/.vnc/xstartup ~/.vnc/xstartup.bak`
|
||||||
|
|
||||||
|
*Затем создать новый файл xstartup*
|
||||||
|
`nano ~/.vnc/xstartup`
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
PATH=/usr/bin:/usr/sbin
|
||||||
|
unset SESSION*MANAGER
|
||||||
|
unset DBUS*SESSION*BUS*ADDRESS
|
||||||
|
exec ЗАПУСК &
|
||||||
|
```
|
||||||
|
*Вместо слова `ЗАПУСК` должен быть указан исполнимый файл, запускающий X сессию.*
|
||||||
|
|
||||||
|
*Для Cinnamon:* `cinnamon-session-cinnamon`
|
||||||
|
*Для XFCE:* `startxfce4`
|
||||||
|
*Для GNOME:* `/usr/bin/gnome-session`
|
||||||
|
*Для Kodi:* `kodi-standalone`
|
||||||
|
*Для Mate:* `mate-session`
|
||||||
|
*Для lxqt:* `startlxqt`
|
||||||
|
*Узнать исполняемый файл для любого окружения рабочего стола установленного в системе -* `ls /usr/share/xsessions/`
|
||||||
|
*В этой папке лежат файлы с расширением `.desktop`, например:*
|
||||||
|
`cinnamon2d.desktop cinnamon.desktop gnome.desktop gnome-xorg.desktop kodi.desktop`
|
||||||
|
*Открыть любой, найти там строку, которая начинается на «Exec», например для файла xfce.desktop:*
|
||||||
|
`Exec=cinnamon-session-cinnamon`
|
||||||
|
*сделать файл исполняемым:* `chmod +x ~/.vnc/xstartup`
|
||||||
|
|
||||||
|
**Настройка VNC как сервиса systemd**
|
||||||
|
`sudo nano /etc/systemd/system/vncserver@.service`
|
||||||
|
```bash
|
||||||
|
[Unit]
|
||||||
|
Description=Start TightVNC server at startup
|
||||||
|
After=syslog.target network.target
|
||||||
|
[Service]
|
||||||
|
Type=forking
|
||||||
|
User=da2001
|
||||||
|
Group=da2001
|
||||||
|
WorkingDirectory=/home/da2001
|
||||||
|
PIDFile=/home/da2001/.vnc/%H:%i.pid
|
||||||
|
ExecStartPre=-/usr/bin/vncserver -kill :%i > /dev/null 2>&1
|
||||||
|
ExecStart=/usr/bin/vncserver -depth 24 -geometry 1280x720 :%i
|
||||||
|
ExecStop=/usr/bin/vncserver -kill :%i
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
```
|
||||||
|
*сохранить, закрыть*
|
||||||
|
|
||||||
|
*Затем сообщите системе про новый юнит-файл.*
|
||||||
|
`sudo systemctl daemon-reload`
|
||||||
|
*И включите его:*
|
||||||
|
`sudo systemctl enable vncserver@1.service`
|
||||||
|
*Цифра 1, идущая за @, определяет, какой номер дисплея должен отображаться в сервисе, в этом случае это значение по умолчанию :1.*
|
||||||
|
*Остановите текущий экземпляр сервера VNC, если он еще запущен.*
|
||||||
|
`vncserver -kill :1`
|
||||||
|
*Теперь попробуйте запустить его как любой другой сервис systemd:*
|
||||||
|
`sudo systemctl start vncserver@1`
|
||||||
|
*Чтобы убедиться, что сервер запущен, проверьте его состояние:*
|
||||||
|
`sudo systemctl status vncserver@1`
|
Binary file not shown.
Binary file not shown.
|
@ -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 помогло
|
|
@ -0,0 +1,82 @@
|
||||||
|
### Образ SD-карты с помощью dd
|
||||||
|
|
||||||
|
_Чтобы размер образа занимал как можно меньше места и, соответственно быстрее создавался, необходимо на SD-карте уменьшить размер раздела (отрезать всё свободное место), т.к. в создаваемый образ оно тоже попадает_
|
||||||
|
|
||||||
|
_Уменьшить размер раздела можно с помощью стандартной утилиты **Диски** (Linux Mint), **Gparted**, **parted**_
|
||||||
|
|
||||||
|
1. Расчет размера разделов
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo fdisk -l /dev/sdb
|
||||||
|
```
|
||||||
|
|
||||||
|
вывод будет примерно такой:
|
||||||
|
|
||||||
|
Диск /dev/sdb: 29,29 GiB, 31439454208 байт, 61405184 секторов
|
||||||
|
Disk model: Card Reader
|
||||||
|
Единицы: секторов по 1 * 512 = 512 байт
|
||||||
|
Размер сектора (логический/физический): 512 байт / 512 байт
|
||||||
|
Размер I/O (минимальный/оптимальный): 512 байт / 512 байт
|
||||||
|
Тип метки диска: dos
|
||||||
|
Идентификатор диска: 0x1238ae1a
|
||||||
|
|
||||||
|
Устр-во Загрузочный начало Конец Секторы Размер Идентификатор Тип
|
||||||
|
/dev/sdb1 8192 532479 524288 256M c W95 FAT32 (LBA)
|
||||||
|
/dev/sdb2 532480 5279743 4747264 2,3G 83 Linux
|
||||||
|
|
||||||
|
Обратим внимание на 2 параметра:
|
||||||
|
Конец - **5279743** (это последний сектор нашего раздела)</br>
|
||||||
|
Размер секторов - **Единицы: секторов по 1 \* 512 = 512 байт**</br>
|
||||||
|
Таким образом нам необходимо сохранить:</br>
|
||||||
|
5279743 + 1 (первый сектор начинается с 0) = 5279744 секторов</br>
|
||||||
|
5279744 \* 512 (размер сектора) = 2703228928 байт</br>
|
||||||
|
2703228928 / 1024 / 1024 = 2578 Мб (обязательно округляем в большую сторону)</br>
|
||||||
|
|
||||||
|
2. Создание образа
|
||||||
|
_необходимо запустить запись с нужными параметрами_
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo dd if=/dev/sdb of=$HOME/Backup/image.img bs=1M count=2578 conv=noerror,sync status=progress
|
||||||
|
```
|
||||||
|
|
||||||
|
либо с учетом пустого места (без параметра count)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo dd if=/dev/sdb of=$HOME/Backup/image.img bs=1M conv=noerror,sync status=progress
|
||||||
|
```
|
||||||
|
|
||||||
|
if=/dev/sdb - откуда
|
||||||
|
of=/$HOME/Backup/image.img - куда
|
||||||
|
bs=1M - размер одного блока при передаче данных (влияет на скорость записи)
|
||||||
|
|
||||||
|
с - один символ;
|
||||||
|
b - 512 байт;
|
||||||
|
kB - 1000 байт;
|
||||||
|
K - 1024 байт;
|
||||||
|
MB - 1000 килобайт;
|
||||||
|
M - 1024 килобайт;
|
||||||
|
GB - 1000 мегабайт;
|
||||||
|
G - 1024 мегабайт.
|
||||||
|
|
||||||
|
count=2578 - количество записываемых блоков
|
||||||
|
conv=noerror,sync - norerror -игнорировать ошибки, sync -записывать 0 в ошибочные секторы, чтобы не нарушить структуру
|
||||||
|
status=progress - выводить в консоль сведения о процессе записи
|
||||||
|
|
||||||
|
образ можно сразу сжать при создании
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo dd if=/dev/sdb bs=1M count=2578 conv=noerror,sync | gzip -c > /$HOME/Backup/image.img.gz
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Восстановление образа
|
||||||
|
если образ создавали без сжатия
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo dd if=$HOME/Backup/image.img of=/dev/sdb bs=1M conv=noerror,sync status=progress
|
||||||
|
```
|
||||||
|
|
||||||
|
если создавали со сжатием
|
||||||
|
|
||||||
|
```bash
|
||||||
|
gunzip -c $HOME/Backup/image.img.gz | sudo dd of=/dev/sdb conv=noerror,sync status=progress
|
||||||
|
```
|
|
@ -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
|
||||||
|
```
|
||||||
|
Обновление ключей закончено.
|
|
@ -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
|
||||||
|
```
|
||||||
|
После перезагрузки видим, что-то типа:
|
||||||
|

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