Создание обратного 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
,