ssh-туннели (скрипт подключения)

Обсуждение настройки и работы сервисов, резервирования, сетевых настроек и вопросов безопасности ОС для молодых и начинающих системных администраторов.

Модераторы: SLEDopit, Модераторы разделов

pelmen
Сообщения: 1268
ОС: debian

ssh-туннели

Сообщение pelmen »

Есть много серверов на linux, не у всех есть внешний адрес, решил сделать так: выбрал один из них (далее главный) понадежнее с внешним адресом, и на него все коннектятся и ssh-туннель поднимают на свой 22 порт. Раньше я заходил на главный сервер и делал

Код: Выделить всё

netstat -pnat|grep sshd

tcp 0 0 127.0.0.1:2223 0.0.0.0:* LISTEN 8041/sshd: server1
tcp 0 0 127.0.0.1:2224 0.0.0.0:* LISTEN 7789/sshd: server2
tcp 0 0 127.0.0.1:2225 0.0.0.0:* LISTEN 7860/sshd: server3

выбирал нужный мне и подключался

Код: Выделить всё

ssh -p 2225 user@localhost -o NoHostAuthenticationForLocalhost=yes

Теперь решил написать скрипт. Все, на что я способен:
#!/bin/bash

clear
n=1;
echo "Select a client to connect to:"
netstat -pnat|grep LISTEN|grep sshd|grep "127.0.0.1:222"|awk '{print $8}'| while read client; do
echo "$n) $client"
let n=$n+1
done
echo "*) exit"

read opt;

case $opt in
1) port="2223";;
2) port="2224";;
3) port="2225";;
*) exit 3;;
esac

ssh -p $port user@localhost -o NoHostAuthenticationForLocalhost=yes

exit 0

При запуске скрипта вижу на экране:
Select a client to connect to:
1) server1
2) server2
3) server3
*) quit
>
Может посоветуете, как улучшить? Не нравится то, что порты вручную вписаны в скрипт. Пытался делать массив, который заполнялся портами (ARRAY[1]=2223, ARRAY[2]=2224 и т.д.) с помощью того же netstat + awk, но после выхода из цикла массив оказывался пустой, хотя пробовал выводить его значения еще в цикле - все ок.
Если количество серверов не статическое, как показано тут, а динамическое (сегодня 3, завтра 28), то наверное не имеет смысла делать через case, а просто:
read opt;
ssh -p $ARRAY[$opt] user@localhost -o NoHostAuthenticationForLocalhost=yes
Спасибо сказали:
Аватара пользователя
Alex2ndr
Сообщения: 443
ОС: Debian Lenny

Re: ssh-туннели

Сообщение Alex2ndr »

Давайте я просто напишу как бы сделал я. Мне трудно думать над улучшением, т к ход размышления при создании скрипта был "не мой".
Алгоритм:
1. Пишем цикл, в котором разбираем данные netstat (а конкретно имя и порт) в массив.
2. Пишем цикл в котором выводим эти данные для показа - 1. Сервер1 и тд.
3. Получаем номер сервера.
4. Обращаемся к элементу массива с данным номером и получаем оттуда номер порта
5. Коннектимся к нужному порту.

Мой стиль написания скриптов(на баше) бывает черезчур многословен - но так понятнее(лично мне).
Пункт 1:

Код: Выделить всё

declare -a serverport
j=1
for connection in `netstat -pnat | grep LISTEN | grep sshd`; do
        port=`echo $connection | awk '{print $4}' | awk 'BEGIN{FS=":"}{print $2}'`
        server=`echo $connection | awk '{print $8}'`
        serverport[$j]="$port $server"
        let "j=$j+1"
done

Пункт 2:

Код: Выделить всё

echo "Select a client to connect to:"
j=1
for connection in "${serverport[@]}"; do
        server=`echo $connection | awk '{print $2}'`
        echo "$j ) $server"
        let "j=$j+1"
done

Пункт 3:

Код: Выделить всё

read servernmb

Пункт 4:

Код: Выделить всё

selectedport=`echo ${serverport[$servernmb]} | awk '{print $2}'`

Пункт 5:

Код: Выделить всё

ssh -p $selectedport user@localhost -o NoHostAuthenticationForLocalhost=yes

Как объединить циклы в 1-м и 2-м пунктах вы и без меня догадаетесь.
Все писалось "на память" - т е без какой-либо проверки - тестировать Вам.

Рекомендую почитать ABSG про массивы - в баше много заковыристых моментов.
Спасибо сказали:
pelmen
Сообщения: 1268
ОС: debian

Re: ssh-туннели

Сообщение pelmen »

Спасибо, попробую
Спасибо сказали: