Многие, если не все, кому приходится подключаться по 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
И что из этого получается:
Навигация интуитивная, кнопки курсора, ввод, местами таб и спейс. 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, проект в стадии развития но уже довольно удобен и полезен. Как это выглядит, сначала выбираем кластер(да их может быть больше одного):
Затем выбираем неймспейс(namespace):
Можно выбрать "не выбирать" неймспейс и просто жмякнуть "All namespaces", kubectl будет выполнен с опцией "--all-namespaces". После (не)выбора неймспейса(я выбрал kube-system) открывается список объектов с которыми можно поиграть:
Возьмём pod для примера, откроется окно со списком подов кластера kubernetes, в неймспейсе kube-system:
В одном из последних обновлений добавлена возможность использовать лейблы(labels). Их можно вбить руками или выбрать из списка. Выбрав понравившийся под, попадаем в окно с командами доступными для данного объекта, в данном случае пода:
С подом можно делать вот это вот всё ^^^. Для примера можно посмотреть лог:
Идея и реализация примерно такая же как и в sshto, у вас есть k8s конфиги для kubectl(в папке ~/.kube), они и используются для kube-dialog(kd) ничего лишнего.
Вот такие вот интересные dialog'и получились. Это простые bash скрипты поэтому каждый может подогнать их под себя, добавить/убавить что-то, сделать еще удобнее. Для упрощения модификации я предусмотрел сорсинг конфайлов, для sshto это ~/.sshtorc. А для kube-dialog - ~/.kdrc. Dialog тоже можно подтюнить создав конфайл:
dialog --create-rc ~/.dialogrc
nano ~/.dialogrc
Если заинтересовал, заходите в гости в мой github пока его не прикрыли, там есть еще интересные штуки.
Творите, выдумывайте, пробуйте!)
Подписывайтесь, ставьте лайки, пальцы и вот это вот все!)