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

Выгрузка вывода команды из сеанса SSH для обработки

Я пытаюсь получить информацию с помощью команды «показать mac-адрес» из набора из 12 коммутаторов procurve в 2 разных местах, все подключенных через оптоволоконный PTP. Я хочу импортировать это в SQL для некоторых запланированных отчетов о статистике, движении, маршрутах и ​​т. Д. Мне удалось сгенерировать некоторые очень интересные и полезные данные, которые в конечном итоге позволят мне превратить этого монстра, которого я унаследовал, в меньшее количество монстра, которого он является.

У меня есть все компоненты этой работы, кроме того факта, что я должен вручную собирать данные для каждого переключателя с помощью замазки, сохранять их в каталоге, где запланированная задача форматирует дампы в csv, очищает их и импортирует с помощью BULK INSERT.

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

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

с помощью...

plink -batch -ssh -l <username> -pw <password> xxx.xxx.xxx.xxx < cmds.txt > out.txt

переключатели находятся в стеках, поэтому мне нужно пропустить сообщения «не управление HP» и запросы «в какой переключатель вы хотите войти», похоже, это работает только с \ n \ n в файле (так же, как я когда я вхожу в putty, введите дважды) Но после этого я получаю длинные последовательности ASCII, которые кажутся странными, потому что все до этого момента работает без проблем.

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

Любые подсказки о том, как заставить это работать, или разумную альтернативу для достижения того же?

Пример того, что я получаю ...

HP J9148A 2910al-48G-PoE Switch

Software revision W.15.13.0005



Copyright (C) 1991-2014 Hewlett-Packard Development Company, L.P.

                   RESTRICTED RIGHTS LEGEND
 Confidential computer software.  Valid license from HP required for possession,
 use or copying. Consistent with FAR 12.211 and 12.212, Commercial Computer
 Software, Computer Software Documentation, and Technical Data for Commercial
 Items are licensed to the U.S. Government under vendor's standard commercial
 license.
                   HEWLETT-PACKARD DEVELOPMENT COMPANY, L.P. 
                   20555 State Highway 249, Houston, TX 77070


Non-HP transceiver detected, which may cause network problems.
Use 'show interface transceiver' command for details.
HP will not support or troubleshoot problems with these transceivers.
[1;15r[1;1H[24;1HPress any key to continue[15;1H[?25h[24;27H[2J[?7l[1;15r[?6l[24;27H[?25h[23;1H  Stack Members

  SN MAC Address   System Name   Device Type          Status                   
  -- ------------- ------------- -------------------- -------------------------
  0  xxxxxx-xxxxxx Switch1        HP 2910al-48G-PoE   Commander Up             
  1  xxxxxx-xxxxxx Switch2        HP 2910al-48G       Member Up                
  2  xxxxxx-xxxxxx Switch3        HP 2910al-24G-PoE   Member Up                                

[23;1HEnter switch number to connect to or <CR>:[23;1H[23;44H[?25h[23;1H[?25h[23;44H[?6l[1;24r[?7l[2J[1;1H[1920;1920H[6n[1;1HYour previous successful login (as manager) was on 2016-01-29 19:31:41     
 from xx.x.x.xxx
[1;24r[24;1H[24;1H[2K[24;1H[?25h[24;1H[24;1HSwitch1# [24;1H[24;11H[24;1H[?25h[24;11H[24;0HE[24;1H[24;11H[24;1H[2K[24;1H[?25h[24;1H[1;24r[24;1H[1;24r[24;1H[24;1H[2K[24;1H[?25h[24;1H[24;1HSwitch1# [24;1H[24;11H[24;1H[?25h[24;11H[24;0HE[24;1H[24;11H[24;1H[2K[24;1H[?25h[24;1H[1;24r[24;1H[1;24r[24;1H[24;1H[2K[24;1H[?25h[24;1H[24;1HSwitch1#

Итак, я дошел до приглашения Switch1 # на консоли коммутатора.

мой входной файл на данный момент просто

show mac-address

С двумя пустыми строками выше для выполнения двух запросов «любой ключ» и «продолжить».

Любая помощь очень ценится.

Приходится ли использовать шпатлевку из Windows? Исходя из коробки Linux, я бы сделал

( echo $password ; echo ; echo ; echo show mac-address ) \
| ssh -l $user xxx.xxx.xxx.xxx

или если это не сработает, я воспользуюсь программой expect. На самом деле существует версия expect для Windows, которую вы, вероятно, могли бы использовать вместо plink.

Ожидайте, что пример синтаксиса будет у меня в голове с различным выходом переключателя (должен работать с или без «нажмите любую клавишу», но, конечно, я ничего не тестировал):

#!/usr/bin/expect -f
spawn ssh -l loginuser [lindex $argv 0]

set timeout 600

while (1) {
    expect "Press any key to continue" { send "\n" }
           "Enter switch number to connect to or <CR>:" { send "password\n" }
           "#" { break }
}

send "show mac-address\n"

expect "#"

send "quit\n"

expect eof

Но сделай, как предложил Пол, и попробуй autoexpect, он позволит вам выполнить ваш сценарий и выведет ожидаемый сценарий, который будет делать то же самое. Затем вы берете этот вывод и заменяете имя или IP-адрес коммутатора на [lindex $argv 0], и выполните его с именем переключателя в качестве аргумента.

Мне так и не удалось заставить это работать должным образом, и я не возвращался на сайт уже долгое время, но, поскольку вопрос казался популярным, я решил опубликовать то, что я в итоге сделал.

Я включил telnet на устройствах и использовал следующие команды и команды стиля telnet сценария NCAT to psudo.

Это позволило мне выполнить команду копирования для TFTP и заставить переключатели отправлять данные обратно мне, а не пытаться проанализировать их из возвращенного вывода. Конечно, я не хотел жестко кодировать пароли и т. Д. И делать его многоразовым для будущих нужд. Это помогло мне справиться с проблемами, которые у меня были. :-)

Switches.txt был просто списком IP-адресов, и мне пришлось использовать NCAT 7.40 в качестве прошлых версий, в которых есть ошибка, которая не позволяла ему работать должным образом.

@ECHO OFF
IF !%1!==!! GOTO no
IF !%2!==!! GOTO no
FOR /F "delims=" %%s IN (switches.txt) DO (
    ECHO admin> CMDS
    ECHO %2>> CMDS
    ECHO(>>CMDS
    ECHO(>> CMDS
    ECHO copy command 'show mac-address' tftp %1 %%s.txt>> CMDS
    ECHO exit>> CMDS
NCAT -t --send-only %%s 23 < CMDS
)
DEL CMDS 1>nul 2>nul
GOTO ext
:no
ECHO ^</NO!^>
:ext

Конечно, это не так безопасно, как метод SSH, на самом деле, если вы не знаете, что трафик не перехватывается, я не предлагаю этого, поскольку он легко анализируется (включая учетные данные), но он был очень функциональным. Это может быть в некотором роде уменьшается за счет выделенной VLAN и отдельной подсети, выделенной только для автоматизации. Думал, что это может помочь другим автоматизировать такие утомительные задачи. Если ничто другое я не проиллюстрирую, где есть желание и системный администратор, есть решение, даже если оно грязное. Надеюсь, это поможет кому-то другому.