Как сохранить вывод консоли для каждого шага цикла while в одном текстовом файле, используя Ruby $ stdout? - PullRequest
0 голосов
/ 03 февраля 2012

Привет, я хочу сохранить всю консоль, сгенерированную всеми шагами цикла while. Я могу сохранить вывод консоли в одном текстовом файле для первого шага цикла while, но после этого мой цикл прерывается. Фрагмент кода ниже:

while line = f.gets do
    puts "value: #{line}"
    newuri = a.to_s.gsub('fuzz',"#{line}")
    print "Attack Request:\n\n#{newuri}\n"
    nuri = URI.parse("#{newuri}")
    Net::HTTP.start(nuri.host, nuri.port) do |http|
    request = Net::HTTP::Get.new nuri.request_uri
    response = http.request request 
    puts "Response"
    puts response.body
            $stdout = File.new('out.txt','w')
    end
end

1 Ответ

1 голос
/ 03 февраля 2012

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

Почему вы пытаетесь переопределить $stdout? Может быть, все, что вам нужно, это puts текст напрямую в файл "out.txt"?

Попробуйте это: (я удалил все "неважные" детали)

File.open('out.txt','w') do |outfile|
  while line = f.gets do
    puts         "value: #{line}" # This is a "debug" info
    outfile.puts "value: #{line}" # This goes to the output file
    # ...
    Net::HTTP.start(nuri.host, nuri.port) do |http|
      request = Net::HTTP::Get.new nuri.request_uri
      response = http.request request 
      outfile.puts "Response"
      outfile.puts response.body
    end
  end
end

Так что, если я правильно понял вашу проблему, вам обычно не нужно «переопределять» стандартный вывод, но вам просто нужно поместить данные в правильный файл. Метод puts существует и для открытых файлов, и просто «по умолчанию» записывает в стандартный вывод.

Кроме того, я предлагаю использовать стандартную ошибку вместо стандартного вывода, если вы хотите отладочную информацию (не в этом фрагменте кода - просто в некоторых других ситуациях, где это может быть полезно) :

$stderr.puts "Some warning"

или

STDERR.puts "Some warning"

.., какой бы ни выглядел лучше для вас. И переменная, и константа содержат один и тот же объект.

...