Я работаю над разведкой набора систем, которые берет на себя моя компания, и они используют другой метод аутентификации, чем мы. В частности, мы используем аутентификацию 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) и evalssh-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.