Разрешение SSH использовать ssh-agent в скрипте bash
Я работаю над разведкой для набора систем, которые берет на себя моя компания, и они используют другой метод аутентификации, чем мы. В частности, мы используем аутентификацию AD и сервер перехода для доступа к системам, где они используют сочетание ключей, парольных фраз и других для различных систем.
Для систем, которые используют SSH-ключ, я пытаюсь написать скрипт, который позволит мне автоматизировать вход в систему и выполнить команду для получения данных. У моего ключа есть пароль, и поэтому я пытаюсь использовать ssh-agent, чтобы позволить моему сценарию проходить аутентификацию в системах с минимальным вводом или без ввода.
До сих пор кажется, что проблема заключается в том, что когда я запускаю что-то вроде следующего, ssh-agent либо A.) Умирает и заканчивается перед циклом my for, либо B.) печатает команды для переменных среды и не тянет их в область действия.
eval ssh-agent
ssh-add ~/.ssh/${USER}_mvc
for i in `cat ${HOSTLIST}`
do
ssh -l ${USER} ${i} -t 'uname -r'
&>${OUTDIR}/${i}.keyauthcollector
done
Я знаю, что мне чего-то не хватает, чтобы извлечь переменные, сгенерированные агентом SSH, но я не могу найти его, и, конечно, все скрипты, которые я нахожу при поиске в Google для помощи по написанию скриптов SSH-Agent, заставляют ssh-agent работать для Ваш текущий сеанс не сценарий.
3 ответа
Страница man для ssh-agent объясняет, чего не хватало:
Существует два основных способа настройки агента:
Во-первых, агент запускает новую подкоманду, в которую экспортируются некоторые переменные среды, например
ssh-agent xterm &
,Во-вторых, агент печатает необходимые команды оболочки (может быть сгенерирован либо синтаксис sh(1), либо csh(1)), которые можно оценить в вызывающей оболочке, например, eval.
ssh-agent -s
для оболочек типа Борна, таких как sh(1) или ksh(1) и evalssh-agent -c
для csh(1) и производных.
Первым вариантом будет удалить eval ssh-agent
и позвонить ssh-agent your-script
вместо. Второй вариант - добавить недостающее $(
... )
захватить ssh-agent
вывод в качестве входных данных для eval, как объяснено в ответе RalfFriedl.
Начиная ssh-agent
извне сценарий - это то, что я бы также порекомендовал, чтобы ваш сценарий выполнялся без ключевой фразы.
Но если вы хотите запустить агент для своего скрипта, способ сделать это
eval $(ssh-agent)
После этого вы можете добавить ключи к агенту и использовать агент для входа в систему.
После некоторой проверки и перепроверки я, кажется, нашел решение, но я все еще заинтересован в том, чтобы сделать эту работу в сценарии. Я смог заставить скрипт работать, развернув ssh-agent и ssh-add перед запуском моего скрипта и удалив все упоминания о командах, связанных с ssh-agent (в частности, строки 1 и 2 в моем примере). SSH использует переменные агента, установленные мной вне скрипта, и успешно аутентифицируется с помощью ключа.
Недостаток: я до сих пор не знаю, как заставить его создать сеанс ssh-agent в сценарии оболочки и продолжать использовать этот сеанс агента с циклом for.