[ожидаем, что скрипт анализирует вывод команды] - PullRequest
0 голосов
/ 16 марта 2019

Сводка

Ожидаемый сценарий + ssh => Брандмауэр контрольной точки

Необходимо проанализировать выходные данные команды при использовании ожидаемого сценария.

Цель состоит в том, чтобы извлечьIP-адрес (subnet4 :) и имя (name :) для каждого сетевого объекта.Затем сравните извлеченный IP-адрес с введенным адресом и, если они равны, используйте переменную $ name (после сопоставления ее с соответствующим IP-адресом) в качестве службы при создании правила доступа на брандмауэре.

Command_Output_To_Be_Parsed

objects:
 - uid: "67c51c9a-81e3-43ee-ba96-b733c7672d83"
 name: "CP_default_Office_Mode_addresses_pool"
 type: "network"
 domain:
   uid: "41e821a0-3720-11e3-aa6e-0800200c9fde"
   name: "SMC User"
   domain-type: "domain"
 subnet4: "172.16.10.0"
 mask-length4: 24
 subnet-mask: "255.255.255.0"
 - uid: "caee1116-8087-4310-9208-b422d3628a7e"
 name: "IPv6_Link_Local_Hosts"
 type: "network"
 domain:
   uid: "a0bbbc99-adef-4ef8-bb6d-defdefdefdef"
   name: "Check Point Data"
   domain-type: "data domain"
 subnet6: "fe80::"
 mask-length6: 64
 from: 1
 to: 2
 total: 2

Что я пробовал до сих пор

1) Не удалось получить единственное имя в переменной $ name

2) Сделалне понял, как связать IP-адрес с именем

send      "mgmt add network name DuplicateTst subnet $srcIPAddr mask-length   32\r"
expect {
-re "same" {
       expect ">"
       send   "set clienv rows 0\r"
       expect ">"
       send   "mgmt show networks\r"
       expect {
         -re "objects(.*)>" {
            set Outcome  $expect_out(1,string)
            puts "The whole array $Outcome"
            #exit 100
              }
           }
       #timeout { puts "timeout"}
 }
}

set lines [split $Outcome "\n"]
foreach line $lines {
    #puts "line: $line"
    set notCleanIP [regexp -inline -lineanchor -all -- {(?:)(\s+)\"(?!255) \d+\.\d+\.\d+\.\d+\"} $line];
    set notCleanName [regexp -inline -lineanchor -all -- {(?:)(\s+)name:  \"[a-z A-Z 0-9]+\"} $line ];
    set cleanName [regexp -inline -lineanchor -all -- {(?:)[a-z A-Z 0-9]+} $notCleanName ]
    set cleanIP [regexp -inline -lineanchor -all -- {(?:)\d+\.\d+\.\d+\.\d+} $notCleanIP ];
    puts "CleanIP   >>> $cleanIP"
    puts "CleanName >>> $cleanName"
    if { $cleanIP == $srcIPAddr } {
           #puts "equivalent *************************"
           #set cleanName [regexp -inline -lineanchor -all -- {(?:)[a-z A-Z 0-9]+} $notCleanName ];
           #puts "################# clean name >> $cleanName"

   }
    #set newVariable2 [regexp -inline -lineanchor -all -- {(?:)(\s+)\"[a-z A-Z 0-9]+\"} $line];
    puts "NotCleanIP   >>> $notCleanIP"
    puts "NotCleanName >>> $notCleanName"
}

exit 100

Результат

{  name} { } AddressSrc8b3c855163437d0be28cc8995864 { } {  }

что не то, что я ожидал.Только ожидалось: AddressSrc8b3c855163437d0be28cc8995864

CleanIP >>> 100.5.5.5 IP-адрес правильно извлечен.

Вопрос

Как решить эту проблему?Любые идеи будут оценены.

Спасибо.

1 Ответ

0 голосов
/ 18 марта 2019

@ Эмили Э. Будет иметь в виду следующее время. Благодарю.

Получил это на работу. Решением было ввести expertMode (root) и использовать jq.

 # for((i=0;i<=2;i++));do VV=$(jq  -cr ".objects[$i].subnet4" jsonOutput)    VVV="100.5.5.5";for nbr in $VV; do if [[ $nbr =~ $VVV ]];then echo "$nbr $(jq -cr ".objects[$i].name" jsonOutput)";fi;done;done
result => 100.5.5.5 SrcAddressObj8b3c855163437d0be28cc8995864

Вышеописанное работает с пользователем, для которого оболочка настроена как "/ bin / bash", а не gaiaCLI.

Для пользователей gaiaCLI:

send   "for((i=0;i<=3;i++));do VV=\$(jq -c -r \".objects\[\$i\].subnet4\"    /tmp/jsonOutput) VVV=\$V;for nbr in \$VV; do if \[\[ \$nbr =~ \$\{VV
V\} \]\];then echo \"\$nbr \$(jq -c -r \".objects\[\$i\].name\"   /tmp/jsonOutput)\";fi;done;done\r"
            #expect "#"
            sleep 15
            expect {
              -re "done(.*)\n" {
                set shutsu $expect_out(1,string)
                puts "$shutsu"
                }
               }
            sleep 15
            expect "#"
            send   "exit\r"
            expect ">"
            set lines [split $shutsu "\n"]
            foreach line $lines {
                    set objectIP   [regexp -inline -lineanchor -all -- {\d+\.\d+\.\d+\.\d+} $line];
                    set objectName [regexp -inline -lineanchor -all -- {(?:)(\s)[a-z A-Z 0-9]+} $line];
                    set objName    [regexp -inline -lineanchor -all -- {(?!\s)[a-zA-Z 0-9]+} $objectName];
                    if { $objectIP == $srcIPAddr } {
                            puts "objectIP: $objectIP and objectName: $objName"
                            set service $objName
                            puts "finally: here is the service to use =>  $service"
...