Статья Собираем устройство для автоматического анализа клиентов открытых Wi-Fi сетей

P

powermetall

Member
18.12.2019
5
11
Вступление

Открытые беспроводные сети сейчас есть практически везде, достаточно зайти в кафе, крупный магазин или поехать на общественном транспорте – везде вам предложат подключиться к открытой беспроводной сети ***_Free или аналогичной. Думаю, было бы интересно узнать о тех, кто подключен к этим сетям, какие они используют устройства, какие у них операционные системы, ПО и прочее. Можно конечно воспользоваться мобильным телефоном и специальным софтом, типа Nethunter или аналогичным, но установка Nethunter не является тривиальной задачей и не на все устройства его можно установить. В своей статье я предлагаю собрать устройство на базе микрокомпьютера Raspberry Pi Zero W, которое будет в автоматическом режиме обнаруживать открытые беспроводные сети, подключаться к ним и сканировать эти подсети с помощью Nmap. В принципе, можно делать что-то большее, но так как моя статья носит чисто образовательный характер, все прочие активности я оставлю за рамками. Как говорил Остап Бендер «Кодекс мы должны чтить!”…

Итак, зачем может потребоваться сканировать эфир на предмет открытых беспроводных сетей? При проведении тестирований на проникновение одним из векторов атак является эксплуатация уязвимостей в реализации каналов связи. Иными словами, нарушитель может просто подключиться к Ethernet розетке и попытаться проникнуть в сеть. В случае с Wi-Fi нарушитель может попытаться обнаружить открытые беспроводные сети (например, гостевые или поднятые пользователями на своих личных устройствах) и через них получить доступ к корпоративным ресурсам. Еще лучше, если можно не только обнаружить открытые сети, но и посмотреть кто к ним подключен, какие на этих узлах установлены ОС, какие порты открыты, какие версии ПО используются. И уж совсем хорошо получить готовый отчет в автоматическом режиме.

Также такие устройства могут использовать специалисты по информационной безопасности при аудите беспроводных сетей. Например, интересно, какие беспроводные сети “светятся” на территории предприятия. Добивает ли сигнал за пределы охраняемой территории? Есть ли среди них открытые? Не лишней будет также информация о том, кто пользуется этими сетями.
Думаю, мне удалось заинтересовать читателя, так что теперь можно смело приступать к реализации практической части.

Что нам потребуется

Учитывая, что мы хотим мониторить беспроводные сети, наше устройство должно быть портативным. Удобно просто включить устройство и не спешно прогуливаться по (или за) территорией, не привлекая лишнего внимания. Замечу, что описываемый далее функционал в принципе можно реализовать и с помощью мобильного телефона и Nethunter или аналогичных инструментов. Однако в случае с Nethuter есть ряд ограничений, связанных с моделью телефона, которых не будет при использовании Raspberry Pi.

Так как мы хотим собрать полноценное портативное устройство, нам потребуются аппаратные компоненты. Прежде всего, это сам микрокомпьютер Raspberry Pi Zero W, microSD карта от 8 Гб, аккумулятор (я использовал 800 мА/ч, но чем больше, тем лучше), кабель USB-microUSB, выключатель, корпус, опционально дисплей, прямые руки 8).

Навыки пайки крайне желательны, но если читатель на дух не переносит запах припоя J, то устройство можно собрать из готовых компонентов, хотя в таком случае оно будет более габаритным.

Для реализации полноценного устройства, описанного далее в статье нам потребуются следующие компоненты:

НаименованиеОписаниеСтоимостьПримечание
Микрокомпьютер Raspberry Pi Zero W 2000 р.
Аккумулятор $18-20Лучше форм-фактор для RPi Zero W.
Micro SD от 8 ГбКупить можно где угодно250 р.
Переходники micro USB to USB, USB to LAN300 р.
2.13" E-Ink дисплей для Raspberry Pi Zero 2000 р.Опционально
Штыревой соединитель PLS-4050 р.

Также не лишним будет подобрать корпус для устройства. Точные размеры корпуса будут определяться форм-фактором аккумулятора и наличием дисплея.

Собираем аппаратную часть и готовим ОС

В отличии от своего старшего брата Raspberry Pi 3/4 версия Zero не имеет видеовыхода и это немного осложнит нам жизнь, хотя установка будет аналогична “старшим” версиям. Сначала необходимо скачать последнюю версию ОС Raspbian по ссылке.


Затем нужно записать полученный образ в micro-SD карту. Для этого можно воспользоваться утилитой Image Writer.

В Интернете есть множество статей с описанием процесса записи образа ОС на micro SD карту, поэтому мы не будем подробно расписывать все шаги.

После записи ОС подключаем карту в Raspberry Pi, также подключаем его с помощью переходников к LAN, подаем питание (micro USB порт PWR), загружаемся.

pic_1.png

Далее нам необходимо выяснить, какой IP адрес получил микрокомпьютер. Проще всего посмотреть на своем маршрутизаторе, какой IP адрес был выдан устройству с именем raspberrypi. Подключаемся к этому адресу по SSH.
Реквизиты по-умолчанию pi/raspberry
Код:
sudo apt-get upgrade
sudo apt-get update
Несколько слов о питании. Будет не очень хорошо, если в процессе настройки микрокомпьютер неожиданно отключится, поэтому при настройке лучше использовать обычный блок питания с micro USB выходом, а аккумулятор подключать, когда все будет настроено.

Для подключения дисплея необходимо сначала припаять к Raspberry контакты на оба ряда контактов. Получится следующее:

pic_2.png
Далее просто подключаем дисплей к этим контактам.

Пишем скрипты

Теперь поговорим о программной начинке устройства. Нам необходимо выполнить следующие действия:
  • Просканировать эфир;
  • Найти открытые сети;
  • Подключиться к каждой из них последовательно;
  • Получить IP адрес;
  • Распарсить вывод команды ifconfig для получения значения адреса и маски для последующей передачи nmap;
  • Запустить nmap и сохранить результаты сканирования в файл.
Разберем каждый из шагов более подробно. Для сканирования эфира нам нужна команда
Код:
iwlist wlan0 scan | grep ESSID
Она вернет список доступных сетей. Ниже приведены примеры фрагментов для открытой сети и защищенной WPA2:
Bash:
root@raspberrypi:~# iwlist wlan0 scan
wlan0     Scan completed :
Cell 01 - Address: 00:**:**:**:**:43
  Channel:11
  Frequency:2.462 GHz (Channel 11)
  Quality=70/70  Signal level=-27 dBm
  Encryption key: off
  ESSID:"M******"
  Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 6 Mb/s
      9 Mb/s; 12 Mb/s; 18 Mb/s
  Bit Rates:24 Mb/s; 36 Mb/s; 48 Mb/s; 54 Mb/s
      Mode:Master
      Extra:tsf=0000000000000000
      Extra: Last beacon: 80ms ago
   Cell 05 - Address: D4:**:**:**:**:FE
       Channel:6
       Frequency:2.437 GHz (Channel 6)
       Quality=51/70  Signal level=-59 dBm
       Encryption key: on
       ESSID:"Z****"
       IE: IEEE 802.11i/WPA2 Version 1
       Group Cipher : CCMP
       Pairwise Ciphers (1) : CCMP
       Authentication Suites (1) : PSK
Нам нужны ESSID только открытых сетей, поэтому делаем выборку по слову ESSID и значению Encryption key: off.
Код:
iwlist wlan0 scan | grep -e ESSID -e "Encryption key: off"
Теперь, для подключения к найденной сети нам необходимо сформировать содержимое файла /etc/network/interfaces и рестартовать сервис networking.
Для подключения к отрытой сети файл interfaces должен иметь следующую структуру:
Bash:
auto lo
iface lo inet loopback
auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
wireless-essid название_сети
Создать такой файл можно с помощью следующего кода:
Bash:
if [ "$line" == "Encryption key: off" ]
  then
   read line
   echo "Open" $line > /home/pi/opendat
   echo $line | cut -c 8- | sed 's/.$//'
   echo "auto lo" > /etc/network/interfaces
   echo "iface lo inet loopback" >> /etc/network/interfaces
   echo "   " >> /etc/network/interfaces
   echo "   " >> /etc/network/interfaces
   echo "auto wlan0" >> /etc/network/interfaces
   echo "allow-hotplug wlan0" >> /etc/network/interfaces
   echo "iface wlan0 inet dhcp" >> /etc/network/interfaces
   echo $line | cut -c 8- | sed 's/.$//' | while read line1
   do
     echo "wireless-essid" $line1 >> /etc/network/interfaces
   done
   echo "   "
Рестартуем сервис для того, чтобы получить IP адрес:
Bash:
 service networking restart
ifconfig wlan0
Полученный адрес нам необходимо передать nmap. Для того, чтобы это сделать необходимо распарсить вывод ifconfig для того, чтобы сформировать подсеть, которую мы будем сканировать (в примере это всегда /24 подсеть) и маску подсети. Возможно, предложенный алгоритм подсчета маски не является оптимальным, поэтому читателю предлагается в комментах указать более оптимальный способ вычисления маски.

UPD:

В качестве альтернативного варианта подсчета маски предлагается следующий:
Код:
nmap --iflist | grep -A 1 DST | tail -1 | cut -d " " -f 1
Bash:
 ifconfig wlan0 | grep -e netmask | while read line2
do
  IFS=' ' read -r -a array <<< "$line2"
  netw="/24"
  echo "${array[1]}"
  echo "${array[3]}"
  if [ "${array[3]}" == "255.255.255.0" ]
   then
     echo "/24"
     IFS='.' read -r -a array0 <<< "${array[1]}"
     echo "$netw"
    fi
    if [ "${array[3]}" == "255.255.0.0" ]
     then
       echo "/16"
       IFS='.' read -r -a array0 <<< "${array[1]}"
       netw="/16"
       echo "${array0[0]}"."${array0[1]}"."${array0[2]}".0/16
      fi
      if [ "${array[3]}" == "255.255.128.0" ]
       then
        echo "/17"
        IFS='.' read -r -a array0 <<< "${array[1]}"
        netw="/17"
        echo "${array0[0]}"."${array0[1]}"."${array0[2]}".0/17
       fi
       if [ "${array[3]}" == "255.255.192.0" ]
        then
         echo "/18"
         IFS='.' read -r -a array0 <<< "${array[1]}"
         netw="/18"
         echo "${array0[0]}"."${array0[1]}"."${array0[2]}".0/18
       fi
       if [ "${array[3]}" == "255.255.224.0" ]
        then
         echo "/19"
         IFS='.' read -r -a array0 <<< "${array[1]}"
         netw="/19"
         echo "${array0[0]}"."${array0[1]}"."${array0[2]}".0/19
       fi
       if [ "${array[3]}" == "255.255.240.0" ]
        then
         echo "/20"
         IFS='.' read -r -a array0 <<< "${array[1]}"
         netw="/20"
         echo "${array0[0]}"."${array0[1]}"."${array0[2]}".0/20
       fi
       if [ "${array[3]}" == "255.255.248.0" ]
        then
         echo "/21"
         IFS='.' read -r -a array0 <<< "${array[1]}"
         netw="/21"
         echo "${array0[0]}"."${array0[1]}"."${array0[2]}".0/21
       fi
       if [ "${array[3]}" == "255.255.252.0" ]
        then
         echo "/22"
         IFS='.' read -r -a array0 <<< "${array[1]}"
         netw="/22"
         echo "${array0[0]}"."${array0[1]}"."${array0[2]}".0/22
       fi
       if [ "${array[3]}" == "255.255.254.0" ]
        then
         echo "/23"
         IFS='.' read -r -a array0 <<< "${array[1]}"
         netw="/23"
         echo "${array0[0]}"."${array0[1]}"."${array0[2]}".0/23
       fi
  done
В итоге в массиве array0 мы имеем подсеть для сканирования, а в переменной netw значение маски, которое можем передать nmap.
Код:
nmap -sV "${array0[0]}"."${array0[1]}"."${array0[2]}"."0""$netw"
В качестве примера будем определять версии установленного на узлах ПО с помощью ключа –sV.

Подключаем дисплей

В целях минимизации расхода заряда я использовал относительно дорогой экран Adafruit Eink. Технология электронных чернил позволяет существенно снизить расход заряда, так как он расходуется только на отрисовку изменений на экране.

Для начала нам необходимо скачать библиотеку Broadcom BCM 2835 для работы с GPIO. Для этого выполним следующие команды:
Bash:
wget http://www.open.com.au/mikem/bcm2835/bcm2835-1.5.tar.gz
; или, если не открывается
wget http://67.192.60.197/mikem/bcm2835/bcm2835-1.5.tar.gz
tar xvfz bcm2835-1.5.tar.gz;
cd bcm2835-1.5;
./configure;
make;
sudo make install
Теперь нам доступны несколько примеров работы с экраном. Далее я внес правки в один из файлов примеров. Код ниже будет выводить в первой строке дисплея содержимое файла /home/pi/opendat (как мы увидим далее, это ESSID открытой сети, найденной устройством).

А в самой нижней строке у нас будет “тикать” таймер, отсчитывающий, сколько устройство проработало. Это нужно для того, чтобы мы понимали, что микрокомпьютер не завис и не сел.
C:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <iostream>
#include <string>
#include <fstream>
#include <cstring>
#include <cstdio>
#include "epd2in13.h"
#include "epdpaint.h"
#include "imagedata.h"

#define COLORED      0
#define UNCOLORED    1

int main(void)
{
  time_t now;
  struct tm* timenow;
  Epd epd;

  if (epd.Init(lut_full_update) != 0) {
   printf("e-Paper init failed\n");
   return -1;
}

  unsigned char* frame_buffer = (unsigned char*)malloc(epd.width / 8 * epd.height);

  Paint paint(frame_buffer, epd.width, epd.height);
  paint.Clear(UNCOLORED);
  epd.DelayMs(2000);
  if (epd.Init(lut_partial_update) != 0) {
    printf("e-Paper init failed\n");
    return -1;
}

  char time_string[] = {'0', '0', ':', '0', '0', '\0'};
  int i=1;

  while (i<100) {
    time(&now);
    timenow = localtime(&now);
    time_string[0] = timenow->tm_min / 10 + '0';
    time_string[1] = timenow->tm_min % 10 + '0';
    time_string[3] = timenow->tm_sec / 10 + '0';
    time_string[4] = timenow->tm_sec % 10 + '0';

     i++;

     paint.Clear(UNCOLORED);
     paint.SetWidth(118);
     paint.SetHeight(255);
     paint.SetRotate(ROTATE_90);
     epd.DelayMs(500);

     /* считываем содержимое файла /home/pi/opendat
    Для последующего вывода на экран
    */

     char str[1024];
     FILE *in = fopen("/home/pi/opendat","r");
     if(in==NULL)
     {
       std::cout << "Error opendat" << std::endl;
     }
     else
     {
       fgets(str,64,in);
       fcloseall();
}      

/*
Выводим на экран первой строкой
*/
      paint.DrawStringAt(1, 0,str, &Font16, COLORED);
/*
А на последней строке у нас будет работать таймер, для того, чтобы мы понимали, что устройство работает, а не село или зависло
*/

      paint.DrawStringAt(1, 108,time_string, &Font12, COLORED);
      epd.DisplayFrame();
      epd.SetFrameMemory(paint.GetImage(), 1, 1, paint.GetWidth(), paint.GetHeight());
      epd.DelayMs(1500);
    }

    return 0;
}
Откомпилируем исходный код и запустим приложение:
Код:
make
sudo ./epd
Для того, чтобы дисплей работал непрерывно нам необходимо написать небольшой скрипт epd.sh, который каждые пять секунд будет наш откомпилированный файл epd, для обновления картинки на экране.
Bash:
#!/bin/bash
while true
do
  /home/pi/raspberrypi/bcm2835/./epd
  sleep 5
done
Чтобы скрипт начинал работать сразу, после запуска устройства пропишем его в файл /etc/rc.local.
Код:
/home/pi/./epd.sh &
Конечно, большая часть дисплея пока остается свободной, ноя предлагаю читателю самому потренироваться и вывести на экран интересующую информацию, например, полученный IP адрес, маску, подсеть, найденные узлы.

По факту наличие экрана заметно повышает эффективность использования устройства, так как сразу видно, что оно сейчас делает, какие сети сканирует и с каким результатом.

Результат

После подключения дисплея вернемся к bash-скрипту, о котором мы говорили ранее. Теперь нам необходимо в бесконечном цикле сканировать эфир, находить отрытые сети, подключаться к ним, получать IP и извлекать из вывода ifconfig необходимые, для работы nmap параметры.

Собрав все вместе, мы получаем следующий скрипт, осуществляющий сканирование в режиме бесконечного цикла.
Bash:
#!/bin/bash

while true
  do
    echo "Scanned at " $(date)
    iwlist wlan0 scan | grep -e ESSID -e "Encryption key: off" | while read line
    do
      if [ "$line" == "Encryption key: off" ]
        then
          read line
          echo "Open" $line > /home/pi/opendat
          echo $line | cut -c 8- | sed 's/.$//'
          echo "auto lo" > /etc/network/interfaces
          echo "iface lo inet loopback" >> /etc/network/interfaces
          echo "   " >> /etc/network/interfaces
          echo "   " >> /etc/network/interfaces
          echo "auto wlan0" >> /etc/network/interfaces
          echo "allow-hotplug wlan0" >> /etc/network/interfaces
          echo "iface wlan0 inet dhcp" >> /etc/network/interfaces
          echo $line | cut -c 8- | sed 's/.$//' | while read line1
          do
            echo "wireless-essid" $line1 >> /etc/network/interfaces
          done
          echo "   "
          service networking restart
          ifconfig wlan0
          ifconfig wlan0 | grep -e netmask | while read line2
          do
            IFS=' ' read -r -a array <<< "$line2"
            netw="/24"
            echo "${array[1]}"
            echo "${array[3]}"
            if [ "${array[3]}" == "255.255.255.0" ]
            then
              echo "/24"
              IFS='.' read -r -a array0 <<< "${array[1]}"
              echo "$netw"
            fi
            if [ "${array[3]}" == "255.255.0.0" ]
              then
                echo "/16"
                IFS='.' read -r -a array0 <<< "${array[1]}"
                netw="/16"
                echo "${array0[0]}"."${array0[1]}"."${array0[2]}".0/16
              fi
              if [ "${array[3]}" == "255.255.128.0" ]
                then
                  echo "/17"
                  IFS='.' read -r -a array0 <<< "${array[1]}"
                  netw="/17"
                  echo "${array0[0]}"."${array0[1]}"."${array0[2]}".0/17
               fi
               if [ "${array[3]}" == "255.255.192.0" ]
                 then
                   echo "/18"
                   IFS='.' read -r -a array0 <<< "${array[1]}"
                   netw="/18"
                   echo "${array0[0]}"."${array0[1]}"."${array0[2]}".0/18
               fi
               if [ "${array[3]}" == "255.255.224.0" ]
                 then
                   echo "/19"
                   IFS='.' read -r -a array0 <<< "${array[1]}"
                   netw="/19"
                   echo "${array0[0]}"."${array0[1]}"."${array0[2]}".0/19
               fi
               if [ "${array[3]}" == "255.255.240.0" ]
                  then
                    echo "/20"
                    IFS='.' read -r -a array0 <<< "${array[1]}"
                    netw="/20"
                    echo "${array0[0]}"."${array0[1]}"."${array0[2]}".0/20
                fi
                if [ "${array[3]}" == "255.255.248.0" ]
                   then
                     echo "/21"
                     IFS='.' read -r -a array0 <<< "${array[1]}"
                     netw="/21"
                     echo "${array0[0]}"."${array0[1]}"."${array0[2]}".0/21
                fi
                if [ "${array[3]}" == "255.255.252.0" ]
                   then
                     echo "/22"
                     IFS='.' read -r -a array0 <<< "${array[1]}"
                     netw="/22"
                     echo "${array0[0]}"."${array0[1]}"."${array0[2]}".0/22
                fi
                if [ "${array[3]}" == "255.255.254.0" ]
                   then
                     echo "/23"
                     IFS='.' read -r -a array0 <<< "${array[1]}"
                     netw="/23"
                     echo "${array0[0]}"."${array0[1]}"."${array0[2]}".0/23
                fi
                nmap -O "${array0[0]}"."${array0[1]}"."${array0[2]}"."0""$netw"
            done                  
         fi
      done
   sleep 5
done
Не забываем также добавить запуск скрипта в /etc/rc.local и перенаправить вывод в файл (мы же хотим сохранить полученные результаты). Вывод nmap можно конечно сохранять в отдельный файл средствами nmap, но мне интересен не только его отчет, но и информация о найденных сетях.
Код:
/home/pi/scan1.sh >> /home/pi/scan1.txt &
Собранное устройство имеет богатый потенциал для расширения. В приведенном примере оно лишь сканирует открытые подсети, однако при желании его функционал можно дополнить, например возможностями по аудиту паролей, анализу найденных веб сервисов, баз данных и т. д. Кроме того, при желании можно добавить Ethernet интерфейс и сканировать уже проводные сети в сценариях атак типа “Гость”, когда пентестеру предоставляется только сетевая розетка. Так что устройство можно развивать дальше.
В моем случае устройство выглядит вот так:

pic_3.png


Ссылки
  • - примеры работы с BCM 2835.
  • - русскоязычный man по Nmap.
  • Бирюков А. А, “Собираем устройства для тестов на проникновение”, ДМК Пресс, 2018
 
f22

f22

Red Team
05.05.2019
1 175
96
Огромная просьба оформить код!
Статья очень интересная, но читать код
через строку и без форматирования - просто наказание.


Из того, что увидел сразу:
while [ 1=1 ]
лучше заменить на
while true
Это банально нагляднее.

Не очень понятен этот код:
echo "iface wlan0 inet dhcp" >> /etc/network/interfaces
echo $line | cut -c 8- | sed 's/.$//' | while read line1
do
echo "wireless-essid" $line1 >> /etc/network/interfaces
done
Откуда берётся $line ?

Возможно, предложенный алгоритм подсчета маски не является оптимальным, поэтому читателю предлагается в комментах указать более оптимальный способ вычисления маски.
Самый простой способ - пользоваться самим nmap
nmap --iflist
putty_bGKN8dYGZm.png
Строку можно вычленить, например, командой
nmap --iflist | grep -A 1 DST | tail -1 | cut -d " " -f 1
192.168.1.0/24
 
  • Нравится
Реакции: g00db0y
P

powermetall

Member
18.12.2019
5
11
Откуда берётся $line ?
line мы считываем ранее
iwlist wlan0 scan | grep -e ESSID -e "Encryption key: off" | while read line
...
read line

Далее из этой строки извлекаем ESSID.

Исходный код отформатировал и поправил.
 
f22

f22

Red Team
05.05.2019
1 175
96
P

powermetall

Member
18.12.2019
5
11
Этот фрагмент кода дополнил командами из полного кода скрипта так чтобы было видно откуда берется line.

А по поводу отступов требуется, чтобы все строки кода шли подряд вообще без отступов?
 
f22

f22

Red Team
05.05.2019
1 175
96
Этот фрагмент кода дополнил командами из полного кода скрипта так чтобы было видно откуда берется line.
Если ты говоришь о структуре, тогда зачем ты вставил туда код?
Раздели их
Для подключения к отрытой сети файл interfaces должен иметь следующую структуру:
Код:
auto lo
iface lo inet loopback
auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
wireless-essid название_сети
Каким образом добавить эти строки в файл лучше указать в виде комментариев в коде.
Иначе легко запутаться.
Bash:
read line
echo "Open" $line > /home/pi/opendat
# Заполняем файл /etc/network/interfaces
echo $line | cut -c 8- | sed 's/.$//'
echo "auto lo" > /etc/network/interfaces
# Дальше идёт оставшийся код
А по поводу отступов требуется, чтобы все строки кода шли подряд вообще без отступов?
Код более читаем, когда выглядит как-то так

Bash:
if [ "$line" == "Encryption key: off" ]
then
    read line
    echo "Open" $line > /home/pi/opendat
    echo $line | cut -c 8- | sed 's/.$//'
    echo "auto lo" > /etc/network/interfaces
    echo "iface lo inet loopback" >> /etc/network/interfaces
    echo "   " >> /etc/network/interfaces
    echo "   " >> /etc/network/interfaces
    echo "auto wlan0" >> /etc/network/interfaces
    echo "allow-hotplug wlan0" >> /etc/network/interfaces
    echo "iface wlan0 inet dhcp" >> /etc/network/interfaces

    echo $line | cut -c 8- | sed 's/.$//' | while read line1
        do
            echo "wireless-essid" $line1 >> /etc/network/interfaces
        done
    echo "   "
fi
Во-первых это удобнее для восприятия, а во-вторых, скопировав его к себе, работать с ним гораздо проще.

Разные уровни вложенности обычно имеют свои отступы.
То есть, есть в цикле while есть условие if, их лучше разнести на разные уровни.
Например:
Bash:
while true; do
    if a > b; then
        echo ${a}
        sleep 5s
    fi
done
Если вложений очень много, имеет смысл выделить их в отдельную функцию.
Поддерживать в дальнейшем такой код будет проще и тебе, и другим пользователям.
 
Последнее редактирование:
  • Нравится
Реакции: explorer и pr0phet
addedie

addedie

Well-known member
04.08.2019
143
0
этот дисплей подойдет?
 
A

animi

Well-known member
06.12.2016
52
46
Интересно. Можно без дисплея. Создаешь сеть по верх bluetooth (PAN) спомощью bridge. Поднимаешь masquerade на виртуальный интерфейс вешаешь раздачу ip с телефона подключаешься по bluetooth к малинке и все! Пример скрипта для создания PAN на bluez 5 есть в сети. Можно прицепить внешний адаптер с антенной. Так на подумать)))
 
  • Нравится
Реакции: f22
P

powermetall

Member
18.12.2019
5
11
этот дисплей подойдет?
Полагаю, что нет. Ему как минимум нужен переходник для подключения к разъемам PRi и потом он вроде как заточен под STM.

Интересно. Можно без дисплея. Создаешь сеть по верх bluetooth (PAN) спомощью bridge. Поднимаешь masquerade на виртуальный интерфейс вешаешь раздачу ip с телефона подключаешься по bluetooth к малинке и все! Пример скрипта для создания PAN на bluez 5 есть в сети. Можно прицепить внешний адаптер с антенной. Так на подумать)))
Мысль действительно интересная. Спасибо.
 
Мы в соцсетях: