создание автоматического обратного SSH-соединения при загрузке

Попробуйте (для более новых версий) cat / etc / os-release

Если это не сработает, попробуйте (для более старых версий) {{1} } cat / etc / SuSE-release

9
17.11.2016, 11:22
6 ответов

Пара вещей, которые вы можете попробовать:

chmod +x rev.sh

Иногда ваш путь не полностью установлен во время загрузки или с помощью cronjobs, поэтому замените autossh полным путь, в моей системе мотив

/usr/bin/autossh

@reboot зависит от времени запуска демона cron, поэтому он может быть вызван до того, как будут запущены и запущены другие подсистемы (сеть?)

И ваш пример crontab:

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

будет только вызывать 8-го числа каждого месяца. И у него есть дополнительное поле. Попробуйте

24 12 * * * /home/user/rev.sh
1
27.01.2020, 20:06

Похоже, что когда скрипт выполняется через crontab, он не может найти ваш сертификат.

Когда вы как пользователь выполняете сценарий, он использует сертификат из /home/ubuntu-user/.ssh/... .Однако, когда сценарий выполняется из crontab, он запускается от имени пользователя root. root берет сертификаты из /root/.ssh

. Итак, у вас есть несколько способов заставить его работать, но я думаю, что запуск сценария как ubuntu-user в crontab делает это.

Изменить:

убедитесь, что предоставили полный путь к сертификату

1
27.01.2020, 20:06

Я не уверен, что использование cron для запуска скрипта при запуске - это хорошая идея. Альтернативой, которая мне кажется более подходящей, является создание службы SystemD, как описано здесь. Создайте файл с именем /etc/systemd/system/autossh. service:

[Unit]
Description=Auto Reverse SSH
Requires=systemd-networkd-wait-online.service
After=systemd-networkd-wait-online.service
[Service]
ExecStart=/full/path/to/autossh -CD 8080 -i digitalOcean -R 8081:localhost:22 root@IPofDigitalOceanPC
[Install]
WantedBy=multi-user.target

Затем выполните следующую команду от имени root:

systemctl enable autossh.service
8
27.01.2020, 20:06

поскольку в вопросе не так много данных, я начну с нуля с того, что бы я сделал

Я бы поставил все конфигурации в / etc / ssh / ssh_config:

 Host mytunnel
    HostName      IPofDigitalOcean
    User          root     # Are you sure about this??
    IdentityFile  /etc/ssh/mytunnel_key
    RemoteForward 8081 localhost:22
    DynamicForward 8080

Я бы поместил ключ в / etc / ssh / mytunnel_key

, затем я бы попытался с записью cron (лучше бы подойдет служба upstart / systemd), например :

@reboot /usr/bin/autossh -f -M 0 -T -N mytunnel
0
27.01.2020, 20:06

Попробуйте использовать su :

su -l user -c /home/user/rev.sh

Поможет ли это решить вашу проблему?

1
27.01.2020, 20:06

Вам нужно использовать-f и запустить команду при запуске без терминала. Вот пример:

autossh -M 12374 \
-R 2205:127.0.0.1:22 \
-p 2200 \
-f \
user@www.hostname.com \
sleep 31536000

-f помещает его в фоновый режим, но размещение в фоновом режиме означает, что ssh подключится, а затем отключится, как только завершит свою задачу. Итак, вам нужна задача.

sleep 31536000 сообщает ssh о переходе в режим сна в течение 1 года после подключения. В это время ваши туннели останутся в рабочем состоянии.

Если вы не запустите команду, ssh подключится, настроит обратный туннель на порт 2205 и, когда это будет сделано, выйдет. Используя autossh, в случае сбоя подключения он снова подключится и снова перезапустит спящий режим. Даже при действительно стабильном интернет-соединении я сомневаюсь, что год возможен.

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

-f и «команда»

Вот чего вам не хватает.

0
27.01.2020, 20:06

Теги

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