Пакетный скрипт для подключения через SSH, выполнения команды и передачи результатов в файл OUTPUT.

Я понимаю, что запрос простой, и в Интернете есть много похожих тем, но по какой-то причине я не могу это сделать, и я в самом конце.

Это сценарий. Пакетный скрипт подключится (используя ссылку шпатлевки) к хосту. Он выполнит команду (например, проверит версию хоста). Скрипт выведет результат в файл.

До сих пор мне удалось настроить большую часть этого — мой скрипт использует пул — исходный файл, содержащий IP-адреса, для чтения хостов, к которым он должен подключиться; он подключается к хостам; выполняет команду проверки версии и сохраняет результат в файл. Однако результат имеет плохой формат, и я не могу привести формат, который я хотел бы видеть в выходном файле.

Это мой код:

:Var
set out=E:\output.txt
set src=E:\servers.txt
set ver=cat /etc/*-release
set creds=-l root -pw root
set host=hostname
:Cond
for /f %%i in (%src%) do call :Cmd %%i
:Cmd
plink -ssh %1 %creds% %host%
plink -ssh %1 %creds% %ver%
echo %1 is %ver% >> %out%

Результат примерно такой:

server01Red Hat Enterprise Linux Server release 5.7 Beta (Tikanga)
server02Red Hat Enterprise Linux Server release 5.7 Beta (Tikanga)

Поэтому я хотел бы сделать его правильно отформатированным, например:

server01 OS:Red Hat Enterprise Linux Server release 5.7 Beta (Tikanga)
server02 OS:Red Hat Enterprise Linux Server release 5.7 Beta (Tikanga)

Или даже иметь возможность обрезать вывод команды, запущенной на хосте, и отображать только его часть, например, только «Red Hat».

Благодарю вас!


person stan    schedule 20.02.2013    source источник


Ответы (2)


Вы звоните :Cmd один раз и не возвращаетесь. И если бы вы вернулись из :Cmd, вы попали бы прямо в него. вам нужно закончить: Cmd с помощью goto: eof

Затем нужно поставить еще один goto :eof (или какой-нибудь goto) перед :Cmd, чтобы не попасть в него.

Как вы хотите, чтобы результат выглядел? Если вы всегда хотите использовать первые 2 токена, используйте оператор FOR.

person RGuggisberg    schedule 20.02.2013
comment
Привет RGuggisberg Спасибо за подсказки. Я внесу изменения. Что касается результата, я хотел бы добиться следующего вывода: server01 Red Hat Enterprise Linux Server, выпуск 5.7 Beta server02 Ubuntu server03 Red Hat Enterprise Linux Server, выпуск 6 Итак, это означает ‹сервер›‹вкладка›‹версия›. Я также столкнулся с серьезной проблемой, пытаясь встроить «вкладку» в сценарий, поэтому, если это невозможно, я хотел бы, по крайней мере, убедиться, что между «сервером» и «версией» есть пробелы. Ваше здоровье! - person stan; 21.02.2013

Легче решить вашу проблему на стороне Linux, т.е. изменить скрипт, чтобы он отображал именно то, что вы хотите. Например, вы можете выполнить следующую команду:

(hostname;echo -e "\tOS:";cat /etc/issue)|sed '{:q;N;s/\n//g;t q}'

это выполняет имя хоста, отображает символ табуляции и «ОС:» и отображает /etc/issue (вы также можете использовать /etc/*-release). Наконец, все новые строки удаляются из результата с помощью sed. (вы также можете использовать tr "\n" "")

Если вы хотите выполнить это с помощью plink, вам нужно убедиться, что в пакетном файле правильно экранированы такие символы, как |. У меня нет Windows-машины, но это может выглядеть так:

plink -ssh %1 %creds% ^(hostname;echo -e "\tOS:";cat /etc/issue^)^|sed '{:q;N;s/\n//g;t q}'

Я не уверен, что правильно избежал этого. Было бы проще сохранить команду в файле, а затем выполнить ее. Вы даже можете загрузить скрипт с помощью scp, выполнить и удалить его.

person wimh    schedule 23.02.2013