Считайте файл, который присутствует в зарегистрированной оболочке, в строку и выполните цикл, используя ожидаемый скрипт - PullRequest
0 голосов
/ 29 августа 2018

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

Мой ожидаемый сценарий выглядит следующим образом: 1. войти в оболочку с помощью ssh 2. создать файл там 3. прочитать содержимое созданного файла и отобразить его.

#!/usr/bin/expect

spawn telnet 10.10.10.10
expect "login:*"
send "XXXXXX\r"
expect "Password*"
send "XXXXX\r"
expect "#"
send "ls -lrt > temp\r"
expect "#"
set f [open ./temp]
set entry [split [read $f] "\n"]
close $f
expect "#"
foreach line $entry {
    puts "$line\n"
}
exit

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

Ответы [ 3 ]

0 голосов
/ 29 августа 2018

Вы хотите захватить вывод команды, а не создать временный файл:

set cmd "ls -lrt"
send "$cmd\r"
expect -re "$cmd\r\n(.*)\r\n#$"
set ls_output $expect_out(1,string)
puts $ls_output

Мы отправляем команду, а затем ожидаем совпадения с регулярным выражением:

  • команда, которую мы послали: ls -lrt
  • перевод строки: ожидайте всегда отправляет обратно \r\n для перевода строки.
  • независимо от того, что выводит команда: (.*)
  • перевод строки, ваш символ приглашения # и конец текста

Текст в первом наборе круглых скобок появляется в массиве expect_out с ключом массива 1,string

Если ваша подсказка не совсем хэш-символ без начальных или конечных символов, вам необходимо соответствующим образом изменить это регулярное выражение.

Совет: при разработке ожидаемого сценария включите отладку, чтобы увидеть, что соответствует или не соответствует вашим ожидаемым шаблонам: expect -d script.exp

0 голосов
/ 30 августа 2018

Проблема в том, что файл создается на удаленном хосте, но вы пытаетесь прочитать его локально. Если у вас нет общей файловой системы между ними (очень не по умолчанию; вы бы не задавали этот вопрос, если бы у вас было!), Это не сработает.

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

spawn telnet 10.10.10.10
expect "login:*"
send "XXXXXX\r"
expect "Password*"
send "XXXXX\r"
expect "#"
send "ls -lrt\r"

# Create the accumulator so that won't be surprised if there's no remote output
set entry {}
# This is the multi-clause version of the expect command
expect {
    "#" {
        # Got a prompt; drop out of the expect
    }
    -re {^.*$} {
        # Got some other line; save and wait for the next one
        lappend entry $expect_out(0,string)
        exp_continue; # <<< MAGIC; asks expect to keep waiting
    }
}

foreach line $entry {
    puts "$line\n"
}
exit

Почти все вопросы о том, как автоматизировать что-то немного сложное с Expect, похоже, заканчиваются использованием версии expect с несколькими предложениями и подходящими exp_continue вызовами.

0 голосов
/ 29 августа 2018

ls -lrt > temp работает на удаленном хосте (сервер telnet), но open ./temp работает на локальном хосте (клиент telnet). Вы не можете напрямую открыть файл на удаленном сервере.

...