perl + потоки ввода вывода. вопрос.

Irina22

что мне было нужно:
сделать базу login:password для почты, есть рут на сервере, пароли plain text.
что сделал:
pwddump.pl
 
 
#!/usr/bin/perl
while($acco_string = <STDIN>)
{
  chomp;
  $_ = $acco_string;
  if(/USER/)
  {
    ($a,$user) = split('USER ');
#chomp($user); - почему-то не убирает конец строки из конца, вместо этого убирает всё из строки.
    print 'USER: '.$user;
    next;
  }
  if(/PASS/)
  {
    ($a,$pass) = split('PASS ');
    print ':PASS: '.$pass;
    next;
  }
}
 

запускаю:
 
  #tcpdump -w - -i eth1 port 110 | ./pwddump.pl

- на экран не выводит.
хотя:
 
  
20 post /root/tcpdump(/2)# tcpdump -w bbb -i eth1 port 110
tcpdump: listening on eth1
17 packets received by filter
0 packets dropped by kernel
20 post /root/tcpdump(/2)# cat bbb | ./pwddump.pl
USER: user
PASS: pwdpwd
20 post /root/tcpdump(/2)#

с перлом я не очень знаком..
так вот два вопроса
1) как поправить скрипт, чтобы работал chomp
2) как запускать, чтобы выводил на экран или в файл tcpdump ... | ./pwddump.pl
есть подозрение, что tcpdump выводит результат работы не в стандартный вывод, а куда-то ещё, только я не нашёл, куда.
3)на некоторых системах(или версиях) у tcpdump есть опция -A(которая показывает содержимое пакета в acsii в некоторых нет, на этой - нет, можно только смотреть
 
 
17:25:26.225448 10.5.29.58.1588 > aqua.pop3: P 1:12(11) ack 49 win 17632 (DF)
0x0000 4500 0033 335f 4000 7f06 79b3 0a2d 1d3a E.....y..-.:
0x0010 0a2d 1d1f 0634 006e 2207 63a0 5a78 e816 .-...4.n".c.Zx..
0x0020 5018 44e0 aeca 0000 5553 4552 2069 676f P.D.....USER.igo
0x0030 720d 0a r..
 

и текст получается разрезанным, как от этого избавиться я не нашёл.

Barbie29

pop_b4_smtp ваяешь?

Irina22

а что это?
всё понял, что значит b4
вообще, да, хотя и не только это, там много чего нужно изменить, а ящиков больше 100.

Barbie29

1) вместо строки ($a,$pass) = split('USER');
пиши
do{$a=$1; $pass=$2} if m!^(.*?): (.*?)$!;
мож получится
2) http://computer.edu.ru/lib/cookbook/ch16_08.htm
3) я вообще не понял, какие еще разрывы

Barbie29

pop_before_smtp
я как то делал такую-же шнягу
http://genphys.phys.msu.ru/~dmitriyk/perl/files/pop_b4_smtp....
она даже работала какое-то время
...

Irina22

дык, там строчка
мусор USER (то, что нужно)\n

Irina22

ну этот сендмайл- я с ним уже намучался.

Barbie29

тогда может быть так прокатит:
$user=$1 m!^USER:(.*?)$!;
?

sergey_m

Вообще в скрипте много неточностей, в том смысле что недостаточно жёсткие патерны поиска. Но изначальная идея неправильна тем, что ты пытаешься получать данные из TCP пакетов. Это в корне неверно, т.к. TCP является потоком, и нельзя тупо грепать пакеты.
Задача, которую ты себе поставил(а) вставала уже перед множеством людей. И многие её решили с помощью снифера, готовые решения можно найти в портах FreeBSD.
Насколько я понял, у тебя сейчас задача мигрировать с одной почтовой системы на другую, причём в первой пароли зашифрованы. Я решал такую задачу трижды и каждый раз следующим способом. Делался хак к аутентификатору старой почтовой системы, которые в случае успешного логина добавлял логин/пароль в базу новой почтовой системы. Обычно этот хак делается на языке Це и умещается в один экран.

Barbie29

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

spirinale

1. полезные тебе ключи tcpdump "-l", заодно "-p"
2. если уж на то пошло, то может проще написать враппер?

Irina22

-l - как раз то, что нужно, даже в манах пример с перенаправлением есть, я не заметил, спасибо.
-p - я что-то не понял, что делает
-p Don't put the interface into promiscuous mode. Note that the
interface might be in promiscuous mode for some other reason;
hence, `-p' cannot be used as an abbreviation for `ether host
{local-hw-addr} or ether broadcast'.

Irina22

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

rosali

Ну для начала надо бы поменять эти строчки местами:
  
chomp;
$_ = $acco_string;

Irina22

там этот chomp вообще случайно там оказался.
не работает тот, который закоментен

rosali

не работает тот, который закоментен
не знаю, у меня все работает...

Irina22

да я понимаю, что должен работать.

rosali

Может в тех данных, которые ты скармливаешь, после USER не пробел стоит а что-то другое? \t например?

Irina22

без chomp - всё в порядке, только $user содержит перевод каретки в конце строки.

rosali

Возможно там виндовый перевод каретки, когда chomp стирает \n остается \r и печать пароля затирает юзера ... атличная гипотеза
PS.

[xenon ~]$ printf "USER a\n PASS b\n" | perl xxx.pl
USER: a:PASS: b
[xenon ~]$ printf "USER a\r\n PASS b\n" | perl xxx.pl
:PASS: b

Надо было заметить что 'USER:' тоже пропало, прежде чем на chomp пенять

spirinale

чтоб не строить гипотез, читайте RFC по pop3, там все написано
-p - чтоб не заставлять интерфейс ловить чужие пакеты

Irina22

а не подскажешь, как там конец строки убрать, а то в перле я не особо силён

Elina74

chomp переменная
chomp список
Удаляет в конце строки символ указанный переменной $/. Обычно это 'LF'. Возвращает количество удаленных символов. Если переменная не указана то используется переменная $_. Если указан список то обрабатывается каждая строка списка и возвращается общее количество удаленных символов.
------------------------------
chop переменная
chop список
Полностью аналогично функции chomp но всегда удаляет последний символ строки.

Irina22

спасибо!
Оставить комментарий
Имя или ник:
Комментарий: