ssh: проверьте, жив ли туннель

Я написал маленький скрипт bash которому нужен туннель ssh для получения данных с удаленного сервера, поэтому он запрашивает пользователя:

echo "Please open an ssh tunnel using 'ssh -L 6000:localhost:5432 example.com'"

Я хотел бы проверить, открыл ли пользователь этот туннель, и выйти с сообщением об ошибке, если туннель не существует. Есть ли способ запросить ssh туннель, т. е. проверить, действительно ли локальный порт 6000 туннелируется на этот сервер?

9 ответов


Это мой тест. Надеюсь, это полезно.

# $COMMAND is the command used to create the reverse ssh tunnel
COMMAND="ssh -p $SSH_PORT -q -N -R $REMOTE_HOST:$REMOTE_HTTP_PORT:localhost:80 $USER_NAME@$REMOTE_HOST"

# Is the tunnel up? Perform two tests:

# 1. Check for relevant process ($COMMAND)
pgrep -f -x "$COMMAND" > /dev/null 2>&1 || $COMMAND

# 2. Test tunnel by looking at "netstat" output on $REMOTE_HOST
ssh -p $SSH_PORT $USER_NAME@$REMOTE_HOST netstat -an | egrep "tcp.*:$REMOTE_HTTP_PORT.*LISTEN" \
   > /dev/null 2>&1
if [ $? -ne 0 ] ; then
   pkill -f -x "$COMMAND"
   $COMMAND
fi

Netcat - ваш друг:

nc -z localhost 6000 || echo 'no tunnel open'; exit 1

Autossh-лучший вариант-процесс проверки работает не во всех случаях (например, процесс зомби, проблемы, связанные с сетью)

пример:

autossh -M 2323 -c arcfour -f -N -L 8088:localhost:80 host2

это действительно больше вопрос типа serverfault, но вы можете использовать netstat.

что-то типа:

 # netstat -lpnt | grep 6000 | grep ssh

это скажет вам, есть ли процесс ssh, прослушивающий указанный порт. он также расскажет вам PID процесса.

Если вы действительно хотите дважды проверить, что процесс ssh был запущен с правильными параметрами, вы можете посмотреть процесс PID в чем-то вроде

# ps aux | grep PID

использовать autossh. Это инструмент, предназначенный для мониторинга ssh-соединения.


stunnel-хороший инструмент для создания полупостоянных соединений между хостами.

http://www.stunnel.org/


#!/bin/bash

# Check do we have tunnel to example.com server
lsof -i tcp@localhost:6000 > /dev/null

# If exit code wasn't 0 then tunnel doesn't exist.
if [ $? -eq 1 ]
then
  echo ' > You missing ssh tunnel. Creating one..'
  ssh -L 6000:localhost:5432 example.com
fi

echo ' > DO YOUR STUFF < '

это более подробные шаги для тестирования или устранения неполадок туннеля SSH. Некоторые из них можно использовать в сценарии. Я добавляю этот ответ, потому что мне пришлось устранить связь между двумя приложениями после того, как они перестали работать. Просто grepping для процесса ssh было недостаточно, так как он все еще был там. И я не мог использовать nc -z потому что эта опция была недоступна в моем заклинании netcat.

давайте начнем с самого начала. Предположим, есть машина, которая будет называться местные С IP-адресом 10.0.0.1 и другим, называемым пульт ДУ, в 10.0.3.12. Я добавлю эти имена хостов к командам ниже, поэтому очевидно, где они выполняются.

цель состоит в том, чтобы создать туннель, который будет перенаправлять TCP-трафик с адреса замыкания на удаленную машину на порту 123 на локальную машину на порту 456. Это можно сделать с помощью следующей команды на локальном компьютере:

local:~# ssh -N -R 123:127.0.0.1:456 10.0.3.12

чтобы проверить, что процесс запущен, мы можем сделать:

local:~# ps aux | grep ssh

если вы видите команду в выходных данных, мы можем продолжить. В противном случае убедитесь, что ключ SSH установлен в пульте ДУ. Обратите внимание, что за исключением имени пользователя перед удаленным IP, ssh использует текущее имя пользователя.

Далее мы хотим проверить, что тоннель открыт на пульте:

remote:~# netstat | grep 10.0.0.1

мы должны получить примерно такой результат:

tcp  0  0  10.0.3.12:ssh  10.0.0.1:45988  ESTABLISHED

было бы неплохо на самом деле посмотреть некоторые данные передаются с пульта на хост. Вот где С netcat приходит. На CentOS его можно установить с yum install nc.

во-первых, откройте порт прослушивания на локальном компьютере:

local:~# nc -l 127.0.0.1:456

затем подключения на пульте:

remote:~# nc 127.0.0.1 123

если вы открываете второй терминал на локальном компьютере, вы можете увидеть соединение. Что-то вроде этого:--13-->

local:~# netstat | grep 456
tcp  0  0 localhost.localdom:456 localhost.localdo:33826 ESTABLISHED
tcp  0  0 localhost.localdo:33826 localhost.localdom:456 ESTABLISHED

еще лучше, идите вперед и введите что-то на пульт:

remote:~# nc 127.0.0.1 8888
Hallo?
anyone there?

вы должны увидеть это отражается на локальном терминале:

local:~# nc -l 127.0.0.1:456
Hallo?
anyone there?

туннель работает! Но что делать, если у вас есть приложение, называемое appname, который должен прослушивать порт 456 на локальном компьютере? Завершите nc с обеих сторон, затем запустите приложение. Вы можете проверить, что он слушает на правильно порт этой:

local:~# netstat -tulpn | grep LISTEN | grep appname
tcp  0  0  127.0.0.1:456  0.0.0.0:* LISTEN  2964/appname

кстати, работает то же самое команда на пульте должна показывать прослушивание sshd на порту 127.0.0.1: 123.


мы можем проверить с помощью команды ps

# ps -aux | grep ssh

покажет весь ход обслуживания ШХ и мы можем найти обслуживание тоннеля перечисленное