ssh Дозвіл відмовлено лише в роботі cron


13

Маючи дуже дивну проблему. Я створив невеликий скрипт bash, який виконує команду на віддаленому хості через ssh (використовуючи аутентифікацію відкритих ключів).

Коли я запускаю цей скрипт вручну з командного рядка, він працює добре, але при розміщенні в /etc/cron.hourly він не працює з Permission denied, please try again.помилкою.

  • Я чітко встановлюю ключ у сценарії за допомогою ssh -i /root/.ssh/id_rsa user@remote "command";
  • сценарій працює як root (я додав a echo `id` > /tmp/whoami.logдля подвійної перевірки); і
  • ключ ssh не захищений паролем ...

Система - сервер Ubuntu 12.04, у мене немає великого доступу на віддаленій стороні для усунення несправностей, але, як я вже сказав, запуск ssh вручну або той самий скрипт bash з командного рядка працює.

Будь-яка ідея, чому це відбувається або як це виправити ??

оновлення

виявляється, я помилився, і ключ ssh був захищений паролем (із keychain, що завантажує ssh-агент), отже, чому він не вдався до сценарію, але не під час запуску з bash сесії. Додавання . ~/.keychain/$HOSTNAME-shдо мого сценарію вирішило проблему (завдяки @grawity, який вказав мені в правильному напрямку та дав вичерпну відповідь).


Ви впевнені, що при запуску вручну використовується саме цей ключ? Перевірте знову після зміщення змінних SSH_AUTH_SOCKта KRB5CCNAMEсередовища.
— користувач1686

Дякую за пропозицію. Не впевнений, що я вас повністю розумію Я впевнений, що він використовує саме цей ключ, оскільки я в змозі підключити / запустити команду на віддаленому хості під час роботи вручну. Що саме слід повторно перевірити після зняття цих змінних?
— Йоав Анер

Також - я не використовую ssh-агент, тому не знаю, як SSH_AUTH_SOCKце пов’язано (хоча я радий щось спробувати). Я отримую доступ до файлу ключів безпосередньо, а файл ключа не захищений паролем. Щодо KRB5CCNAMEшвидкого пошуку показав, що це стосується Кербероса. Знову ж таки - не бачите зв’язку з цією проблемою, але, можливо, я щось тут пропускаю ...
— Yoav Aner

Тестуйте свій сценарій, звичайно. Ви не можете бути "майже впевненим, що він використовує саме цей ключ", поки ви не зробите це, оскільки завдання cron виконуються в іншому середовищі, ніж інтерактивні команди. Було б ще краще, якби ви додали -vваріант до цієї sshкоманди ...
— user1686

Але я так роблю. Я явно використовую ключ, використовуючи ssh -iкоманду в обох випадках ... Спробую зняти ці змінні в скрипті і побачити. Гарна пропозиція додати -v- я теж додам.
— Йоав Анер

Відповіді:


11

Інтерактивні команди та завдання Cron виконуються в різних середовищах - зокрема, інтерактивний сеанс може мати запуск SSH-агента або збережений Kerberos TGT. Через те, як sshзамовляють методи аутентифікації, ви не можете бути впевнені, що ваш ключ використовується лише тому, що ви додали цю -iопцію.

  • Якщо запускається агент SSH, sshклієнт завжди приміряє ключі агента, перш ніж використовувати будь-які чітко вказані ключі.

  • Якщо в мережі використовується Kerberos і присутній Kerberos TGT, OpenSSH використовуватиме її перед тим, як спробувати аутентифікацію відкритого ключа.

Я нічого не знаю про ваше оточення, але обидві ці можливості легко перевірити:

  1. Додати unset SSH_AUTH_SOCKта unset KRB5CCNAMEперед sshкомандою, а потім вручну запустити змінений сценарій.

    Це не дозволить скрипту бачити агент або квитки Kerberos і використовуватиме лише чітко вказаний ключ.

  2. Додати -vопцію в ssh. Це відобразить більш детальну інформацію про те, як відбувається автентифікація.

Ви також можете додати -oIdentitiesOnly=yesдо sshкоманди; це змусить його використовувати вказаний ключ .


А якщо додати поради щодо доступу до агента з крона - ще краще

Це, як правило, не рекомендується, оскільки агент зазвичай тісно пов'язаний з вашим інтерактивним сеансом входу. Зокрема, він запускається лише тоді, коли ви входите в систему, і вбивається під час виходу з нього - і йому потрібен ваш пароль, щоб фактично розблокувати ключі SSH (якщо припустити, що вони захищені паролем).

Ви згадали про «Брелок» - це програма OS X чи сценарій Linux? (Я не знаю багато про архітектуру Mac OS X, але AFAIK робить це набагато складніше отримати доступ до ssh-агента користувача з cronjob ...)


1
Ви можете використовувати ssh-cron для встановлення запланованих з'єднань SSH для захисту серверів, не піддаючи SSH-ключі, але використовуючи SSH-агент. superuser.com/questions/463540/…
— Luchostein

5

Іншим вирішенням цієї проблеми є встановити cron на ssh до локальної скриньки, щоб, в свою чергу, запустити команду ssh замість запуску файлу або команди його локальним абсолютним шляхом. Це кешує KRB5CCNAME і працює там, де / path / command не має.

# Fails:
0 * * * * /home/user/sshscript.sh

# Works:
0 * * * * /usr/bin/ssh user@localhost /home/user/sshscript.sh

#!/bin/bash
# Works:
unset SSH_AUTH_SOCK
unset KRB5CCNAME
/usr/bin/ssh user@localhost /home/user/sshscript.sh

1

Ви можете використовувати ssh-cron для встановлення запланованих з'єднань SSH для захисту серверів, не піддаючи SSH-ключі, але використовуючи SSH-агент.


Залежності недоступні на Homebrew, тому встановлення здається складним. Ключ без пароля, я здогадуюсь…: - /
— Чарлі Горічаназ

-1

ви можете запустити свій скрипт або команду в crontab, як:

0 * * * * bash -c -l "/home/user/sshscript.sh"

або

0 * * * * bash -c -l "ssh root @ yourhost 'echo $ HOSTNAME'"


1
OP вже намагається запустити сценарій через cron; так що це насправді не дає відповіді.
— bertieb
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.