LINUX.ORG.RU

Скрипт на Bash

 


0

1

Всем привет. Пробую освоить Bash, но в основном приходится делать на живых примерах (подстраиваю под свои нужды :) )

Итак, есть простенький скрипт на заход по Telnet на коммутаторы из отдельного списка ip. В нем до сих пор просто давались однотипные команды. Лог писался. Но вот следующий уровень: нужно сначала данные запросить у текущего коммутатора, а потом из них сделать выборку нужной информации и вставить в команду, которую сразу же этому коммутатору дать.

Например:

config traffic_segmentation 1-24 forward_list 25-28
config traffic_segmentation 25-28 forward_list 1-28

Тут все просто. Дал команду Send и вперед на все коммутаторы по очереди.У всех все одинаково.

А вот тут:

config igmp_snooping multicast_vlan 817 add source_port 25-28
тут заранее я не знаю номер vlan. В данном случае он 817б но может быть любым.

Узнать его я могу по команде например такой:

show igmp_snooping multicast_vlan
Коммутатор выдаст:
Command: show igmp_snooping multicast_vlan

Multicast VLAN Global State : Enabled

VLAN Name              : 804
VID                    : 804
Untagged Member Ports  : 1-24
Tagged Member Ports    : 
Source Ports           : 25-28
Untagged Source Ports  : 
Status                 : Enabled
Replace Source IP      : None
И отсюда нужно забрать мой номер: 804, а после этого видимо присвоить его переменной например «А» и вставить в команду:
config igmp_snooping multicast_vlan А add source_port 25-28
А вот как эту выборку сделать, присвоить переменной и вставить-это вопрос на который я не знаю ответа. Может есть пример готовый или варианты по моей задаче-буду признателен.

Заранее спасибо за любую помощь.

P.S. Пример скриптика, которым иногда пользуемся для элементарных задач:

#!/usr/bin/expect -f
spawn telnet [lindex $argv 0]
expect "sername:"
send "xxxxxxx\r"        -тут логин
send "xxxxxxx\r"        -тут пароль
send "config lldp ports 25-28 notification enable\r"
send "config lldp ports 25-28 admin_status tx_and_rx\r"
send "config lldp ports 25-28 basic_tlvs port_description system_name system_description enable\r"
send "system_capabilities enable\r"
send "config lldp forward_message enable\r"
send "config lldp ports 25-28 notification enable\r"
send "config lldp ports 25-28 basic_tlvs all enable\r"
send "enable lldp\r"
send "save\r"
expect eof



Последнее исправление: shell-script (всего исправлений: 2)
VID=$(show igmp_snooping multicast_vlan | grep VID | awk '{print $3}')

Почитай www.linux.org.ru/help/lorcode.md

А то из-за того, что твоё сообщение не было отформатировано, я не увидел, что скрипт-то у тебя не на баше. Мой пример как раз для bash'а.

shell-script ★★★★★
()
Последнее исправление: shell-script (всего исправлений: 1)
Ответ на: комментарий от dexpl

Я же shell-script, а не awk-script. :)

Но, согласен, твой вариант аккуратнее.

shell-script ★★★★★
()

А вы точно man на expect читали? Там же есть и извлечение из буфера по regex и установка этого в переменную.

vodz ★★★★★
()

config igmp_snooping multicast_vlan 817 add source_port 25-28

->

VLAN Name : 804

ASSA=`config igmp_snooping multicast_vlan 817 add source_port 25-28 | grep «VLAN Name» | cut -d":" -f2 | cut -d" " -f2`

config igmp_snooping multicast_vlan $АSSA add source_port 25-28

slamd64 ★★★★★
()
Ответ на: комментарий от slamd64

Откуда вы такие берётесь? config - это встроенная команда shell-а на коммутаторе и он VAR=`config | grep` не умеет.

vodz ★★★★★
()
Ответ на: комментарий от stave

Ну тут стоит сделать замечание, что все зависит от коммутатора.

Не, правильно мне было лень расписывать ибо взбесило. Надо было дописать: «в общем виде не обязан уметь». Один awk предлагает, другой cut... Некий grep даже у cisco есть, и rlogin есть, чтобы не логиниться каждой командой. Но результирующий скрипт всё равно будет не такой, что тут наспамили.

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 2)

Подобные вещи надо делать не на баше, а на нормальном языке типа perl, python. Там с вопросами получить, распарсить, вставить проблем нет и возможности по работе с сетью неограничены

ism ★★★
()
Последнее исправление: ism (всего исправлений: 2)
Ответ на: комментарий от ism

Подобные вещи надо делать не на баше

О, ещё один... Замечательный топик, хороший список можно составить, кто ничерта не понимает и можно смело банить.

vodz ★★★★★
()
Ответ на: комментарий от ism

А что, разве не так ?

ТС применил по обрывочным или медвежьим советам адекватнейшее средство для решения своей задачи. То что он думает о bash-е, так это простительно, но об этом ещё в первом комментарии было сутки назад доложено и сегодня уже пару раз отправляли ТС-а читать документацию. Там не сложно и решение есть прямо в примерах. А вы отправляете учить человека perl. Ну и как это расценивать, кроме как совершенно дурацкий комментарий?

vodz ★★★★★
()
Ответ на: комментарий от vodz

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

ism ★★★
()
Ответ на: комментарий от ism

Этот комментарий результат большого количества наступания на грабли.

Оно и видно. Вы и многие тут настолько неосилили, что так до сих пор и не поняли, что bash-а у ТСа нет вовсе, у него bash — нечто нарицательное «про скрипты», с таким же успехом он может и perl bash-ем назвать.

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

Базовый?! perl и родился позже и сдохнет раньше. Тривиальное доказательство по теме топика — некий урезанный shell вполне может присуствовать в коммутаторах, а вот perl...

vodz ★★★★★
()
Ответ на: комментарий от vodz

Так все таки, как решить мою задачу. Я конечно почти ноль в этом вопросе, но делать надо. Нужно решить вопрос,а параллельно я буду разбираться как это работает. Подход не очень правильный, но просто время поджимает.:(

polkovnikiv
() автор топика
Ответ на: комментарий от polkovnikiv

Так все таки, как решить мою задачу.

Так ведь вам дружно сказали — прочитать документацию на expect. У программы expect есть команда expect, которая с ключиком -re найдёт нужную вам подстроку, а set expect_out(номер, string) можно будет извлечь нужную подстроку из найденного.

vodz ★★★★★
()
Ответ на: комментарий от polkovnikiv

За 7 дней не осилить man expect, и ни на йоту не улучшить понимание предмета? Это тебе в /job

Deleted
()
Ответ на: комментарий от polkovnikiv

А можно конкретное решение моего вопроса?

Вам правильно ответили, за совсем конкретным - в job. А тут демонстрируйте, что вы вообще документацию открывали, попробуйте вышеуказанную подсказку насчет expext -re и set expect_out, а потом может кто и в том числе я поможет решить то, что не получается. Понимаете? «Не получается», а не «сделайте за меня».

vodz ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.