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

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

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

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

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

9 ответов

Решение

Предполагается, что 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`

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

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

объяснение

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

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

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

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

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

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

Debian / Ubuntu:

apt-get install keychain

RHEL / Fedora / CentOS

yum install keychain

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

eval `keychain --eval id_rsa`

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

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

#!/usr/bin/ssh-agent bash

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

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

В свой сервер или файл добавьте это:

      # Auto-start the ssh agent and add necessary keys once per reboot. 
#
# This is recommended to be added to your ~/.bash_aliases (preferred) or ~/.bashrc file on any
# remote ssh server development machine that you generally ssh into, and from which you must ssh
# into other machines or servers, such as to push code to GitHub over ssh. If you only graphically
# log into this machine, however, there is no need to do this, as Ubuntu's Gnome window manager,
# for instance, will automatically start and manage the `ssh-agent` for you instead.
#
# See: 
# https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/tree/master/home/.ssh#auto-starting-the-the-ssh-agent-on-a-remote-ssh-based-development-machine

if [ ! -S ~/.ssh/ssh_auth_sock ]; then
    echo "'ssh-agent' has not been started since the last reboot. Starting 'ssh-agent' now."
    eval "$(ssh-agent -s)"
    ln -sf "$SSH_AUTH_SOCK" ~/.ssh/ssh_auth_sock
fi
export SSH_AUTH_SOCK=~/.ssh/ssh_auth_sock
# see if any key files are already added to the ssh-agent, and if not, add them
ssh-add -l > /dev/null
if [ "$?" -ne "0" ]; then
    echo "No ssh keys have been added to your 'ssh-agent' since the last reboot. Adding default keys now."
    ssh-add
fi

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

Затем, чтобы предоставить любому другому сценарию доступ к этому агенту, чтобы сценарий мог использовать ключи, например, для отправки или извлечения кода из репозитория GitHub, добавьте это в свой сценарий:

      export SSH_AUTH_SOCK=~/.ssh/ssh_auth_sock

Это просто указывает вашему сценарию использовать уже открытый сокет ssh, который вы открыли, когда вручную подключались по ssh.

Однако, если сценарий запускается до того, как вы вручную подключились к нему по ssh, вместо этого вы можете добавить в сценарий весь большой блок кода, указанный выше, чтобы он предложил вам запустить ssh-агент прямо здесь и позволить вам ввести свои ssh-ключи. прямо тогда. В этом случае вы получите большой блок кода над обоими в вашем~/.bashrcили~/.bash_aliasesфайл и в вашем скрипте, который должен использовать ssh-агент и добавить к нему дополнительные ключи.

Использованная литература:

  1. этот фантастический ответ: https://unix.stackexchange.com/questions/90853/how-can-i-run-ssh-add-automatically-without-a-password-prompt/217223#217223
  2. моя собственная документация по SSH: https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/tree/master/home/.ssh

Вы можете сделать все следующее:

  • запустить агента
  • добавьте необходимый ключ
  • выполнить произвольный код
  • неявно очищать сеанс при выходе из процесса

запустить агента

      $ <<eof ssh-agent sh 
echo \$SSH_AGENT_PID
ssh-add /tmp/key
ssh-add -l
echo arbitrary code
eof
98114
Identity added: /tmp/key (control@fubar)
4096 SHA256:MSKhXkIcFHnMIaY7+eOdIH5V23LXt+azcVtu4T01o5M control@fubar (RSA)
arbitrary code

агент, иди(не) пока-пока

      $ ps -p 98114
  PID TTY           TIME CMD

Я затаю дыхание, пока жду геста.. эээ, модераторы придут и отредактируют что-нибудь

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

ssh-keygen -p
Другие вопросы по тегам