Интерактивный разнообразный выбор в сценарии удара

Я не думаю, что задержка требуется. Перед подавлением интерфейса необходимо смочь физически разъединиться от старого MAC-адреса. Я нахожусь на беспроводной связи в данный момент, таким образом, я не могу проверить это прямо сейчас, но смотреть на ifconfig - справка. Что-то вроде этого?:

ifconfig <interface> del <address>

На беспроводной связи, когда я разъединяюсь, я запускаю немного скрипта, который очищает все, включая MAC-адрес AP:

sudo dhcpcd --release "$INTERFACE"
sudo iwconfig "$INTERFACE" essid off
sudo iwconfig "$INTERFACE" ap off
sudo ifconfig "$INTERFACE" down
2
26.09.2014, 06:27
2 ответа

Вы ищете диалог . Это очень мощный инструмент и использует ncurses для предоставления множества опций. Я предлагаю вам прочитать его manpage. В частности, вам нужна опция -меню:

   --menu text height width menu-height [ tag item ] ...
          As its name suggests, a menu box is a dialog  box  that  can  be
          used  to present a list of choices in the form of a menu for the
          user to choose.  Choices are displayed in the order given.  Each
          menu entry consists of a tag string and an item string.  The tag
          gives the entry a name to distinguish it from the other  entries
          in the menu.  The item is a short description of the option that
          the entry represents.  The user can move between  the  menu  en‐
          tries  by  pressing the cursor keys, the first letter of the tag
          as a hot-key, or the number keys 1-9. There are menu-height  en‐
          tries  displayed  in  the menu at one time, but the menu will be
          scrolled if there are more entries than that.

          On exit the tag of the chosen menu entry will be printed on dia‐
          log's  output.  If the "--help-button" option is given, the cor‐
          responding help text will be printed if  the  user  selects  the
          help button.

К сожалению, реализовать ее в здравом уме, используя вывод команды, содержащей пробелы, довольно сложно из-за различных проблем с цитированием. Во всяком случае, мне это не удалось, и мне пришлось прибегнуть к использованию -меню. Тем не менее, она работает и делает то, что вы просили:

#!/usr/bin/env bash
tmp=$(mktemp)
IFS=
eval dialog --menu \"Please choose a filesystem:\" 50 50 10 $(lsblk -f | sed -r 's/^/"/;s/$/" " "/' | tr $'\n' ' ') 2>$tmp
D=$(tr -d '│├└─' < $tmp | sed 's/^[ \t]*//' | cut -d' ' -f1)
printf "You chose:\n%s\n" "$D"

Для более переносимого подхода, измените команду grep на

sed просто форматирует вывод lsblk так, чтобы вокруг каждой строки вывода были кавычки (это "тег" диалога), за которым следует цитируемый пробел (это "элемент" диалога), а tr заменяет новые строки пробелами и символами дерева.

Результат выглядит следующим образом:

              ┌────────────────────────────────────────────────┐
              │ Please choose a filesystem:                    │  
              │ ┌────────────────────────────────────────────┐ │  
              │ │     NAME   FSTYPE LABEL MOUNTPOINT         │ │  
              │ │     sda                                    │ │  
              │ │     ├─sda1                                 │ │  
              │ │     ├─sda2                                 │ │  
              │ │     ├─sda3              /winblows          │ │  
              │ │     ├─sda4                                 │ │  
              │ │     ├─sda5                                 │ │  
              │ │     ├─sda6              /home              │ │  
              │ │     ├─sda7              /                  │ │  
              │ │     └─sda8              [SWAP]             │ │  
              │ └────↓(+)────────────────────────────90%─────┘ │  
              │                                                │  
              ├────────────────────────────────────────────────┤  
              │           <  OK  >      <Cancel>               │  
              └────────────────────────────────────────────────┘  
2
27.01.2020, 22:05

При нормальной работе вы не можете изменять строки над курсором - они уже сброшены. Сценарий, который вы, вероятно, видели, вероятно, использовал библиотеку curses, поэтому, если вы действительно этого хотите, я бы рекомендовал использовать язык сценариев, такой как python, и использовать там библиотеку curses.

Намного проще ставить числа перед каждой строкой. Вы можете использовать эту строку awk, чтобы ставить перед ними числа. Возможно, есть более элегантный способ, но он работает. Измените регулярное выражение в соответствии со своими потребностями.

lsblk -f | awk 'BEGIN{disk=1;} /sd[a-z][1-9]+/ {print disk, ": ",$RT;disk=disk+1;next}{print "   ", $RT}'
1
27.01.2020, 22:05

Теги

Похожие вопросы