sshto
sshto

Многие, если не все, кому приходится подключаться по ssh к серверам начинают использовать ssh aliases(конфиг файлы), когда этих серверов становится больше одного. А если их больше двух наступает время автоматизации. Так появился sshto. Это моя поделка на bash, использующая dialog для визуализации ssh конфиг файлов в консоли. Фишка в том что не надо делать какой-то специальный список/конфиг/файл и т.д. и т.п. Используется ваш(и) ssh конфиг файл(ы) из коробки. Единственное что можно/нужно сделать это добавить комментарии в ваш конфиг чтобы итоговый результат выглядел более информативно(но будет работать и без них). Пример:

#Host DUMMY #Rybinsk#

Host rybserver1 #First server
HostName localhost

Host rybserver2 #Second server
HostName localhost

Host rybserver3 #Third server
HostName localhost

#Host DUMMY #Moscow#

Host moserver1 #First server
HostName localhost

Host moserver2 #Second server
HostName localhost

Host moserver3 #Third server
HostName localhost

И что из этого получается:

Вот так выглядит диалог sshto
Вот так выглядит диалог sshto

Навигация интуитивная, кнопки курсора, ввод, местами таб и спейс. Dialog поддерживает мышь. Как видно из рисунка sshto может не только подключаться но и выполнять команды "RUN COMMAND":

Выполнение команды на сервере
Выполнение команды на сервере

А в одном из последних обновлений добавлена возможность выполнять команды на группе серверов(RUN COMMAND из меню CONTENTS):

Выполнение команды на группе серверов
Выполнение команды на группе серверов

Как это сделано. Небольшой awk скриптик перелопачивает конфиги в удобоваримый формат:

...
CONFILES=$(echo ~/.ssh/{config,config*[!~]}) # SSH confiles list.
...
declare    -A      hostnames
while read -r name hostname desc; do
    case $name in
        'DUMMY') name="{ $desc }" name_length=${#name}
                 name_left=$[(40-name_length)/2] name_right=$[40-(name_left+name_length)]
                 printf -v tmp "%${name_left}s_NAME_%${name_right}s"
                 tmp=${tmp// /-}  name=${tmp//_NAME_/$name}
                 content+=( "$desc" ); desc=$(line - 20);;
           '#'*) continue;;
    esac
    hostnames["$name"]=$hostname #Create host-hostname pairs in hostnames array
    fullist+=("$name" "$desc")   #Add Host and Description to the list
done < <(awk '
/Host /{
    strt=1
    host=$2
    desc=gensub(/^.*Host .* #(.*)/, "\\1", "g", $0)
    desc=gensub(/(.*)#.*/,          "\\1", "g", desc)
    next
}
strt && host == "DUMMY"{
    hostname=$2
    print host, "DUMMY", desc
    strt=0
}
strt && /HostName /{
    hostname=$2
    print host, hostname, desc
    strt=0
}'  $CONFILES)

list=( "${fullist[@]}" )
[[ $filter ]] && new_list

#--{ Go baby, GO!) }--
first_dialog
[[ $OPT =~ name ]] && echo $target || bye

Из которого создаются списки для диалога, затем начинается dialog:

...
first_dialog(){
    group= dfilelist=
    [[ $OPT =~ name ]] && oklbl='GET NAME' extra= || oklbl='CONNECT' extra='--extra-button'
    target=$(dialog --output-fd 1 --colors $extra --help-button \
                    --extra-label  "RUN COMMAND" \
                    --help-label   "CONTENTS" \
                    --ok-label     "$oklbl" \
                    --cancel-label "EXIT" \
                    --menu "Select host to connect to. $USERNOTE" 0 0 0 "${list[@]}")
    case $target:$? in
       -*\ *\ *-:*) first_dialog ;;
               *:0) [[ $OPT =~ name ]] && return || { go_to_target; first_dialog; };;
               *:2) contents_menu;;
               *:3) second_dialog;;
               *:*) bye;;
    esac
}
...

Неожиданно получилась очень удобная штука, которой я постоянно пользуюсь в перерывах между игрой в PIU-PIU!) А один зарубежный видео блогер - Tom Lawrence даже рассказал о sshto в одном из своих видосов про ssh и вот это вот все:

Я даже не подозревал что sshto поддерживает эмодзи)

Диалог в кубе.

А недавно я начал работать над новой поделкой с использованием dialog'а - kube-dialog.
Это диалог обертка для kubectl - команды для работы с k8s кластерами.

Если у вас тоже есть, попробуйте kube-dialog, проект в стадии развития но уже довольно удобен и полезен. Как это выглядит, сначала выбираем кластер(да их может быть больше одного):

Выбор кластера в kube-dialog
Выбор кластера в kube-dialog

Затем выбираем неймспейс(namespace):

Выбор неймспейса в kube-dialog
Выбор неймспейса в kube-dialog

Можно выбрать "не выбирать" неймспейс и просто жмякнуть "All namespaces", kubectl будет выполнен с опцией "--all-namespaces". После (не)выбора неймспейса(я выбрал kube-system) открывается список объектов с которыми можно поиграть:

Выбор объекта для изучения в kube-dialog
Выбор объекта для изучения в kube-dialog

Возьмём pod для примера, откроется окно со списком подов кластера kubernetes, в неймспейсе kube-system:

Выбор пода в kube-dialog
Выбор пода в kube-dialog

В одном из последних обновлений добавлена возможность использовать лейблы(labels). Их можно вбить руками или выбрать из списка. Выбрав понравившийся под, попадаем в окно с командами доступными для данного объекта, в данном случае пода:

Действия с подом в kube-dialog
Действия с подом в kube-dialog

С подом можно делать вот это вот всё ^^^. Для примера можно посмотреть лог:

Просмотр лога пода в kube-dialog
Просмотр лога пода в kube-dialog

Идея и реализация примерно такая же как и в sshto, у вас есть k8s конфиги для kubectl(в папке ~/.kube), они и используются для kube-dialog(kd) ничего лишнего.

Вот такие вот интересные dialog'и получились. Это простые bash скрипты поэтому каждый может подогнать их под себя, добавить/убавить что-то, сделать еще удобнее. Для упрощения модификации я предусмотрел сорсинг конфайлов, для sshto это ~/.sshtorc. А для kube-dialog - ~/.kdrc. Dialog тоже можно подтюнить создав конфайл:

dialog --create-rc ~/.dialogrc
nano ~/.dialogrc

Если заинтересовал, заходите в гости в мой github пока его не прикрыли, там есть еще интересные штуки.

Творите, выдумывайте, пробуйте!)

Подписывайтесь, ставьте лайки, пальцы и вот это вот все!)

Комментарии (11)


  1. rustler2000
    19.04.2022 12:39

    Спасибо тебе за sshto!


    1. vaniacer Автор
      19.04.2022 14:24

      Пожалуйста)


      1. vaniacer Автор
        19.04.2022 16:35
        +4

        Я бы даже сказал не за sshto)


  1. thedrnic
    19.04.2022 14:33
    +1

    Для управления любым колличеством kubernetes оркестраторов, есть прекрасная утилита Lens


    1. vaniacer Автор
      19.04.2022 14:44
      +1

      Да, есть, но ведь когда-то её не было, и кубернетиса не было, а теперь есть. И теперь есть kube-dialog, позволяющий сделать это по быстренькому из консоли, всё на кончиках пальцев)


      1. thedrnic
        19.04.2022 15:03
        +3

        В отличии от sshto, которое выглядит действительно хорошо, куб-диалог выглядит очень неповоротливым.
        Например:
        - Менять пространствои имён на лету?
        - Фильтрация?
        - Сортировка?
        - Поиск?
        - Возможность одновременного редактирования/просмотра/ подключения любой сущности?

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


        1. vaniacer Автор
          19.04.2022 15:22

          Спасибо за идеи!)


          1. ErgoZru
            20.04.2022 01:15

            Для куба возможно подошёл бы лейаут в стиле среды разработки, то есть слева/справа небольшой сайдбар, например на 1/3 экрана, где список сущностей (джобы, стейты и тд), вверху выпадающий список неймспейсов, а в центральной части сделать отрисовку элементов выбранной сущности, под ней можно держать подобие консоли. То есть по сути скопировать вид куб-дашборда, ленза и тд, но в стилистики диалога. Ну и аналогичное для простого докера было бы здорово, такой локальный портейнер :) да и для ссш было бы здорово совместить такой лейаут с консолью в середине и сайдбаром (аля xshell)... но боюсь что диалог это все не потянет и нужен уже какой нибудь ncurses...


            1. vaniacer Автор
              20.04.2022 11:21

              Звучит здорово, на какой размер терминала это рассчитано? У меня все как-то скромней.


        1. vaniacer Автор
          19.04.2022 16:45

          Фильтрация по labels кстати есть.


  1. uyrij
    21.04.2022 01:23

    ✅ респект