Я перешел с Snow Leopard на Lion, и мои задания cron, использующие ssh, перестали работать. Похоже, что ssh-agent больше не работает, как ожидалось.
Вот упрощенная версия моего сценария с названием «из-за-cron», который отлично работал под Snow Leopard:
#!/bin/bash
whoami # just to verify I'm running as myself, not root
ssh-agent # just to see what it outputs
eval `ssh-agent`
ssh -vvv REMOTESERVER ls
При запуске из командной строки этот скрипт работает как положено.
При запуске из cron он не работает. Вывод ssh-agent выглядит нормально:
SSH_AUTH_SOCK=/tmp/ssh-QRxPUMRxbu/agent.17147; export SSH_AUTH_SOCK;
SSH_AGENT_PID=17148; export SSH_AGENT_PID;
echo Agent pid 17148;
Agent pid 17150
Но ssh -vvv
вывод показывает, что он не работает, когда закрытый ключ должен быть прочитан:
debug1: Server accepts key: pkalg ssh-dss blen 818
debug2: input_userauth_pk_ok: fp ...
debug3: sign_and_send_pubkey: DSA ...
debug1: PEM_read_PrivateKey failed
debug1: read PEM private key done: type <unknown>
debug1: read_passphrase: can't open /dev/tty: Device not configured
debug2: no passphrase given, try next key
Другими словами, он ожидает от меня ввода ключевой фразы ~/.ssh/id_dsa
, которая, конечно, не работает в заданиях cron.
Это все работало в Snow Leopard.
Обратите внимание , что у меня есть настройки связки ключей доступа , так что ssh
, ssh-agent
и ssh-add
может прочитать мою фразу для моего .ssh/id_dsa
файла - в результате я могу SSH из терминала приглашения без необходимости ввести свой пароль.
Нужно ли запускать эту проблему ssh-add
в какой-то момент процесса входа в систему? Запуск его из стандартного приглашения bash не помогает работе cron (хотя, как ни странно, он запрашивает мою фразу-пароль ... которая, я думаю, не является необходимой из-за конфигурации Keychain Access).
ПРИМЕЧАНИЕ 1. - перед тем, как перенаправить меня, я знаю, что здесь есть похожий вопрос (
Mac OS X Lion и sshpass ), но он касается именно программы, sshpass
которую я не использую (хотя я считаю, что на этот вопрос ответит и этот вопрос) ).
ПРИМЕЧАНИЕ 2. - Я понимаю, что SSH-ключи без пароля решают мою проблему; однако я бы предпочел не идти по этому пути.
Ответы:
Для тех, кто попадает на эту страницу, я понял, что должен опубликовать ответ:
Использование launchd вместо cron действительно решает проблему авторизации. Задания, запускаемые пользователем (которые запускаются только после входа в систему) правильно используют информацию агента SSH, которая была разблокирована через цепочку для ключей, как часть входа в систему (как часть стандартного управления ключами OS X, никакого другого программного обеспечения не требуется).
Чтобы свести к минимуму мое взаимодействие с launchd, я создал одно задание launchd, которое вызывает скрипт bash. Таким образом, я могу просто отредактировать скрипт, не имея дело с launchd.
Вот файл launchd:
Я сохранил файл
~/Library/LaunchAgents/com.mycron.hourly.plist
, а затем загрузил его:После загрузки он будет запускаться сразу же, а затем каждые 60 минут.
Если вы выполните ту же процедуру, вы захотите изменить строку `ProgramArguments ', указав правильный путь к вашему сценарию.
источник
Добавление следующего кода в ваш скрипт оболочки bash решит проблему:
Замените
your_user
на свое имя пользователя.Этот код устанавливает правильное значение для
SSH_AUTH_SOCK
этого информируетssh
илиscp
о том, как общаться,ssh-agent
когда сценарий оболочки запускается изcron
.источник
zsh: no matches found: /tmp/launch-*/Listeners
Я ожидал бы, что усиленная безопасность, такая как песочница, и изменения для дальнейшего перемещения в 64-битную среду вызывают неожиданное горе.
Это не ответ, как таковой, но launchd получает всю любовь от яблока в эти дни.
Она не решает проблему cron, но более стабильна, и с ней может помочь больше людей.
источник
Для тех, кто находит это сейчас, пытается выполнить эту работу в El Capitan и все еще не хочет превращать свою однострочную работу cron в скрипт launchd, ответ Вернера Антвайлера все еще работает, но путь изменился. Ниже работал для меня:
ПРИМЕЧАНИЕ : не забудьте заменить your_user на ваше имя пользователя!
Это не позволило бы мне представить это как комментарий к его ответу, так как мне не хватает репутации, но я не хотел оставлять ее без обновления, поскольку это определенно помогло мне, наконец, настроить его.
Изменить: 30 марта 2016 г.
После некоторого тестирования я должен добавить, что это работает, только если агент использовался хотя бы один раз во время этого входа в систему. Для этого достаточно инициировать соединение ssh или запустить ssh-agent вручную. Скрипт запуска также можно использовать, если вы хотите, чтобы он запускался автоматически. Я создал файл startup.sh, который просто запускает ssh-agent, а затем с помощью редактора сценариев сохранил .app со следующим и добавил полученное приложение к своим элементам входа в систему:
источник
ls /private/tmp/com.apple.launchd.*/Listeners
. Вам не нужно ничего делать, кроме входа в Mac.