1

Я изо всех сил пытался 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 без успеха. Очень благодарен за помощь.

2 ответа2

1

Я бы не рекомендовал запускать 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 системам.

1

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

Я просто подумал, что присмотрюсь к вашим 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. Соединение разрывается при закрытии или, если сам процесс закрывает какой-либо из идентификаторов файла.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .