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

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

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

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

Спасибо,

Адам

Ответ 1

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

# $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 [email protected]$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 [email protected]$REMOTE_HOST netstat -an | egrep "tcp.*:$REMOTE_HTTP_PORT.*LISTEN" \
   > /dev/null 2>&1
if [ $? -ne 0 ] ; then
   pkill -f -x "$COMMAND"
   $COMMAND
fi

Ответ 2

Netcat - ваш друг:

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

Ответ 3

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

Пример:

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

Ответ 4

Это скорее вопрос типа serverfault, но вы можете использовать netstat.

что-то вроде:

 # netstat -lpnt | grep 6000 | grep ssh

Это скажет вам, будет ли процесс ssh прослушиваться на указанном порту. он также сообщит вам PID процесса.

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

# ps aux | grep PID

Ответ 5

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

Ответ 6

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

http://www.stunnel.org/

Ответ 7

#!/bin/bash

# Check do we have tunnel to example.com server
lsof -i [email protected]: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 < '

Ответ 8

Это более подробные шаги для тестирования или устранения неполадок туннеля SSH. Некоторые из них можно использовать в script. Я добавляю этот ответ, потому что мне пришлось устранить связь между двумя приложениями после их прекращения работы. Просто 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

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

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 с обеих сторон, затем запустите приложение. Вы можете проверить, что он прослушивает порт правильный с this:

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.

Ответ 9

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

# ps -aux | grep ssh

Покажет все запущенные службы shh, и мы можем найти список туннелей, указанный в списке