3

Я пытаюсь написать скрипт, который откроет SSH-туннель к общедоступному серверу. У меня все написано и работает правильно, но соединение с моим сервером, похоже, не устанавливается. Журналы говорят такие вещи, как:

Jun 8 21:00:01 <hostname> CRON[xxxx]: session opened for user <user> by (uid=0)
Jun 8 21:00:01 <hostname> CRON[xxxx]: session closed for user <user>

Снова и снова, с 0-1 секундами между ними. Я хочу, чтобы это соединение говорило открыто .... Как я могу держать это открытым?

Мой код выглядит так для cron (да, я знаю, что он работает каждую минуту):

* * * * * /bin/bash /home/<user>/ssh

Мой код для регистрации:

sshpass -p <password> ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null <user>@<url> -p <port> -R222<random_number>:localhost:22

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

1 ответ1

3

В вашем скрипте crontab есть несколько ошибок.

  1. Причиной отключения является тот факт, что сценарию требуется не только разрешение на выполнение, но и набор битов suid (sudo chmod 4755 /pah /to /script), если вы выполняете сценарий оболочки от имени пользователя root.

  2. Среды crontab сильно отличаются от пользовательских. Следовательно, всегда необходимо использовать полные пути к командам:

    /usr/bin/sshpass -p <password> /usr/bin/ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null <user>@<url> -p <port> -R222<random_number>:localhost:22
    
  3. Вы должны добавить флаги -t -t к команде ssh (да, дважды), потому что это подавляет ошибку, что tty не может быть выделен.

  4. Хотя я уверен в предыдущих ошибках, есть одна, которая может вызвать проблемы, но я не уверен, и у меня нет времени на ее устранение: в вашей команде два флага -p , и я не уверен, что они правильные интерпретируется оболочкой. На вашем месте я бы поместил команду ssh со всеми ее параметрами в одинарные или двойные кавычки, просто чтобы попробовать.

Предыдущих возражений и использования открытого пароля можно было бы избежать, если бы вы использовали криптографические ключи, и в этом случае вы можете добавить в свой файл .ssh/config следующие строки:

   Host ShortName
             HostName The.Full.HostName.com
             User yourname
             Port your-non-standard-port
             IdentityFile /path/to/crypto/keyù
             IdentitiesOnly yes

и тогда однострочник станет

  /usr/bin/ssh -t -t -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -R222<random_number>:localhost:22 ServerName

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .