В последнее время часто приходится ходить по ssh на разные машины. Ситуация осложняется еще и тем, что некоторые из них недоступны извне, так что на них приходится заходить через другие.
Ну имеются, допустим, машины outside1, outside2, доступные извне, а также outside3, outside4, доступные только с outside2
В обычной ситуации чтобы получить шелл на машине outside3, нужно открыть терминал, сделать ssh outside1, набрать пароль, потом в появившемся шелле сделать ssh outside3, набрать второй пароль. Долго и мучительно.
Для уменьшения количества нажатий на клавиатуру было решено использовать dmenu, а чтобы еще уменьшить гемор - решено было использовать возможность ssh исполнять команду после логина вместо вызова шелла (например, ssh server1 ps ax выведет список процессов на server1)
Однако подход в лоб: ssh outside1 ssh outside3 не принес результата, так как ssh по умолчанию не заводит терминала для исполнения команды ( в отличие от случая, когда вызывается шелл):
ssh outside1 tty
not a tty
Экспресс-раскурка man ssh показала наличие опции -t, которая решают задачу:
ssh -t outside1 tty
/dev/pts/51
Все эти соображения привели к следующему скрипту:
#!/bin/sh
machines="outside1\noutside2\noutside3\noutside4"
selected=`echo -e $machines | dmenu -l 6 -p "ssh "`
case $selected in
'outside1' )
urxvt -e ssh outside1
;;
'outside2' )
urxvt -e ssh outside2
;;
#Дальше следи за руками:
'outside3' )
urxvt -e ssh -t outside1 ssh outside3
;;
'outside4' )
urxvt -e ssh -t outside1 ssh outside4
;;
esac
Этот скрипт вешается на хоткей. По нажатию хоткея появляется менюшка со списком машин, после выбора запускается окно, где, после ввода пароля, будет шелл нужной нам машины. При замене ввода пароля сертификатами все становится еще красивей.