У меня есть компьютер за 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, я получаю динамический прокси, а также доступ к серверу ym DigitalOcean. Этот метод работает на 100%.
Однако, когда я устанавливаю chrontab следующим способом, мой компьютер с Ubuntu никогда не создает динамический прокси. Я вижу это, потому что когда я проверяю этот прокси из Google Chrome, он говорит, что прокси отказывается от соединения.
Вот cronejobs, которые я пробовал как корни cronejobs. Я также попробовал их как обычный пользователь, но они не работали.
@reboot bash /home/user/rev.sh
@reboot /home/user/rev.sh
@reboot cd /home/user && ./rev.sh
Затем я установил chrontab за несколько минут до текущего времени и дождался его запуска.
24 12 8 * * * bash /home/user/rev.sh
24 12 8 * * * /home/user/rev.sh
они тоже не выполнялись.
Пожалуйста, будьте любезны, чтобы помочь мне определить мою ошибку. На моем сайте много похожих вопросов по моей проблеме. Поэтому я привел много ответов, но ни один из них не помог.
источник
/var/log/cron*
. В целях тестирования вы можете просто написать что-то вроде этого*/2 * * * * /path/to/script
- он будет запускать скрипт каждые 2 минуты. Также проверьте почту для пользователя cron. Это рут? Используйтеmail
команду. О, я вижу, что вы используете ключ SSH? Я сомневаюсь, что cron сможет найти его, если вы не укажете полный путь к нему после-i
переключения.Ответы:
Я не уверен, что использование
cron
сценария при запуске - хорошая идея. Альтернатива, которую я считаю более подходящей, заключается в создании службы SystemD, как описано здесь . Создайте файл с именем/etc/systemd/system/autossh.service
:Затем выполните следующую команду от имени пользователя root:
источник
Несколько вещей, которые вы можете попробовать:
Иногда ваш путь не полностью установлен во время загрузки или с помощью cronjobs, поэтому замените autossh на полный путь в моей системе, которая
Мотив @reboot зависит от времени запуска демона cron, поэтому он может быть вызван до того, как другие подсистемы (сеть?) будут запущены и запущены
И ваш пример crontab:
будет вызывать только 8-го числа каждого месяца. И у него есть дополнительное поле. Пытаться
источник
/usr/bin
всегда по умолчаниюPATH
, даже дляcron
Кажется, что когда скрипт выполняется через crontab, он не может найти ваш сертификат.
Когда вы, как пользователь, выполняете скрипт, он использует сертификат из /home/ubuntu-user/.ssh / ... Однако, когда скрипт выполняется из crontab, он запускается от имени пользователя root. root берет сертификаты из /root/.ssh
Таким образом, у вас есть несколько способов заставить его работать, но я думаю, что запуск скрипта выполняется от имени ubuntu-user в crontab .
Редактировать:
убедитесь, что вы указали полный путь к сертификату
источник
Попробуйте использовать
su
:Поможет ли это с вашей проблемой?
источник
поскольку в вопросе не так много данных, я начну с нуля с того, что буду делать
Я бы поместил все конфигурации в / etc / ssh / ssh_config:
Я бы положил ключ в
/etc/ssh/mytunnel_key
тогда я бы попробовал с записью cron (лучше использовать upstart / systemd), например так:
источник
Вам нужно использовать -f и запустить команду, когда вы запускаете без терминала. Итак, вот пример:
-f помещает его в фоновый режим, но размещение в фоновом режиме означает, что ssh подключится, а затем отключится, как только выполнит свою задачу. Так что вам нужно задание.
sleep 31536000 говорит ssh запустить "sleep" в течение 1 года после подключения. В течение этого времени ваши туннели будут работать.
Если вы не запустите команду, ssh подключится, настроит обратный туннель на порт 2205, и когда это будет сделано, он выйдет. Используя autossh, в случае сбоя соединения он снова подключится и перезапустит спящий режим. Даже с действительно стабильным интернет-соединением, я сомневаюсь, что год возможен.
Кстати, в отличие от этих других джокеров, я знаю, что это работает, поскольку я действительно проверял это, потому что, конечно, я делаю что-то подобное, и, поскольку у меня это работает сейчас, очень надежно, я могу дать вам правильный ответ.
-f и "команда"
Это то, что вам не хватает.
источник