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