Автоматизация ssh-соединения с помощью crontab

1522
geotheory

Я изо всех сил пытался crontab автоматизировать процесс git push с помощью ssh, и было сложно установить ключ с помощью агента ssh. Начиная с базового скрипта для тестирования агента:

# set paths (all examples) source /etc/profile export PATH=$PATH:/Users/myusername/.ssh  eval "$(ssh-agent)" > ssh_agent.txt /usr/bin/ssh-add -l >> ssh_agent.txt 

.. который выводит следующее:

Agent pid 16062 The agent has no identities. 

Таким образом, агент активен. Теперь добавьте ключ и проверьте, что он зарегистрирован у агента. В iTerm2 вручную это работает нормально:

/usr/bin/ssh-add /Users/myusername/.ssh/id_rsa 2048 [key fingerprint] /Users/myusername/.ssh/id_rsa (RSA) 

Я пытаюсь повторить это внутри задания crontab, используя этот скрипт:

/usr/bin/ssh-add /Users/myusername/.ssh/id_rsa /usr/bin/ssh-add -l >> ssh_agent.txt 

.. который сообщает The agent has no identitiesв файл, и следующие через "You have mail in /var/mail/myusername":

[email metadata] Enter passphrase for /Users/myusername/.ssh/id_rsa:  

Таким образом, ключ пытается загрузить, но ловит в приглашении пароля. Здесь я хочу использовать expectэту фразу, как описано в этом ответе unix.stackexchange (похоже, он должен работать в OSX):

#!/usr/bin/expect -f /usr/bin/ssh-add /Users/myusername/.ssh/id_rsa expect "Enter passphrase for /Users/myusername/.ssh/id_rsa:" send "mypassphrase\n"; interact 

Ответ об ошибке почты:

Enter passphrase for /Users/myusername/.ssh/id_rsa:  couldn't read file "Enter passphrase for /Users/myusername/.ssh/id_rsa:": no such file or directory /Users/myusername/test/crontest.sh: line 17: send: command not found /Users/myusername/test/crontest.sh: line 18: interact: command not found 

Поэтому я попробовал альтернативную конфигурацию на основе этого SO ответа :

#!/usr/bin/expect -f expect -c " /usr/bin/ssh-add /Users/myusername/.ssh/id_rsa expect \"Enter passphrase for /Users/myusername/.ssh/id_rsa: \" send \"mypassphrase\n\"; interact " 

.. и получите следующий почтовый отчет об ошибке:

invalid command name "/usr/bin/ssh-add" while executing "/usr/bin/ssh-add /Users/myusername/.ssh/id_rsa" Could not open a connection to your authentication agent. 

Я не понимаю, проблема здесь - агент ssh работает, и ключ кажется доступным, так что же это за проблема с соединением? Я пробовал другие конфигурации expectбез успеха. Очень благодарен за помощь.

1
NB `eval" $ (ssh-agent) "` необходимо включить в рабочий скрипт, так как он действительно [инициирует агента] (http://stackoverflow.com/a/17848593/1156245). geotheory 9 лет назад 0

2 ответа на вопрос

1
Anthony Geoghegan

Я бы не рекомендовал запускать ssh-addили выполнять expectзадания cron, так как запускать их в ограниченной среде, которую использует cron для выполнения своих заданий, слишком сложно, и я бы предпочел не хранить пароли в crontab.

Вместо того чтобы использовать ваш обычный ключ SSH, я бы создал новый ключ, который будет использоваться только для запуска команды, которую вы хотите запустить с помощью cron. Я бы настроил ключ без ключевой фразы и изменил бы его владельца / разрешения (0600) так, чтобы к нему можно было получить доступ только по эффективному идентификатору пользователя, под которым выполняется задание cron, т. Е. Идентификатору пользователей, чей crontab используется обработанный.

В вашем конкретном случае конкретная команда такова, git pushчто новый ключ должен быть загружен на ваш сервер git. Большинство git-серверов должны иметь возможность принимать несколько открытых ключей SSH.

В целом, для автоматизированных процессов лучше всего создавать конкретные ключи без парольных фраз. Затем на удаленном SSH-сервере настраивается ограниченный набор разрешенных команд, добавляя пары опций к его строке в authorized_keysфайле, например:

command="automated-task.sh",client=my.local.host,no-pty,no-agent-forwarding,no-port-forwarding ssh-rsa AAA…public…part…of…specific…keypair automated_user@server 

Отказ от ответственности: у меня больше опыта работы с GNU / Linux, чем с OS X, но AFAIK приведенная выше информация должна относиться ко всем * nix системам.

Это хорошо работает. Спасибо Энтони. Вы сказали бы, что для закрытого ключа достаточно стандартного OSX chmod 600? geotheory 9 лет назад 0
@geotheory Рад это слышать. 600 звуков в самый раз. Anthony Geoghegan 9 лет назад 1
Я только что обновил свой ответ, чтобы включить права доступа к файлу. Anthony Geoghegan 9 лет назад 0
1
Anthony Geoghegan

Альтернативный ответ

Я просто подумал, что присмотрюсь к вашим expectсценариям, и заметил, что в них отсутствует spawnкоманда:

#!/usr/bin/expect -f spawn /usr/bin/ssh-add /Users/myusername/.ssh/id_rsa expect "Enter passphrase for /Users/myusername/.ssh/id_rsa:" send "mypassphrase\n"; interact 

Из expectруководства:

spawn [args] программа [args]

создает новый процесс, запускающий программу args. Его stdin, stdout и stderr связаны с Expect, так что они могут быть прочитаны и записаны другими командами Expect. Соединение разрывается при закрытии или, если сам процесс закрывает какой-либо из идентификаторов файла.

Я получил «spawn: command not found», который выглядит так, как будто bash - неверный интерпретатор, объясняющий обоснование второго метода, который я пробовал. Так что я попробовал эту версию с помощью «spawn», который дразнящим образом возвращает: `spawn / usr / bin / ssh-add /Users/myusername/.ssh/id_rsa Введите пароль для /Users/myusername/.ssh/id_rsa:` Однако, все еще «Агент не имеет идентичности», так что что-то все еще не в порядке. geotheory 9 лет назад 0