Вы здесь

Python. 1.2 Создание базовых скриптов

Если говорить в целом, то скрипт - это обычный файл. В этом файле хранится последовательность команд, которые необходимо выполнить.
Начнем с базового скрипта. Выведем на стандартный поток вывода несколько строк.

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 перед вызовом файла, нужно:

  • сделать файл исполняемым (для Linux)
  • в первой строке файла должна находиться строка #!/usr/bin/env python или #!/usr/bin/env python3, в зависимости от того, какая версия 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

Передача аргументов скрипту (argv)

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

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

Модуль 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 - это список
  • все аргументы находятся в списке в виде строк
  • argv содержит не только аргументы, которые передали скрипту, но и название самого скрипта

В данном случае в списке 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

Задания

  1. В задании создан словарь, с информацией о разных устройствах.

    Необходимо запросить у пользователя ввод имени устройства (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])

  2. Задание 5.1a
    Переделать скрипт из задания 5.1 таким образом, чтобы, кроме имени устройства, запрашивался также параметр устройства, который нужно отобразить.

    Вывести информацию о соответствующем параметре, указанного устройства.

    Пример выполнения скрипта:

    $ 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])
  3. Задание 5.1b
    Переделать скрипт из задания 5.1a таким образом, чтобы, при запросе параметра, отображался список возможных параметров. Список параметров надо получить из словаря, а не прописывать вручную.

    Вывести информацию о соответствующем параметре, указанного устройства.

    Пример выполнения скрипта:

    $ 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])
  4. Задание 5.1c
    Переделать скрипт из задания 5.1b таким образом, чтобы, при запросе параметра, которого нет в словаре устройства, отображалось сообщение „Такого параметра нет“. Задание относится только к параметрам устройств, не к самим устройствам.
    Решение
    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,'Такого параметра нет'))
  5. Задание 5.1d
    Переделать скрипт из задания 5.1c таким образом, чтобы, при запросе параметра, пользователь мог вводить название параметра в любом регистре.

    Пример выполнения скрипта:

    $ 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,'Такого параметра нет'))
  6. Задание 5.2
    Запросить у пользователя ввод IP-сети в формате: 10.1.1.0/24
    Затем вывести информацию о сети и маске в таком формате:
    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

  7. Задание 5.2a
    Всё, как в задании 5.2, но, если пользователь ввел адрес хоста, а не адрес сети, надо преобразовать адрес хоста в адрес сети и вывести адрес сети и маску, как в задании 5.2.
    Пример адреса сети (все биты хостовой части равны нулю):
    10.0.1.0/24
    190.1.0.0/16

    Пример адреса хоста:
    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

  8. Задание 5.3
    Скрипт должен запрашивать у пользователя:

    - информацию о режиме интерфейса (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

  9. Задание 5.3a
    Дополнить скрипт из задания 5.3 таким образом, чтобы, в зависимости от выбранного режима, задавались разные вопросы в запросе о номере VLANа или списка VLANов:

    для access: «Введите номер VLAN:»
    для trunk: «Введите разрешенные VLANы:»
    Ограничение: Все задания надо выполнять используя только пройденные темы. То есть эту задачу можно решить без использования условия if и циклов for/while.

    Решение
    task_5_3a.py

Добавить комментарий

Filtered HTML

  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Допустимые HTML-теги: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Строки и абзацы переносятся автоматически.

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и абзацы переносятся автоматически.
CAPTCHA
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.
Target Image