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.