Назад | Перейти на главную страницу

Запуск ssh-agent из сценария оболочки

Я пытаюсь создать сценарий оболочки, который, помимо прочего, запускает ssh-agent и добавляет агенту закрытый ключ. Пример:

#!/bin/bash
# ...
ssh-agent $SHELL
ssh-add /path/to/key
# ...

Проблема в том, что ssh-agent, по-видимому, запускает другой экземпляр $ SHELL (в моем случае, bash), и с точки зрения сценария он выполняет все, а ssh-add и все, что ниже, никогда не запускается.

Как я могу запустить ssh-agent из сценария оболочки и продолжить движение вниз по списку команд?

Поместите следующее в начало вашего скрипта:

eval `ssh-agent`

Ваш сценарий должен выглядеть так:

#!/bin/bash
eval `ssh-agent`
ssh-add /path/to/key
...
...

Объяснение

Обратные кавычки вокруг ssh-agent собираем его выход. eval собирает этот вывод, объединяет его в одну команду, а затем выполняет команду. Тогда вы можете использовать ssh-add чтобы предоставить свои ключевые учетные данные.

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

Вы хотите session-script который содержит команды ваших сеансов, например:

#!/bin/bash
ssh-add /path/to/key
bash -i # or other session starter

Тогда начни ssh-agent session-script.

Я нашел, что это работает для меня.

eval `ssh-agent` # create the process
ssh-add ~/.ssh/priv_key # add the key
git -C $repo_dir pull # this line is the reason for the ssh-agent
eval `ssh-agent -k` # kill the process

Я создаю процесс ssh-agent, добавляю ключ, делаю то, что мне нужно, а затем убиваю его. Не нужно проверять, работает ли он позже.

Я обычно делаю что-то подобное в сценариях, требующих агента.

#!/bin/bash

# if we can't find an agent, start one, and restart the script.
if [ -z "$SSH_AUTH_SOCK" ] ; then
  exec ssh-agent bash -c "ssh-add ; $0"
  exit
fi

... and so on.

По сути, первым делом сценарий проверяет, запущен ли агент. Если это не так, exec используется для запуска нового процесса вместо скрипта. Агент запускается, ключи добавляются и, наконец, снова вызывается скрипт (см. $0).

Лучше использовать Брелок в таком случае

Debian / Ubuntu:

apt-get install keychain

RHEL / Fedora / CentOS

yum install keychain

Добавьте в свой .bashrc следующее:

eval `keychain --eval id_rsa`

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

Я обнаружил, что в верхней части скрипта работает следующий шебанг:

#!/usr/bin/ssh-agent bash

ssh-add /path/to/ssh-key
ssh root@remotehost "remote commands"

Я много пробовал, и решение, которое наконец сработало, заключалось в замене моей парольной фразы пустой строкой.

ssh-keygen -p