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
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-соединения.
#!/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
покажет весь ход обслуживания ШХ и мы можем найти обслуживание тоннеля перечисленное