Как передать структуру данных Tcl в Perl с промежуточным Telnet? - PullRequest
2 голосов
/ 16 апреля 2011

Я хочу подключиться к маршрутизатору Cisco, войти в систему и выполнить сценарий Tcl, который локально хранится во флэш-памяти маршрутизатора.Этот сценарий Tcl выполняет некоторую обработку и должен возвращать вложенный хеш (предпочтительно) или строку, представляющую документ XML.

Есть ли способ сопоставить вложенный хеш Tcl с вложенным хешем Perl или вернуть строку, представляющую документ XML?Позволяет ли Expect мне делать что-либо из перечисленного и как?

Ответы [ 3 ]

2 голосов
/ 16 апреля 2011

Сериализация данных в общий формат обмена, например, строка JSON.

Иметь программу Tcl emit JSON . Загрузите JSON из Perl в хеш.

1 голос
/ 18 апреля 2011

Маршрутизаторы Cisco, как правило, используют старые версии Tcl и не имеют большого количества доступных пакетов расширений. Это означает, что вы довольно ограничены в том, что вы можете сделать. К счастью, для создания данных, которые могут быть собраны и проанализированы Perl, на самом деле это довольно просто.

Давайте использовать JSON в качестве формата обмена. (Возможны и другие.) Ответ Даксима говорит вам, как анализировать JSON, но это довольно просто, потому что вы работаете в контексте, которым можете управлять. Как сгенерировать данные JSON в этом старомодном Tcl? Самый простой способ - с помощью команды subst - она ​​долгое время не изменялась в Tcl, поэтому вы определенно ее получили - и несколько вспомогательных команд. Вот схема:

proc getFoo {} {
    # Some regular Tcl code to get the value
}
proc getFruit {variety} {
    # Some regular Tcl code to get the value
}
set someIntValue [expr { 1 + 2 * 3 }]    ;#  Or whatever...
set jsonTemplate {
    {
        "foo": [getFoo],
        "bar": {
            "pears":  "[getFruit pears]",
            "apples": "[getFruit apples]"
        },
        "grill": $someIntValue
    }
}
puts [subst $jsonTemplate]

ОК, будьте осторожны: я понятия не имею, какие данные вы хотите получить («вложенные хэши» не очень полезны). Вы должны будете добавить цитату / обратную косую черту, где это необходимо. Поместите процедуры перед вызовом subst (порядок вещей имеет значение в Tcl).

0 голосов
/ 19 апреля 2011

Этот ожидаемый скрипт должен взять файл с маршрутизатора и оставить его в /tmp/xferfile.txt. Его нужно будет изменить с помощью команд, которые на самом деле создают файл, поскольку у меня их нет, я оставил для них заполнители в скрипте. Вы должны быть в состоянии использовать код Донала для этого.

Прошло много времени с тех пор, как я играл с ожидаемым и cisco IOS, так что потерпите меня, если для этого потребуется некоторая отладка с вашей стороны.

#!/usr/bin/expect
set timeout 20
set ip [lindex $argv 0]
set user [lindex $argv 1]
set password [lindex $argv 2]
set prompt1 "Router>"
set prompt2 "Router#"
set prompt3 "bash\$"
set ctrld [expr ("d" & 01xF)]

spawn ssh "$user\@$ip"
expect "Password:"
send "$password\r";

# switch to privileged EXEC level 
expect $prompt1 { send "enable" }

# ==================================================
# Modify this line for your needs
# ==================================================
expect $prompt2 { send "command to print Tcl hash" }

# Capture output to variable
set results $expect_out(buffer)

# leave EXEC level
expect $prompt2 { send "exit" }
# Command to log out of router
expect $prompt1 { send "exit" }

# Create text file on localhost
spawn "#!/bin/bash"
expect prompt3 { 
    send "cat > /tmp/xferfile.txt"
    sleep 5
    send $results
    send $crtld
    }

expect prompt3 { send "exit" }
...