Создание обратного SSH-соединения crontab с использованием скрипта

У меня есть компьютер за NAT, который устанавливает обратное соединение SSH с моим Digitalocean VPC. Я использую это обратное SSH-соединение из дома, чтобы войти в свой офисный компьютер (я уполномочен на это), копировать файлы и делать другие важные вещи.

Хотя и не часто, я заметил, что мой офисный компьютер перезагружается (из-за сбоя питания и т. Д.) И разрывает обратное соединение SSH, которое он установил с моим VPC. В таких случаях я не могу подключиться с домашнего компьютера к офисному компьютеру.

Я запускаю следующий сценарий, чтобы сделать обратное соединение + динамический прокси-сервер для анонимной обработки моего трафика (поскольку я не обязан обмениваться данными для просмотра), генерируемого на офисном ПК.

autossh -CD 8080 -i digitalOcean -R 8081:localhost:22 root@IPofDigitalOceanPC

Я не могу снова запустить этот сценарий на моем офисном ПК после перезагрузки, так как меня там физически нет. Для решения этой проблемы я установил следующий crontab.

Замечания: rev.sh Файл содержит вышеуказанную строку. Сертификат "digitalOcean" и rev.sh находится в Ubuntu home, Поэтому, когда я выполняю ./rev.sh в моем терминале Ubuntu я получаю динамический прокси, а также доступ к своему серверу DigitalOcean. Этот метод работает на 100%.

Однако, когда я устанавливаю crontab следующим способом, мой компьютер с Ubuntu никогда не создает динамический прокси. Я вижу это, потому что когда я проверяю этот прокси из Google Chrome, он говорит, что прокси отказывается от соединения.

Вот cronjobs, которые я пробовал как cronjobs рута. Я также попробовал их как обычный пользователь, но они не работали.

@reboot bash /home/user/rev.sh 
@reboot /home/user/rev.sh 
@reboot cd /home/user && ./rev.sh

Затем я установил crontab за несколько минут до текущего времени и дождался его запуска.

24 12 * * * bash /home/user/rev.sh
24 12 * * * /home/user/rev.sh
24 12 * * * reboot 

Эти не выполнялись либо.

Я тоже пробовал 48 15 * * * bash /home/user/rev.sh >> test3 а также */1 * * * * reboot -f >> test но у test3 и test ничего нет. Однако файлы были созданы! crontab!

Пожалуйста, будьте любезны, чтобы помочь мне определить мою ошибку. На моем сайте много похожих вопросов по моей проблеме. Поэтому я привел много ответов, но ни один из них не помог.

1 ответ

Решение

Лучшим решением было бы использовать сторожевой таймер. watchdog - это демон, который будет наблюдать за запущенными процессами и, если они завершатся, автоматически перезапустит их.

Установите сторожевой таймер на Ubuntu 16.04

sudo apt-get install watchdog

Как работает сторожевой таймер

watchdog(8) демон выполнит сценарии в /etc/watchdog.d с аргументом test или же repair, (увидеть TEST DIRECTORY раздел watchdog(8) справочная страница). Ваш сторожевой скрипт обрабатывает эти два аргумента, когда проверяет, запущен ли процесс, и предпринимает действия для его восстановления.

Вы можете настроить сторожевой таймер, изменив /etc/watchdog.conf (Увидеть watchdog.conf(5)).

пример watchdog.d скрипт

Возьмите например /etc/watchdog.d/autossh_script (у которого есть 755 разрешения и принадлежит root).

Примечание: вам может понадобиться настроить $targetuser переменная окружения в примере сценария. sam мое имя пользователя

#!/bin/bash

targetuser=sam

runTest=false
runRepair=false

case $1 in
  test)
    runTest=true
  ;;
  repair)
    runRepair=true
    repairExitCode=$2
  ;;
  *)
    echo 'Error: script needs to be run by watchdog' 1>&2
    exit 1
  ;;
esac

if ${runTest}; then
  #run a test here which will tell the status of your process
  #the exit code of this script will be the repairExitCode if it is non-zero
  if ! pgrep autossh &> /dev/null; then
    #autossh not running; notify watchdog to repair
    exit 1
  else
    #autossh running; no action necessary
    exit 0
  fi
fi

if ${runRepair}; then
  #take an action to repair the affected item
  #use a case statement on $repairExitCode to handle different failure cases
  su - ${targetuser} -c 'nohup autossh -f -- -NCD 8080 -i digitalOcean -R 8081:localhost:22 root@IPofDigitalOceanPC'
  exit 0
fi
  • я добавил -N на ваш ssh команда в примере сценария, чтобы он только запускал туннель, но не пытался создать оболочку входа.
  • я добавил -f в autossh так что он работает в фоновом режиме.
  • В примере сценария используется простой pgrep шаблон. Однако вы можете дополнительно сузить тест до конкретного пользователя или даже использовать шаблон для процесса. Увидеть pgrep(1) для дальнейшей настройки вашего теста с помощью pgrep.

Настройка сторожевого таймера

/etc/watchdog.conf а также /etc/defaults/watchdog места для настройки сторожевого таймера Увидеть watchdog.conf(5),

Стоит отметить, что по умолчанию пользовательские скрипты выполняются раз в секунду. Я рекомендую увеличить это значение как минимум до 30 секунд, если вам не требуется дополнительная проверка в реальном времени. Настроить interval установка в watchdog.conf,

Поиск проблемы

Вам может понадобиться создать /etc/watchdog.d каталог перед вашим скриптом.

/var/log/watchdog/* содержит журналы и ошибки, связанные с сторожевым таймером. Если ваш скрипт выводит в stdout или stderr, тогда он будет записан там. В моей системе я замечаю, что мой скрипт выполняется test или же repair примерно раз в секунду. Если вы используете echo в своем скрипте, он должен быть временным только для целей отладки. В противном случае рекомендуется отказаться от вывода, за исключением случаев ошибок.

Если ваш скрипт не работает вообще, проверьте права доступа: ls -l /etc/watchdog.d,

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