ssh-agent и crontab - есть ли хороший способ заставить их встретиться? - PullRequest
28 голосов
/ 05 февраля 2010

Я написал простой скрипт, который еженедельно рассылает журналы активности svn нашим разработчикам. До сих пор я запускал его на той же машине, что и хранилище svn, поэтому мне не нужно было беспокоиться об аутентификации, я мог просто использовать svn file: /// address style.

Сейчас я запускаю сценарий на домашнем компьютере и обращаюсь к удаленному хранилищу, поэтому мне пришлось перейти на svn + ssh: // paths. С правильно настроенным ssh-ключом мне не нужно вводить пароли для доступа к хранилищу svn при нормальных обстоятельствах.

Однако у crontab не было доступа к моему ssh-keys / ssh-agent. Я читал об этой проблеме в нескольких местах в Интернете, и здесь также упоминается без разрешения:

Почему ssh не запускается из crontab, но преуспевает при запуске из командной строки?

Моим решением было добавить это в начало скрипта:

### TOTAL HACK TO MAKE SSH-KEYS WORK  ###
eval `ssh-agent -s`

Кажется, это работает под MacOSX 10.6.

Мой вопрос: насколько это ужасно, и есть ли лучший способ?

Ответы [ 10 ]

30 голосов
/ 02 августа 2011

Кроме того ...

Если в вашем ключе есть фраза-пароль, брелок спросит вас один раз (действует, пока вы не перезагрузите компьютер или не убьете ssh-agent).

брелок - это то, что вам нужно! Просто установите его и добавьте следующий код в ваш .bash_profile:

keychain ~/.ssh/id_dsa

Так что используйте код ниже в вашем скрипте для загрузки переменных среды ssh-agent:

. ~/.keychain/$HOSTNAME-sh

Примечание: цепочка для ключей также генерирует код для csh и fish shell.

Скопированный ответ от https://serverfault.com/questions/92683/execute-rsync-command-over-ssh-with-an-ssh-agent-via-crontab

21 голосов
/ 05 февраля 2010

Когда вы запускаете ssh-agent -s, он запускает фоновый процесс, который вам нужно будет убить позже. Итак, минимум, чтобы изменить ваш хак на что-то вроде:

eval `ssh-agent -s` 
svn stuff
kill $SSH_AGENT_PID

Однако я не понимаю, как работает этот хак. Простой запуск агента без запуска ssh-add не загружает никаких ключей. Возможно, ssh-агент MacOS ведет себя не так, как говорится в справочной странице .

7 голосов
/ 28 апреля 2011

У меня была похожая проблема. Мой скрипт (который основывался на ключах ssh) работал, когда я запускал его вручную, но не работал при запуске с crontab.

Определение соответствующей клавиши вручную с помощью

ssh -i /path/to/key

не работает.

Но в конце концов я обнаружил, что SSH_AUTH_SOCK был пуст, когда crontab запускал SSH. Я не был точно уверен, почему, но я просто

env | grep SSH

скопировал возвращаемое значение и добавил это определение в заголовок моего crontab.

SSH_AUTH_SOCK="/tmp/value-you-get-from-above-command"

Я не в курсе того, что здесь происходит, но это решило мою проблему. Теперь crontab работает без сбоев.

6 голосов
/ 12 декабря 2011

Один из способов восстановить pid и сокет запущенного ssh-agent:

SSH_AGENT_PID=`pgrep -U $USER ssh-agent`
for PID in $SSH_AGENT_PID; do
    let "FPID = $PID - 1"
    FILE=`find /tmp -path "*ssh*" -type s -iname "agent.$FPID"`
    export SSH_AGENT_PID="$PID" 
    export SSH_AUTH_SOCK="$FILE"
done

Это, конечно, предполагает, что в системе установлен pgrep, и работает только один ssh-агент, или, в случае нескольких, он будет использовать тот, который pgrep находит последним.

5 голосов
/ 22 мая 2013

Мое решение - на основе pra - немного улучшено, чтобы убить процесс даже при сбое скрипта:

eval `ssh-agent`
function cleanup {
    /bin/kill $SSH_AGENT_PID
}
trap cleanup EXIT
ssh-add
svn-stuff

Обратите внимание, что я должен вызвать ssh-add на моей машине (научный linux 6).

4 голосов
/ 04 февраля 2016

Для настройки автоматических процессов без автоматического взлома пароля / парольной фразы, Я использую отдельный IdentityFile, который не имеет парольной фразы, и ограничиваю записи author_keys целевых машин с префиксом from="automated.machine.com" ... и т. Д.

Я создал общедоступный закрытый набор ключей для отправляющего компьютера без ключевой фразы:

ssh-keygen -f .ssh/id_localAuto

(нажмите клавишу возврата, когда будет предложено ввести фразу-пароль)

Я установил запись удаленного хоста в .ssh/config:

Host remoteAuto
    HostName remote.machine.edu
    IdentityFile  ~/.ssh/id_localAuto

и remote.machine.edu:.ssh/authorized_keys с:

...
from="192.168.1.777" ssh-rsa ABCDEFGabcdefg....
...

Тогда ssh не требуется внешняя аутентификация, предоставляемая ssh-agent или keychain, поэтому вы можете использовать такие команды, как:

scp -p remoteAuto:watchdog ./watchdog_remote
rsync -Ca remoteAuto/stuff/* remote_mirror
svn svn+ssh://remoteAuto/path
svn update
... 
4 голосов
/ 28 февраля 2014

Предполагая, что вы уже настроили параметры SSH и этот скрипт работает нормально с терминала, использование цепочки для ключей , безусловно, является самым простым способом убедиться, что скрипт также работает нормально в crontab.

Поскольку цепочка для ключей не включена в большинство дериваций Unix / Linux, здесь приведена пошаговая процедура.

1. Загрузите соответствующий пакет rpm в зависимости от версии вашей ОС с http://pkgs.repoforge.org/keychain/. Пример для CentOS 6:

wget http://pkgs.repoforge.org/keychain/keychain-2.7.0-1.el6.rf.noarch.rpm

2. Установить пакет:

sudo rpm -Uvh keychain-2.7.0-1.el6.rf.noarch.rpm

3. Создайте файлы цепочки для ключей для вашего ключа SSH, они будут расположены в каталоге ~ / .keychain. Пример для id_rsa:

keychain ~/.ssh/id_rsa

4. Добавьте следующую строку в ваш скрипт в любом месте перед первой командой, использующей аутентификацию SSH:

source ~/.keychain/$HOSTNAME-sh

Я лично пытался избежать использования дополнительных программ для этого, но все остальное, что я пробовал, не работало. И это работало просто отлично.

3 голосов
/ 02 июня 2016

Вдохновленный некоторыми другими ответами здесь (в частности, vpk), я придумал следующую запись в crontab, для которой не требуется внешний скрипт:

PATH=/usr/bin:/bin:/usr/sbin:/sbin

* * * * *   SSH_AUTH_SOCK=$(lsof -a -p $(pgrep ssh-agent) -U -F n | sed -n 's/^n//p') ssh hostname remote-command-here
2 голосов
/ 08 мая 2014

Вот решение, которое будет работать, если вы не можете использовать связку ключей и если вы не можете запустить ssh-agent из своего скрипта (например, потому что ваш ключ защищен парольной фразой).

Запустите это один раз:

nohup ssh-agent > .ssh-agent-file &
. ssh-agent-file
ssh-add  # you'd enter your passphrase here

В скрипте, который вы запускаете из cron:

# start of script
. ${HOME}/.ssh-agent-file
# now your key is available

Конечно, это позволяет любому, кто может прочитать '~ / .ssh-agent-file' и соответствующий сокет, использовать ваши учетные данные ssh, поэтому используйте его с осторожностью в любой многопользовательской среде.

1 голос
/ 23 февраля 2016

Ваше решение работает, но оно порождает новый агентский процесс каждый раз, как уже указано в другом ответе.

Я столкнулся с похожими проблемами и нашел blogpost полезным, а такжескрипт оболочки Уэйна Уокера, упомянутый в блоге на github .

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...