Запуск 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-агент и добавить к нему дополнительные ключи.
Использованная литература:
- этот фантастический ответ: https://unix.stackexchange.com/questions/90853/how-can-i-run-ssh-add-automatically-without-a-password-prompt/217223#217223
- моя собственная документация по 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