Возникла очень странная проблема. Я создал небольшой скрипт bash, который запускает команду на удаленном хосте через ssh (используя аутентификацию с открытым ключом).
Когда я запускаю этот скрипт вручную из командной строки, он работает нормально, но при помещении в /etc/cron.hourly он завершается с Permission denied, please try again.
ошибкой.
- Я явно установил ключ в скрипте с помощью
ssh -i /root/.ssh/id_rsa user@remote "command"
; - скрипт запускается от имени пользователя root (я добавил
echo `id` > /tmp/whoami.log
для двойной проверки); и - ключ ssh не защищен паролем ...
Система является сервером Ubuntu 12.04, у меня нет большого доступа на удаленной стороне для устранения неполадок, но, как я уже сказал, работает ssh вручную или тот же скрипт bash из командной строки.
Любая идея, почему это происходит или как это исправить ??
Обновить
Оказывается, я ошибся, и ключ ssh был защищен паролем (с помощью цепочки ключей, загружающей ssh-agent), поэтому он не работал из сценария, но не при запуске из сеанса bash. Добавление . ~/.keychain/$HOSTNAME-sh
в мой сценарий решило проблему (спасибо @grawity, который указал мне правильное направление и дал исчерпывающий ответ).
SSH_AUTH_SOCK
иKRB5CCNAME
переменных окружения.SSH_AUTH_SOCK
это связано (хотя я с удовольствием попробую что-нибудь). Я обращаюсь к файлу ключа напрямую, и файл ключа не защищен паролем. КакKRB5CCNAME
показал быстрый поиск, это как-то связано с Kerberos. Опять же - не вижу связи с этой проблемой, но, может быть, я что-то здесь-v
опцию к этойssh
команде ...ssh -i
команду в обоих случаях ... Я попытаюсь сбросить эти переменные в скрипте и посмотреть. Хорошее предложение добавить-v
- я тоже добавлю.Ответы:
Интерактивные команды и задания cron выполняются в разных средах - в частности, в интерактивном сеансе может быть запущен агент SSH или сохранен Kerberos TGT. Из-за способа
ssh
заказа методов аутентификации вы не можете быть уверены, что ваш ключ используется только потому, что вы добавили эту-i
опцию.Если агент SSH работает,
ssh
клиент всегда пробует ключи агента перед использованием каких-либо явно указанных ключей.Если в сети используется Kerberos и присутствует Kerberos TGT, OpenSSH будет использовать его перед попыткой аутентификации с открытым ключом.
Я ничего не знаю о вашей среде, но обе эти возможности легко проверить:
Добавьте
unset SSH_AUTH_SOCK
иunset KRB5CCNAME
передssh
командой, затем вручную запустите измененный скрипт.Это не даст сценарию увидеть агента или билеты Kerberos и будет использовать только явно указанный ключ.
Добавьте
-v
опцию кssh
. Это покажет более подробную информацию о том, как происходит аутентификация.Вы также можете добавить
-oIdentitiesOnly=yes
вssh
команду; это заставит его использовать указанный ключ .Обычно это не рекомендуется, поскольку агент обычно тесно связан с вашим сеансом интерактивного входа. В частности, он запускается только при входе в систему и уничтожается при выходе из системы - и для его разблокировки ключей SSH необходим ваш пароль (при условии, что они были защищены паролем).
Вы упомянули «Keychain» - это программа OS X или скрипт Linux? (Я не очень разбираюсь в архитектуре Mac OS X, но AFAIK значительно затрудняет доступ к ssh-агенту пользователя с помощью cronjob ...)
источник
Другим обходным решением этой проблемы является установка cron для ssh в локальном окне, чтобы, в свою очередь, запускать команду ssh вместо запуска файла или команды по локальному абсолютному пути. Это кэширует KRB5CCNAME и работает там, где / path / command нет.
источник
Вы можете использовать ssh-cron для установки запланированных SSH-соединений для защиты серверов, не раскрывая ваши SSH-ключи, но используя SSH-агент.
источник
Вы можете запустить свой скрипт или команду в crontab, например:
0 * * * * bash -c -l "/home/user/sshscript.sh"
или
0 * * * * bash -c -l "ssh root @ yourhost 'echo $ HOSTNAME'"
источник
cron
; так что, похоже, это не дает ответа.