Если говорить в целом, то скрипт - это обычный файл. В этом файле хранится последовательность команд, которые необходимо выполнить.
Начнем с базового скрипта. Выведем на стандартный поток вывода несколько строк.
access_template = ['switchport mode access', 'switchport access vlan {}', 'switchport nonegotiate', 'spanning-tree portfast', 'spanning-tree bpduguard enable'] print('\n'.join(access_template).format(5))
Сначала элементы списка объединяются в строку, которая разделена символом \n, а в строку подставляется номер VLAN, используя форматирование строк.
После этого надо сохранить файл и перейти в командную строку.
Так выглядит выполнение скрипта:
C:\python_learn\Python. 1.2 Создание базовых скриптов>python 1.pi switchport mode access switchport access vlan 5 switchport nonegotiate spanning-tree portfast spanning-tree bpduguard enable
Ставить расширение .py у файла не обязательно, но, если вы используете Windows, то это желательно делать, так как Windows использует расширение файла для определения того, как обрабатывать файл.
Для того, чтобы файл был исполняемым, и не нужно было каждый раз писать python перед вызовом файла, нужно:
Пример файла access_template_exec.py:
#!/usr/bin/env python3 access_template = ['switchport mode access', 'switchport access vlan {}', 'switchport nonegotiate', 'spanning-tree portfast', 'spanning-tree bpduguard enable'] print('\n'.join(access_template).format(5))
После этого:
chmod +x access_template_exec.py
Теперь можно вызывать файл таким образом:
./access_template_exec.py
Очень часто скрипт решает какую-то общую задачу. Например, скрипт обрабатывает как-то файл конфигурации. Конечно, в таком случае не хочется каждый раз руками в скрипте править название файла.
Гораздо лучше будет передавать имя файла как аргумент скрипта и затем использовать уже указанный файл.
Модуль sys позволяет работать с аргументами скрипта с помощью argv.
Пример access_template_argv.py:
from sys import argv interface = argv[1] vlan = argv[2] access_template = ['switchport mode access', 'switchport access vlan {}', 'switchport nonegotiate', 'spanning-tree portfast', 'spanning-tree bpduguard enable'] print('interface {}'.format(interface)) print('\n'.join(access_template).format(vlan))
Проверка работы скрипта:
$ python access_template_argv.py Gi0/7 4 interface Gi0/7 switchport mode access switchport access vlan 4 switchport nonegotiate spanning-tree portfast spanning-tree bpduguard enable
Аргументы, которые были переданы скрипту, подставляются как значения в шаблон.
Тут надо пояснить несколько моментов:
В данном случае в списке argv находятся такие элементы:
['access_template_argv.py', 'Gi0/7', '4']
Иногда необходимо получить информацию от пользователя, например, запросить пароль.
Для получения информации от пользователя используется функция input:
In [1]: print(input('Твой любимый протокол маршрутизации? ')) Твой любимый протокол маршрутизации? OSPF OSPF
В данном случае информация тут же выводится пользователю, но кроме этого, информация, которую ввел пользователь, может быть сохранена в какую-то переменную и может использоваться далее в скрипте.
In [2]: protocol = input('Твой любимый протокол маршрутизации? ') Твой любимый протокол маршрутизации? OSPF In [3]: print(protocol) OSPF
В скобках обычно пишется какой-то вопрос, который уточняет, какую информацию нужно ввести.
Запрос информации из скрипта (файл access_template_input.py):
interface = input('Enter interface type and number: ') vlan = input('Enter VLAN number: ') access_template = ['switchport mode access', 'switchport access vlan {}', 'switchport nonegotiate', 'spanning-tree portfast', 'spanning-tree bpduguard enable'] print('\n' + '-' * 30) print('interface {}'.format(interface)) print('\n'.join(access_template).format(vlan))
В первых двух строках запрашивается информация у пользователя.
Строка print('\n' + '-' * 30) используется для того, чтобы визуально отделить запрос информации от вывода.
Выполнение скрипта:
$ python access_template_input.py Enter interface type and number: Gi0/3 Enter VLAN number: 55 ------------------------------ interface Gi0/3 switchport mode access switchport access vlan 55 switchport nonegotiate spanning-tree portfast spanning-tree bpduguard enable
Необходимо запросить у пользователя ввод имени устройства (r1, r2 или sw1). И вывести информацию о соответствующем устройстве на стандартный поток вывода (информация будет в виде словаря).
Пример выполнения скрипта:
$ python task_5_1.py Введите имя устройства: r1 {'location': '21 New Globe Walk', 'vendor': 'Cisco', 'model': '4451', 'ios': '15.4', 'ip': '10.255.0.1'}
Ограничение: нельзя изменять словарь london_co.
Все задания надо выполнять используя только пройденные темы. То есть эту задачу можно решить без использования условия if.
london_co = { "r1": { "location": "21 New Globe Walk", "vendor": "Cisco", "model": "4451", "ios": "15.4", "ip": "10.255.0.1" }, "r2": { "location": "21 New Globe Walk", "vendor": "Cisco", "model": "4451", "ios": "15.4", "ip": "10.255.0.2" }, "sw1": { "location": "21 New Globe Walk", "vendor": "Cisco", "model": "3850", "ios": "3.6.XE", "ip": "10.255.0.101", "vlans": "10,20,30", "routing": True } }
Решение
london_co = { "r1": { "location": "21 New Globe Walk", "vendor": "Cisco", "model": "4451", "ios": "15.4", "ip": "10.255.0.1" }, "r2": { "location": "21 New Globe Walk", "vendor": "Cisco", "model": "4451", "ios": "15.4", "ip": "10.255.0.2" }, "sw1": { "location": "21 New Globe Walk", "vendor": "Cisco", "model": "3850", "ios": "3.6.XE", "ip": "10.255.0.101", "vlans": "10,20,30", "routing": True } } device = input('Введите имя устройства: ') print(london_co[device])
Вывести информацию о соответствующем параметре, указанного устройства.
Пример выполнения скрипта:
$ python task_5_1a.py Введите имя устройства: r1 Введите имя параметра: ios 15.4
Решение
london_co = { "r1": { "location": "21 New Globe Walk", "vendor": "Cisco", "model": "4451", "ios": "15.4", "ip": "10.255.0.1" }, "r2": { "location": "21 New Globe Walk", "vendor": "Cisco", "model": "4451", "ios": "15.4", "ip": "10.255.0.2" }, "sw1": { "location": "21 New Globe Walk", "vendor": "Cisco", "model": "3850", "ios": "3.6.XE", "ip": "10.255.0.101", "vlans": "10,20,30", "routing": True } } device = input('Введите имя устройства: ') parameter = input('Введите имя параметра: ') print(london_co[device][parameter])
Вывести информацию о соответствующем параметре, указанного устройства.
Пример выполнения скрипта:
$ python task_5_1b.py Введите имя устройства: r1 Введите имя параметра (location, vendor, model, ios, ip): ip 10.255.0.1 $ python task_5_1b.py Введите имя устройства: sw1 Введите имя параметра (location, vendor, model, ios, ip, vlans, routing): ip 10.255.0.101
Решение
В решении приведено три варианта вывода переменной в input: без форматрирования, с format, с f-строкой
london_co = { "r1": { "location": "21 New Globe Walk", "vendor": "Cisco", "model": "4451", "ios": "15.4", "ip": "10.255.0.1" }, "r2": { "location": "21 New Globe Walk", "vendor": "Cisco", "model": "4451", "ios": "15.4", "ip": "10.255.0.2" }, "sw1": { "location": "21 New Globe Walk", "vendor": "Cisco", "model": "3850", "ios": "3.6.XE", "ip": "10.255.0.101", "vlans": "10,20,30", "routing": True } } device = input('Введите имя устройства: ') parameters = (','.join(london_co[device].keys())) #parameter = input('Введите имя параметра (' + parameters + '): ') #parameter = input('Введите имя параметра({parameters}):'.format(parameters=parameters)) parameter = input(f'Введите имя параметра({parameters}):') print(london_co[device][parameter])
london_co = { "r1": { "location": "21 New Globe Walk", "vendor": "Cisco", "model": "4451", "ios": "15.4", "ip": "10.255.0.1" }, "r2": { "location": "21 New Globe Walk", "vendor": "Cisco", "model": "4451", "ios": "15.4", "ip": "10.255.0.2" }, "sw1": { "location": "21 New Globe Walk", "vendor": "Cisco", "model": "3850", "ios": "3.6.XE", "ip": "10.255.0.101", "vlans": "10,20,30", "routing": True } } device = input('Введите имя устройства: ') parameters = (','.join(london_co[device].keys())) #parameter = input('Введите имя параметра (' + parameters + '): ') #parameter = input('Введите имя параметра({parameters}):'.format(parameters=parameters)) parameter = input(f'Введите имя параметра({parameters}):') print(london_co[device].get(parameter,'Такого параметра нет'))
Пример выполнения скрипта:
$ python task_5_1d.py Введите имя устройства: r1 Введите имя параметра (ios, model, vendor, location, ip): IOS 15.4
Решение
london_co = { "r1": { "location": "21 New Globe Walk", "vendor": "Cisco", "model": "4451", "ios": "15.4", "ip": "10.255.0.1" }, "r2": { "location": "21 New Globe Walk", "vendor": "Cisco", "model": "4451", "ios": "15.4", "ip": "10.255.0.2" }, "sw1": { "location": "21 New Globe Walk", "vendor": "Cisco", "model": "3850", "ios": "3.6.XE", "ip": "10.255.0.101", "vlans": "10,20,30", "routing": True } } device = input('Введите имя устройства: ') parameters = (','.join(london_co[device].keys())) #parameter = input('Введите имя параметра (' + parameters + '): ') #parameter = input('Введите имя параметра({parameters}):'.format(parameters=parameters)) parameter = input(f'Введите имя параметра({parameters}):') parameter = parameter.lower() print(london_co[device].get(parameter,'Такого параметра нет'))
Network: 10 1 1 0 00001010 00000001 00000001 00000000 Mask: /24 255 255 255 0 11111111 11111111 11111111 00000000
Проверить работу скрипта на разных комбинациях сеть/маска.
Подсказка: Получить маску в двоичном формате можно так:
In [1]: "1" * 28 + "0" * 4 Out[1]: "11111111111111111111111111110000"
Решение
task_5_2.py
Пример адреса хоста:
10.0.1.1/24 - хост из сети 10.0.1.0/24
10.0.5.195/28 - хост из сети 10.0.5.192/28
Если пользователь ввел адрес 10.0.1.1/24, вывод должен быть таким:
Network: 10 0 1 0 00001010 00000000 00000001 00000000 Mask: /24 255 255 255 0 11111111 11111111 11111111 00000000
Проверить работу скрипта на разных комбинациях хост/маска, например: 10.0.5.195/28, 10.0.1.1/24
Подсказка:
Есть адрес хоста в двоичном формате и маска сети 28. Адрес сети это первые 28 бит адреса хоста + 4 ноля. То есть, например, адрес хоста 10.1.1.195/28 в двоичном формате будет bin_ip = "00001010000000010000000111000011".
А адрес сети будет первых 28 символов из bin_ip + 0000 (4 потому что всего в адресе может быть 32 бита, а 32 - 28 = 4): 00001010000000010000000111000000
Решение
task_5_2a.py
- информацию о режиме интерфейса (access/trunk)
- номер интерфейса (тип и номер, вида Gi0/3)
- номер VLANа (для режима trunk будет вводиться список VLANов)
В зависимости от выбранного режима, на стандартный поток вывода, должна возвращаться соответствующая конфигурация access или trunk (шаблоны команд находятся в списках access_template и trunk_template).
При этом, сначала должна идти строка interface и подставлен номер интерфейса, а затем соответствующий шаблон, в который подставлен номер VLANа (или список VLANов).
Ограничение: Все задания надо выполнять используя только пройденные темы. То есть эту задачу можно решить без использования условия if и циклов for/while.
Пример выполнения скрипта, при выборе режима access:
$ python task_5_3.py Введите режим работы интерфейса (access/trunk): access Введите тип и номер интерфейса: Fa0/6 Введите номер влан(ов): 3 interface Fa0/6 switchport mode access switchport access vlan 3 switchport nonegotiate spanning-tree portfast spanning-tree bpduguard enable
Пример выполнения скрипта, при выборе режима trunk:
$ python task_5_3.py Введите режим работы интерфейса (access/trunk): trunk Введите тип и номер интерфейса: Fa0/7 Введите номер влан(ов): 2,3,4,5 interface Fa0/7 switchport trunk encapsulation dot1q switchport mode trunk switchport trunk allowed vlan 2,3,4,5
access_template = [ "switchport mode access", "switchport access vlan {}", "switchport nonegotiate", "spanning-tree portfast", "spanning-tree bpduguard enable" ] trunk_template = [ "switchport trunk encapsulation dot1q", "switchport mode trunk", "switchport trunk allowed vlan {}" ]
Решение
task_5_3.py
для access: «Введите номер VLAN:»
для trunk: «Введите разрешенные VLANы:»
Ограничение: Все задания надо выполнять используя только пройденные темы. То есть эту задачу можно решить без использования условия if и циклов for/while.
Решение
task_5_3a.py
Добавить комментарий