Я открываю реверс ssh туннель после перезагрузки ОС (на офисном ПК к выделенному серверу). Я поместил его в крон @reboot /myssh.sh
. ssh открывает порт на сервере.
Моя проблема:
Если ОС (офисный ПК) внезапно умрет, и загрузитесь снова, то крон запустит скрипт снова, в то время как порт на сервере, все еще используемом предыдущей сессией, и конечно, ssh перестанет работать (потому что это пытается открыть открытый порт на сервере). Вот почему я не могу получить доступ к офисному ПК с сервера, если офисный ПК перезагрузил.
Вопросы:
Цель
Я хочу туннель ssh, поддерживает, что бы ни случилось. Если интернет-соединение проиграло, я все еще могу получить доступ к офисному ПК однажды доступный Интернет.
Я просто обнаружил то, что, кажется, самый корректный метод от AutoSSH.
Однако Мультиплексирование является очень большим предметом и может использоваться для других вещей. Источник
Идея в сценарии Bash для установки... состоит в том, чтобы использовать и интегрированный метод под названием Сокет Управления. Через этот метод можно управлять, чтобы умерло старое соединение. Однако необходимо будет протестировать, если это будет работать даже после перезагрузки.
Туннель является процессом, работающим на удаленной машине. Можно генерировать сценарий, проверяющий, что никакой предыдущий экземпляр туннеля не является runnig.
Предположим это ssh -f -R XXXXX:localhost:YYYYY user@server -N
Ваша исходная команда. XXXXX
обозначает порт, используемый на удаленном сервере и YYYYY порт на Вашей локальной машине.
Затем можно проверить, что никакой процесс не слушает на порте XXXXX
на Вашем удаленном сервере с помощью lsof. Однако необходимо будет смочь использовать sudo
для получения идентификатора Процесса (pid) программы, слушающей на порте.
Как только Вы находите pid с помощью порта, можно просто выполнить в сервере команду kill thePID
.
Рев сценария должен, должен отобразить 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, кажется, хороший инструмент для обработки то, чего Вы хотите достигнуть. Возможно, необходимо смотреть. ИСТОЧНИК