LINUX.ORG.RU

Ответ на: комментарий от runtime

Запутался еще сильнее). Вот кусок кода:

$ip=«10.0.0.1»

host=Net::Telnet::new(«Host» => $ip, «Timeout» => 3, «Waittime» => 1, «Prompt» => /<*>| *-/)

host.login(username=«admin», password=«admin») {|c| print c}

host.cmd(«display mac-address») {|c| print c} # вывод этой многостраничной команды я хочу сохранить

#host.cmd(" ") {|a| print a} # здесь отправляется много пробелов, чтобы продолжать выводить список мак-адресов (коммутатор ждет от пользователя нажатия клавиши пробел каждый раз, когда заканчивается очередная страница с выводом)

host.close

Я хочу сохранить вывод в переменную для написания цикла - если в выводе есть строка " ----More----", то отсылается один пробел. Пробовал делать result=`host.cmd(«display mac-address») {|c| print c}`, но, похоже, под «external program» понимается то, что выполняется вне скрипта, а не дополнительные модули ruby.

[hasculdr@hasculdr-alt ~]$ ruby /home/hasculdr/Документы/bin/test.rb

Warning: Telnet is not a secure protocol, and it is recommended to use Stelnet.

Login authentication

Username:admin

Password:

Info: The max number of VTY users is 5, and the number of current VTY users on line is 1.

<ARM-SemenVictor-blk>sh: -c: line 0: syntax error near unexpected token `«display mac-address»'

sh: -c: line 0: `host.cmd(«display mac-address») {|c| print c}'

hasculdr
() автор топика
Ответ на: комментарий от hasculdr

result=`host.cmd(«display mac-address») {|c| print c}`,

нет, так работать не будет.

я бы попробовал глянуть настройки telnet/term, чтобы он отдавал все строчки подряд.

kelyar ★★★★★
()
Последнее исправление: kelyar (всего исправлений: 3)
Ответ на: комментарий от kelyar

Не получается:

<ARM-SemenVictor-blk>sh: -c: line 0: syntax error near unexpected token `«display'

sh: -c: line 0: `host.cmd(«display mac-address»)'

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

hasculdr
() автор топика
Ответ на: комментарий от hasculdr

backticks тебе тут не помогут - они нужны, чтобы выполнить строчку в шеллe. а у тебя там вызов ruby-метода cmd обьекта host.

kelyar ★★★★★
()
Ответ на: комментарий от hasculdr

можно или в цикле делать примерно так:

dump = ""
host.cmd(«display mac-address») {|c| dump << c }
while ... do
  host.cmd(" ") {|a| dump << a} 
end

или попробовать передать телнету LINES=1000000000000 TERM=dumb

kelyar ★★★★★
()
Ответ на: комментарий от kelyar

Спасибо огромное. 2 дня искал вашу конструкцию «dump << c». При таком перенаправлении остальные команды тоже обязательно отправлять в переменную, так?

Что значит «передать телнету»? Ключ к команде в шелле, изменение модуля/его параметров?

hasculdr
() автор топика
Ответ на: комментарий от anonymous

А что мешает сделать так:

Спасибо, попробую. По ruby у меня только дважды пройденный курс codeacademy, опыта ноль. Я просто не знаю 90% возможностей).

hasculdr
() автор топика

Попал в бесконечный цикл:

while dump.scan(/ *-/) do # выполнять тогда, когда есть символы " ----More----"

host.cmd(" ") {|a| dump=a; print a} # отсылаем пробел

if dump.scan(/<*>/) # если находятся символы «<приглашение_командной_строки>»

puts(«Конец.») {|a| dump=a; print a} # сделать что-нибудь другое, не отправлять пробел

end

end

Но цикл не прекращается - продолжают отправляться «концы» и пробелы. Как мне выйти из цикла, если строчка с условием всегда будет в переменной, т.к. она туда сохранятся при каждом выводе, и ruby будет всегда находить несколько штук внутри переменной? Думал об удалении строки " ----More----" раз за разом (т.е. нашлась строка - удаляем ее и посылаем пробел), но человек, продолжительное время пишущий на питоне, сказал, что изменять данные, обработка которых еще не закончена - огромная ошибка. Как можно поступить в такой ситуации?

hasculdr
() автор топика
Ответ на: комментарий от hasculdr
 while dump.scan(/ *-/) do

 host.cmd(" ") {|a| dump=a; print a}

     break if dump.scan(/<*>/)

   end

Почему-то пробел отправляется только один раз, дальше программа завершается без ошибок (program exited with code: 0).

 until dump.scan(/<*>/) do host.cmd(" ") {|a| dump=a; puts a}

end

Не отправляется ни одного пробела, программа завершается без ошибок.

hasculdr
() автор топика
Ответ на: комментарий от anonymous

А что мешает сделать так:

ничего не мешает, это практически одно и то же.

kelyar ★★★★★
()
Ответ на: комментарий от hasculdr

как мне выйти из цикла, если строчка с условием всегда будет в переменной

так ищи в другой переменной - не в dump, а в a.

kelyar ★★★★★
()
14 июля 2015 г.
Ответ на: комментарий от kelyar

Наконец вернулся с сессии и можно продолжать заниматься делом. dump - заранее объявлена и равна «пустоте» (dump=""). А переменная a - это «заполнитель» (так я называю конструкцию вида |a|).

while dump.scan(/More/) do host.cmd(" ") {|a| dump=a; puts a}
end
В «заполнителе» можно искать?

hasculdr
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.