Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: stanОтветов: 2

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

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

До сих пор мне удалось настроить большую часть этого - мой скрипт использует пул - исходный файл, содержащий 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".

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

batch-fileoutput

Ответы

Ответ 1 · RGuggisberg

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

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

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

Ответ 2 · wimh

Легче решить вашу проблему на стороне 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, выполнить и удалить его.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы