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, и мы можем найти список туннелей, указанный в списке