Запуск ssh-agent из скрипта оболочки

19

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

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

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

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

Дэн
источник

Ответы:

8

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

То, что вы хотите, это то, session-scriptчто содержит ваши команды сеансов, как это:

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

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

Майкл Зельманн
источник
Благодарность! Создание отдельного сценария и завершение сценария exitсделали свое дело.
Дан
2
что такое сессия-скрипт?
Александр Миллс
15

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

eval `ssh-agent`

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

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

объяснение

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

scottyseus
источник
9
Это именно то, что мне было нужно, спасибо, хотя стоит отметить, что обратные ходы находятся на выходе. В новой форме bash это должно бытьeval $(ssh-agent)
Сибаз
Это решение не работало для меня, пока я не поставил bash -iв конце сценария.
Адольфо Корреа
6

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

#!/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).

Zoredache
источник
Но это не сохранит никаких параметров скрипта. И если какой-либо из параметров имеет пробел, передать их будет непросто.
Денилсон Са Майя
3
Вы можете использовать .. "ssh-add ; $0 $*"или .. "ssh-add ; $0 $@"вместо этого, который может работать. Что не было бы идеально, но, безусловно, сработало бы во многих случаях. Лучшее решение почти всегда состоит в том, чтобы ваш агент работал в любом случае, в любом случае, это может быть полезно в неясных случаях.
Зоредаче
6

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

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, добавляю ключ, делаю то, что мне нужно, затем убиваю его. Не нужно проверять, работает ли он позже.

на паровой тяге
источник
4

В этом случае лучше использовать связку ключей

Debian / Ubuntu:

apt-get install keychain

RHEL / Fedora / CentOS

yum install keychain

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

eval `keychain --eval id_rsa`
ЗИАДИ Мохамед али
источник
Лучше? Почему лучше?
JFlo
@JFlo "Лучше" в этом, он сохранит переменные env в $ HOME / .keychain / <file>. Повторный запуск этой команды заберет существующий ssh-agent, если он все еще работает. Затем он может быть повторно использован между оболочками / скриптами. В некоторых случаях это небезопасно, поэтому вы должны сделать этот вызов. Для меня это улучшение по сравнению с некоторыми сценариями, которые я написал, чтобы выполнить ту же задачу
Скотт Карлсон,
2

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

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

#!/usr/bin/ssh-agent bash

ssh-add /path/to/ssh-key
ssh root@remotehost "remote commands"
Энди Вуд
источник
-2

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

ssh-keygen -p
Стефан Вайнхолд
источник
Это очень небезопасная практика. Зачем вообще использовать ssh? Если вы не защищаете свой закрытый ключ, вы можете говорить в открытом виде.
JFlo
@JFlo: нет, если ваша клиентская система достаточно безопасна, как это может быть. Особенно, если вы (можете и хотите) добавить ACL, SELinux или аналогичные, что легко для статического файла, но не так для случайного сокета ssh-agent. Это сказало, что я обычно не рекомендовал бы это как первый выбор.
dave_thompson_085
Хотя это очень полезный процесс, который вы предоставляете, я не думаю, что он отвечает на вопрос ОП.
Александр Берд