Я борюсь с написанием того, что, как я полагаю, должен быть простым сценарием.
В основном у меня есть компьютер на работе, который скрыт за NAT, к которому у меня нет доступа. Мне нужно SSH на этот компьютер, так что единственный способ сделать это - установить обратный перенаправление портов, где этот NAT-сервер подключится к моему серверу дома, перенаправляя порт для него сам, а затем я могу просто 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
Если вы не хотите использовать Cron, измените скрипт my_autossh следующим образом: [!d9 ]
#!/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 &
Предположим, что вы используете следующую команду для установки своего 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
Если вы не хотите использовать Cron, измените скрипт 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 &
Предположим, что вы используете следующую команду для установки своего 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
Если вы не хотите использовать Cron, измените скрипт 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 &