Использование Ruby для создания FTP-сервера
Эй, я новичок в Ruby и пытаюсь учиться, портируя некоторые программы с одного языка на другой. Сейчас я работаю над FTP-фаззером в Ruby, который отражает этот скрипт на Perl:
use Net::FTP;
$target = "192.168.37.128";
$buffer = "A\x20";
$buffer .= "A" x 512;
$ftp = Net::FTP->new($target, Debug => 0, Timeout => 5)
or die "Cannot connect to $host: $@ \n";
$ftp->login("anonymous",'anonymous@nowhere.com')
or die "Couldn't log in: $@\n";
$ftp->list($buffer);
$ftp->quit;
Это мой Ruby-эквивалент:
require 'net/ftp'
buffer = 'A\x20'
buffer = (buffer + ('A'*512))
ftp = Net::FTP.open('127.0.0.1','anonymous','anonymous')
ftp.login
ftp.list(buffer)
ftp.quit
Когда я запускаю программу, я получаю следующую ошибку:
C:/Ruby192/lib/ruby/1.9.1/net/ftp.rb:241:in `readline': end of file reached (EOF
Error)
from C:/Ruby192/lib/ruby/1.9.1/net/ftp.rb:241:in `getline'
from C:/Ruby192/lib/ruby/1.9.1/net/ftp.rb:251:in `getmultiline'
from C:/Ruby192/lib/ruby/1.9.1/net/ftp.rb:265:in `getresp'
from C:/Ruby192/lib/ruby/1.9.1/net/ftp.rb:281:in `voidresp'
from C:/Ruby192/lib/ruby/1.9.1/net/ftp.rb:304:in `block in voidcmd'
from C:/Ruby192/lib/ruby/1.9.1/monitor.rb:201:in `mon_synchronize'
from C:/Ruby192/lib/ruby/1.9.1/net/ftp.rb:302:in `voidcmd'
from C:/Ruby192/lib/ruby/1.9.1/net/ftp.rb:155:in `send_type_command'
from C:/Ruby192/lib/ruby/1.9.1/net/ftp.rb:149:in `binary='
from C:/Ruby192/lib/ruby/1.9.1/net/ftp.rb:168:in `ensure in with_binary'
from C:/Ruby192/lib/ruby/1.9.1/net/ftp.rb:168:in `with_binary'
from C:/Ruby192/lib/ruby/1.9.1/net/ftp.rb:440:in `block in retrlines'
from C:/Ruby192/lib/ruby/1.9.1/monitor.rb:201:in `mon_synchronize'
from C:/Ruby192/lib/ruby/1.9.1/net/ftp.rb:439:in `retrlines'
from C:/Ruby192/lib/ruby/1.9.1/net/ftp.rb:682:in `list'
from ftpcrash.rb:10:in `<main>'
Я проследил проблему до ftp.list(buffer)
линии, но не может придумать решение Ruby, которое выполнит то, что $ftp->list($buffer)
делает в Perl один.
Предложения?
3 ответа
Буфер не нужен. #list принимает необязательный аргумент типа '*n', а не буфер, и возвращает массив.
require 'net/ftp'
ftp = Net::FTP.open('ftp.gnu.org','anonymous','')
puts ftp.list
ftp.quit
Судя по net/ftp.rb
В исходном коде это исключение возникает, когда библиотека ftp пытается получить ответ от сервера, а ответ пуст.
Вы должны обернуть эту команду в begin/rescue/end
(или просто rescue
) и обработайте ошибку соответственно.
Вот что ты хочешь чувак
#!/bin/ruby
require 'socket'
buffer = "A" * 512
host = 'xx.xx.xx.xx'
port = 21
s = TCPSocket.open(host, port)
s.recv(1024)
s.send("USER anonymous\r\n", 0)
s.recv(1024)
s.send("PASS anonymous\r\n", 0)
s.recv(1024)
s.send(buffer + "\r\n", 0)
sleep 0.3
s.close
Оставайтесь в безопасности;)