Хелоу ворлд, вчера наш с вами товарищ Tagd Tagd попросил опубликовать статью, которую любезно написал для нас с вами. Спасибо дружище! Исполняю, вникайте, пишите комменты.

Я стилистику сохранил, но сверстал и поправил то, что ворд подчеркнул красным, чтобы читалось полегче. Эхх.. как же руки чесались добавить пару забористых фраз, ну да ладно, пусть будет как будет.

redirall.sh

Да, я знаю про алиасы и ssh_config. Скрипт предназначен для ИНТЕРАКТИВНОГО проброса TCP-портов через jump-серверы, средствами ssh.

Позволяет пробрасывать порт с удаленной машины на 127.0.0.1 и коннектиться к службам компов, доступных из подсети jump-сервера (в скрипте gate сервер) за firewall.

Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
При небольшой модификации можно открывать порт для компов своей локальной подсети. Удобен для сопровождения небольших фирм.

Кому это не интересно, рассматривайте скрипт, как учебный, потому как тут есть некоторые фишки, которые поясню ниже.

В инете есть машина IP=1xx.2xx.2xx.54, у которой на порту 13527 висит ssh.

После подключения у нас на машине по адресу 127.0.0.1:8080 будет висеть служба 192.168.1.10:443 из локальной сети шлюзовой машины.

Кстати, dest_ip, dest_port, lo_port - значения по умолчанию. При подключении их можно менять, не трогая конфиг.

Если кто заинтересовался пробросом портов через ssh рекомендую смотреть ключи -L -R -D.

Теперь к скрипту.

MULTICOLUMN=0 - список подключений в один столбец. Подходит, когда список до 20-30 строк.

MULTICOLUMN=1 список в несколько столбцов. Некрасиво, но много…

function ini() - список параметров, для тех, кто хранит данные в скрипте (можно еще heredoc).

awk !/^#/ && NF - выводит строки, НЕ начинающиеся с #, и с числом полей >0. (не пустые, без комментов)

|eval $CMD - ПОЗВОЛЯЕТ МЕНЯТЬ ЛОГИКУ цепочки PIPE

|cat - заглушка (nop в мире pipe)

Дальше все просто.

read -i позволяет указать значение по умолчанию, которое, можно изменить.

Скрипт можно приспособить для любого интерактива: выбор версии скачиваемой программы, монтирование/размонтирование FS, выполнение нужных, но редких скриптов, которые, блин, постоянно забываешь…

#!/bin/bash

declare -i MULTICOLUMN=0
function ini(){ echo '

#name    ssh_gate_ip     gate_port  ssh_user  dest_ip         dest_port  lo_port

Filial1  1xx.2xx.2xx.54  13527      u232sr    192.168.1.10    80         8080
Filial2  9y.1yy.1yy.66   13531      u232sr    192.168.1.18    5432       5432
Firma2   1zz.2zz.2zz.53  22         p183975   192.168.1.100   3389       3388

'
}
declare -i COLS=$(echo "cols"|tput -S)
declare -i NUM=0
clear
[[ $MULTICOLUMN -eq 0 ]] && CMD='cat' || CMD='column -x -c$COLS'
#autonum & print list
ini |awk '!/^#/ && NF {print ++i, $1 }' |eval $CMD
#protection
declare -i MAX=$(ini |awk '!/^#/ && NF {++i}END{print i}')
while [[ $NUM -le 0 ]] || [[ $NUM -gt $MAX ]];do
  read -p "select connection number = " NUM
done
#get default param for selected num
read -r NAME GATE_IP GATE_PORT USR DEST_IP DEST_PORT LO_PORT <<< \
    $(ini | awk -v n="$NUM" '!/^#/ && NF {if(++i==n){print $0;exit}}') #'
clear
echo -e \\n"Connect to $NAME $GATE_IP"\\n
#modify param
read -e -p "DESTINATION_IP   " -i "$DEST_IP"  DEST_IP;echo
read -e -p "DESTINATION_PORT " -i "$DEST_PORT" DEST_PORT;echo
read -e -p "LOCAL PORT >1024 " -i "$LO_PORT" LO_PORT
#prompt
echo -e "127.0.0.1:$LO_PORT ~> $NAME" "$DEST_IP:$DEST_PORT"\\n\\n
#connect
ssh -L ${LO_PORT}:${DEST_IP}:${DEST_PORT} -p ${GATE_PORT} ${USR}@${GATE_IP}