читать раздел строк из конфигурации Cisco IOS, загруженный как текстовый файл в powershell - PullRequest
0 голосов
/ 02 июня 2018

Я не эксперт в powershell, но ищу написать функцию в powershell для чтения раздела строк из конфигурации Cisco IOS, загруженного в виде текстового файла в powershell.будет несколько разделов с разными именами, каждый раздел имеет родительскую строку с дочерним разделом, как показано ниже в конфигурации.раздел "interface" имеет имена, раздел "object" имеет имена, а раздел "object-group" имеет имена для их фильтрации или поиска.Итак, как написать функцию для получения каждого раздела строк, а затем проанализировать, чтобы получить IP-адреса из этого раздела.

Пример конфигурации IOS:

interface GigabitEthernet0/0
 description XXX
 speed 1000
 duplex full
 nameif XXX
 security-level 100
 ip address 1.1.1.1 255.255.255.0
!
interface GigabitEthernet0/1
 description YYY
 speed 1000
 duplex full
 nameif YYY
 security-level 100
 ip address 2.2.2.2 255.255.255.0
!
...
object network APP_NETWORK
 subnet 10.10.10.1 255.255.255.0
object network WEB_NETWORK
 host 10.10.10.2
object network DB_NETWORK
 range 10.10.10.3 10.10.10.5
...
object-group network APP_GROUP
 network-object host 10.10.20.1
 network-object host 10.10.20.2
 network-object host 10.10.20.3
object-group network WEB_GROUP
 network-object host 10.10.30.1
 network-object host 10.10.30.2
 network-object host 10.10.30.3
...

Например, я попытался выполнить следующее, чтобы прочитать все "родительские разделы сети объектной группы:

$config = Get-Content $runconfig -ErrorAction stop
$config | where { $_.Contains("object-group network") }

Но не удалось получить дочерний раздел вместе с.Как написать функцию, чтобы получить родительский и дочерний раздел как.Example1

Get-Section(object-group network APP_GROUP)

должен возвращать следующее

object-group network APP_GROUP
 network-object host 10.10.20.1
 network-object host 10.10.20.2
 network-object host 10.10.20.3

Example2

Get-Section(nameif XXX) OR Get-Section(interface GigabitEthernet0/0)

должно возвращать что-то подобное

interface GigabitEthernet0/0
 description XXX
 speed 1000
 duplex full
 nameif XXX
 security-level 100
 ip address 1.1.1.1 255.255.255.0
!

Я искал многоблоги, ваша помощь или советы будут действительно оценены!Спасибо!

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Один из способов сделать это - использовать переменную состояния и соответствующее регулярное выражение.Вот пример функции:

function Get-Section {
  param(
    [String[]] $configData,
    [String] $sectionName
  )
  $pattern = '(?:^(!)\s*$)|(?:^[\s]+(.+)$)'
  $inSection = $false
  foreach ( $line in $configData ) {
    # Skip empty lines
    if ( $line -match '^\s*$' ) {
      continue
    }
    if ( $line -eq $sectionName ) {
      $inSection = $true
      continue
    }
    if ( $inSection ) {
      if ( $line -match $pattern ) {
        [Regex]::Matches($line, $pattern) | ForEach-Object {
          if ( $_.Groups[1].Success ) {
            $_.Groups[1].Value
          }
          else {
            $_.Groups[2].Value
          }
        }
      }
      else {
        $inSection = $false
      }
      if ( -not $inSection ) {
        break
      }
    }
  }
}

Если данные вашего примера находятся в текстовом файле (например, config.txt), вы можете извлечь раздел interface GigabitEthernet0/1 следующим образом:

$configData = Get-Content "config.txt"
Get-Section $configData 'interface GigabitEthernet0/1'

Вывод будет:

description YYY
speed 1000
duplex full
nameif YYY
security-level 100
ip address 2.2.2.2 255.255.255.0
!

Функция не выводит имя раздела, потому что вы уже знаете его (вы передали его функции).

0 голосов
/ 02 июня 2018

Если вам известно число строк, следующих за APP_GROUP, которое в данном случае равно 3, вы можете использовать это значение для параметра -Context на Select-String:

$config | Select-String -Pattern '(object-group network APP_GROUP)' -Context 0,3

Что даст:

object-group network APP_GROUP
   network-object host 10.10.20.1
   network-object host 10.10.20.2
   network-object host 10.10.20.3

Редактировать: альтернативное решение регулярных выражений ниже, так как ни одна из строк не является динамической

$section = 'APP_GROUP'
$regex = "(?:object-group\snetwork\s$section\n)(\snetwork-object\shost\s.*\n)+(?=object-group)"

$oneline = Get-Content C:\temp\cisco.txt | Out-String
$oneline -match $regex 
$matches[0]

network-object host 10.10.20.1
network-object host 10.10.20.2
network-object host 10.10.20.3
...