Разрешение 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) и eval ssh-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.

Другие вопросы по тегам