Создание сценария .sh, чтобы проверить, существует ли соединение SSH, а если нет, то подключитесь

Я борюсь с написанием того, что, как я полагаю, должен быть простым сценарием.

В основном у меня есть компьютер на работе, который скрыт за NAT, к которому у меня нет доступа. Мне нужно SSH на этот компьютер, так что единственный способ сделать это - установить обратный перенаправление портов, где этот NAT-сервер подключится к моему серверу дома, перенаправляя порт для него сам, а затем я могу просто ssh в него через мой домашний сервер.

Скрипт .sh будет выполняться компьютером на работе каждые 5 минут, и это то, что я хотел бы сделать:

Проверьте, есть ли активное ssh-соединение с моим сервером, и если да, то просто ничего не делайте и выходите из сценария.

Если активного подключения не обнаружено, подключитесь, выполнив «ssh me@1.2.3.4 -i key .priv "и выйти из сценария.

Если попытка подключения ssh по какой-то причине висит, например, более 2 минут, то принудительно выйдите из сценария (не уверен, что это возможно, если нет, тогда это не обязательно)

Благодарим вас за ваши советы.

2
задан 26 April 2018 в 12:25

3 ответа

Предположим, что вы используете следующую команду для установки своего 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 &
2
ответ дан 22 May 2018 в 11:14
  • 1
    @dessert, я не уверен :) ps -aux | grep "$SSH_COMMAND" также вернется grep --color=auto ssh user@host -fTN -R 2222:127.0.0.1:22 -i /home/user/.ssh/id_rsa, поэтому я перерезал последнюю строку с помощью sed '$ d'. – pa4080 26 April 2018 в 14:41
  • 2
    @dessert Я просто могу отредактировать сообщение самостоятельно, но, с другой стороны, вы правы тоже: не все grep s всех времен знали о переключателе -q. Например, AIX 4.3 не знает об этом, поскольку я только что проверил. Преимущество >/dev/null в том, что он всегда работает. – PerlDuck 26 April 2018 в 15:08
  • 3
    @ десерт, хорошо! Это работает: ps -aux | grep -q "[s]sh user@host -fTN -R 2222:127.0.0.1:22 -i /home/spas/.ssh/id_rsa" && echo true || echo false. Но я не могу представить, как реализовать квадратные скобки, когда я использую переменную с grep. Другой способ - использовать: pgrep -f "$SSH_COMMAND" >/dev/null && echo true || echo false. – pa4080 26 April 2018 в 17:07

Предположим, что вы используете следующую команду для установки своего 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 &
2
ответ дан 17 July 2018 в 16:08

Предположим, что вы используете следующую команду для установки своего 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 &
2
ответ дан 23 July 2018 в 17:02

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

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