Назад | Перейти на главную страницу

Разрешение SSH использовать ssh-agent в сценарии bash

Я работаю над разведкой набора систем, которые берет на себя моя компания, и они используют другой метод аутентификации, чем мы. В частности, мы используем аутентификацию AD и сервер перехода для доступа к системам, где они используют сочетание ключей, парольных фраз и других для различных систем.

Для систем, использующих ключ SSH, я пытаюсь написать сценарий, который позволяет мне автоматизировать вход в систему и запускать команду для получения данных. На моем ключе есть пароль, и поэтому я пытаюсь использовать ssh-agent, чтобы позволить моему сценарию аутентифицироваться в системах практически без ввода.

Пока кажется, что проблема в том, что когда я запускаю что-то вроде следующего, ssh-agent либо A.) Умирает и заканчивается до моего цикла 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 для ваша текущая сессия не скрипт.

Запуск ssh-agent Я бы также порекомендовал использовать извне скрипта, чтобы ваш скрипт работал без парольной фразы.

Но если вы хотите запустить агент для своего скрипта, способ сделать это

eval $(ssh-agent)

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

В страница руководства для 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, как объяснено в Ответ Ральфа Фридла.

После некоторой проверки и перепроверки я, кажется, нашел решение, но я все еще заинтересован в том, чтобы сделать эту работу в сценарии. Мне удалось заставить скрипт работать, развернув ssh-agent и ssh-add перед запуском моего скрипта и удалив все упоминания о командах, связанных с ssh-agent (в частности, строки 1 и 2 в моем примере). SSH использует переменные агента, установленные мной вне сценария, и успешно аутентифицируется с помощью ключа.

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