Уничтожьте туннель ssh, если существует, и создайте новый

Я открываю реверс ssh туннель после перезагрузки ОС (на офисном ПК к выделенному серверу). Я поместил его в крон @reboot /myssh.sh. ssh открывает порт на сервере.
Моя проблема:
Если ОС (офисный ПК) внезапно умрет, и загрузитесь снова, то крон запустит скрипт снова, в то время как порт на сервере, все еще используемом предыдущей сессией, и конечно, ssh перестанет работать (потому что это пытается открыть открытый порт на сервере). Вот почему я не могу получить доступ к офисному ПК с сервера, если офисный ПК перезагрузил.
Вопросы:

  1. Как проверить ssh или порт на сервере (и закончить предыдущую сессию), прежде чем вновь откроют реверс ssh снова от офисного ПК?
  2. Я должен сделать это стороной средства доступа (сервер) или сторона хоста (офисный ПК)?


Цель
Я хочу туннель ssh, поддерживает, что бы ни случилось. Если интернет-соединение проиграло, я все еще могу получить доступ к офисному ПК однажды доступный Интернет.

4
задан 25 January 2016 в 07:47

1 ответ

Используйте сокет управления

Я просто обнаружил то, что, кажется, самый корректный метод от AutoSSH.

Однако Мультиплексирование является очень большим предметом и может использоваться для других вещей. Источник

Идея в сценарии Bash для установки... состоит в том, чтобы использовать и интегрированный метод под названием Сокет Управления. Через этот метод можно управлять, чтобы умерло старое соединение. Однако необходимо будет протестировать, если это будет работать даже после перезагрузки.

Что Вы просите:

Уничтожьте процесс на удаленном сервере

Туннель является процессом, работающим на удаленной машине. Можно генерировать сценарий, проверяющий, что никакой предыдущий экземпляр туннеля не является runnig.

Предположим это ssh -f -R XXXXX:localhost:YYYYY user@server -N Ваша исходная команда. XXXXX обозначает порт, используемый на удаленном сервере и YYYYY порт на Вашей локальной машине.

Затем можно проверить, что никакой процесс не слушает на порте XXXXX на Вашем удаленном сервере с помощью lsof. Однако необходимо будет смочь использовать sudo для получения идентификатора Процесса (pid) программы, слушающей на порте.

Как только Вы находите pid с помощью порта, можно просто выполнить в сервере команду kill thePID.

Сценарий Bash Для получения PID

Рев сценария должен, должен отобразить pid, который слушает на XXXXX и сохраните его на /tmp/remTunPID. Если у Вашего пользователя не будет sudo доступа, то он не будет работать, PID не будет видим из соображений безопасности.

Сценарий:

#!/bin/bash
rPort=XXXXX
theUser=[replace with remote user name]
server=[replace with your server]
if [ -a /tmp/sshPID1 ]
   then
      rm /tmp/sshPID1
fi
if [ -a /tmp/sshPID2 ]
   then
      rm /tmp/sshPID2
fi
if [ -a /tmp/remTunPID ]
   then
      rm /tmp/remTunPID
fi
echo "Enter [sudo] password for ${theUser}:"
ssh -t $theUser@$server "sudo lsof -i tcp:${rPort} | grep  IPv4" > /tmp/sshPID1
while read -a A; do echo ${A[6]}; done < /tmp/sshPID1 > /tmp/sshPID2
cat /tmp/sshPID2 | grep -v pass | tee /tmp/remTunPID
if [ -s /tmp/remTunPID ]
   then
      thePID=$(cat /tmp/remTunPID)
      echo The process $thePID is running at $server listening to $rPort
   else
      echo No process is listening on $rPort at $server
fi

Измените значения rPort, theUser и server к значениям Вашего удаленного порта, удаленного пользователя и сервера (домен или IP) соответственно.

Эта команда предложит Вам Ваш sudo пароль, чтобы продолжить, но сделать не, волнуются, понимаете ли Вы немного удара, Вы видите, что это требует непосредственно ssh с -t опция.

На самом деле уничтожьте процесс

Вы могли добавить команду к этому сценарию в if then else fi оператор для уничтожения процесса:

if [ -s /tmp/remTunPID ]
   then
      thePID=$(cat /tmp/remTunPID)
      echo The process $thePID is running on $server and listening on $rPort
      echo Will attempt to kill $thePID
      ssh $theUser@$server "kill ${thePID}"
   else
      echo No process is listening on $rPort
fi

Это должно уничтожить процесс, только если порт используется. Но это уничтожит процесс, даже если Ваша машина не запустила туннель для начала.

AutoSSH

AutoSSH, кажется, хороший инструмент для обработки то, чего Вы хотите достигнуть. Возможно, необходимо смотреть. ИСТОЧНИК

3
ответ дан 1 December 2019 в 10:03

Другие вопросы по тегам:

Похожие вопросы: