Я борюсь с записью, что я принимаю, должен быть легкий сценарий.
В основном у меня есть компьютер на работе, которая скрыта позади NAT, к которому у меня нет доступа. Мне нужно к SSH в этот компьютер, таким образом, единственный способ сделать это должно установить обратное перенаправление порта, где этот компьютер NATted соединится с моим сервером дома при перенаправлении порта для него сам, и затем я могу просто ssh в него через мой домашний сервер.
.sh сценарий будет выполняться компьютером на работе каждые 5 минут, и это - то, что я хотел бы, чтобы это сделало:
Проверьте, существует ли активное соединение SSH к моему продолжению сервера и если да, то просто ничего не делают и выходить из сценария.
Если нет никакого обнаруженного активного соединения, то соединитесь путем выполнения "ssh me@1.2.3.4-i key.priv" и выйдите из сценария.
Если попытка соединения SSH зависает по некоторым причинам, для говорят дольше, чем 2 минуты, то вызывают, выходят из сценария (не уверенный, если это возможно сделать, в противном случае затем это не должно быть там),
Большое спасибо за Ваш совет.
Давайте предположим использование следующей команды для установления соединения SSH (я предпочел бы использовать .ssh/config
файл, который упростит команду ssh, но это не обязательно):
ssh user@host -fTN -R 2222:127.0.0.1:22 -i $HOME/.ssh/id_rsa
-fTN
отодвинет соединение на задний план - я записал эту ведущую роль, потому что этот набор опций очень важен для моего предложения ниже;-R 2222:127.0.0.1:22
создаст обратный туннель;-i $HOME/.ssh/id_rsa
указывает на файл идентификационных данных.Мы можем использовать ps -aux | grep "<our command>" | sed '$ d'
проверять, устанавливается ли соединение или нет. На основе этого нашего сценария мог быть:
#!/bin/bash
SSH_COMMAND="ssh user@host -fTN -R 2222:127.0.0.1:22 -i $HOME/.ssh/id_rsa"
if [[ -z $(ps -aux | grep "$SSH_COMMAND" | sed '$ d') ]]
then exec $SSH_COMMAND
fi
Назовите этот сценарий my_autossh
, поместите его в ~/bin
и сделайте это исполняемым файлом. Затем выполненный crontab -e
и добавьте следующее задание:
* * * * * $HOME/bin/my_autossh
Если Вы не хотите использовать Крон, измените документ на получение my_autossh
таким образом:
#!/bin/bash
SSH_COMMAND="ssh user@host -fTN -R 2222:127.0.0.1:22 -i $HOME/.ssh/id_rsa"
while true; do
if [[ -z $(ps -aux | grep "$SSH_COMMAND" | sed '$ d') ]]
then eval $SSH_COMMAND
else sleep 60
fi
done
И используйте nohup
отодвинуть его на задний план:
nohup my_autossh >/dev/null 2>&1 &
Чтение также: