Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> признак завершения STDIN 
:(
    Опции темы
blackjackchik
Дата 18.3.2009, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 18.3.2009

Репутация: нет
Всего: нет



Всем привет. 
Есть программа которая передает на stdin скрипту на перл некоторые параметры и признаком завершения передачи есть пустая строка. Дальше есть сам скрипт
Код

#!/usr/bin/perl
@par=<STDIN>;
open(fh,"+>>/home/admin/extauth.txt");
foreach $line (@par)
{
print fh $line;
}
close(fh);


Если запускаю вручную то все работает до нажания Ctrl+D. Врезультате имеем файл с записанным STDIN. Но если скрипт запускается из  программы с переданнымы параметрамы на STDIN то скрипт как-бы зависает, но на самом деле скрипт висит в процессах потому что ожидает ввода на STDIN. Почему он не понимает что ввод закончился? 
PM MAIL   Вверх
klem4
Дата 18.3.2009, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 27.7.2008

Репутация: 2
Всего: 2



Покажите как скрипт запускаете из программы.
PM MAIL   Вверх
blackjackchik
Дата 18.3.2009, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 18.3.2009

Репутация: нет
Всего: нет



Вот так.
Код

set auth extauth-script "/usr/local/etc/mpd5/extauth.pl"

А вот кусок документации к вызову.
Цитата

Mpd supports authentication and accounting by calling external scripts. Pathes to that scripts must be specified using set auth extauth-script ... and set auth extacct-script ... commands.

On invocation extauth/extacct scripts receive on stdin set of request attribute:value pairs terminated by empty line and must generate response in same format on stdout.

PM MAIL   Вверх
KSURi
Дата 18.3.2009, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



Пустая строка не является признаком EOF. Попробуйте так:
Код

open my $fh, '>>', 'file';
while(<STDIN>) {
  /^$/o && last;
  print $fh $_
}
close $fh



--------------------
Died at Life.pl line 21
PM Jabber   Вверх
blackjackchik
Дата 18.3.2009, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 18.3.2009

Репутация: нет
Всего: нет



Таким образом запустив вручную скрипт я вообще ниче не вижу чтобы в файл записалось.
PM MAIL   Вверх
ginnie
Дата 18.3.2009, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



blackjackchik, попробуйте

Код

open my $fh, '>>', 'file';
while(<STDIN>) {
  /^[\r\n]+$/ && last;
  print $fh $_
}
close $fh


Это сообщение отредактировал(а) ginnie - 18.3.2009, 15:44


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
KSURi
Дата 18.3.2009, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



ginnie, регексы одинаковые по сути. Мой вариант работает, просто дело, возможно, в другом.
Код

C:\>perl -pe"/^$/o && last"
hello
hello
hello2
hello2


C:\>

Код

$ perl -pe'/^$/o && last'
hello
hello
hello2
hello2

$



--------------------
Died at Life.pl line 21
PM Jabber   Вверх
ginnie
Дата 18.3.2009, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



KSURi, по идее /^$/ совпадает только для "\n", а для "\r\n" надо /^\r?$/


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
blackjackchik
Дата 18.3.2009, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 18.3.2009

Репутация: нет
Всего: нет



Вот еще вариант
Код

$a=<>;
chop $a;
while($a ne '')
{
       system("/bin/echo \"$a\" >> /home/admin/extauth.txt");
       $a=<>;
       chop $a;
}



Вот так вручную запускаю работает на ура, а вот при вызове скрипта из mpd не хочет, тоесть и не остается висеть и в файл ничего не пишет.
PM MAIL   Вверх
ginnie
Дата 18.3.2009, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



blackjackchik, какие права на файл /home/admin/extauth.txt?


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
KSURi
Дата 18.3.2009, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



Цитата(ginnie @  18.3.2009,  16:20 Найти цитируемый пост)
KSURi, по идее /^$/ совпадает только для "\n", а для "\r\n" надо /^\r?$/ 

Разве? Я ведь специально привел примеры для ОС в которых соотвестственно используются \r\n и \n для перевода строк. К тому же, mpd - юниксовое приложение, соответственно использует \n для перевода строки.

Это сообщение отредактировал(а) KSURi - 18.3.2009, 17:29


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
ginnie
Дата 18.3.2009, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



KSURi, попробуйте у себя в Windows:

Код

perl -e "qq{\r\n} =~ /^$/ && print 'ok', $/"



--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
blackjackchik
Дата 18.3.2009, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 18.3.2009

Репутация: нет
Всего: нет



Mpd работает от рута.  А права вот 
Код

-rw-r--r--  1 root  admin     0B Mar 18 14:27 /home/admin/extauth.txt

PM MAIL   Вверх
ginnie
Дата 18.3.2009, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



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



--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
blackjackchik
Дата 18.3.2009, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 18.3.2009

Репутация: нет
Всего: нет



Итак сделал права 777 на файл для записи. 
Вот так работает
Код


while (my $line = <STDIN>) {
chomp $line;
system("/bin/echo \"$line\" >> /home/admin/extauth.txt");
last  if $line =~ /^$/;

}


Вот что в файл записало
Код

USER_NAME:router2
AUTH_TYPE:CHAP MSOFTv2
ACCT_SESSION_ID:7390230-Link-1
LINK:Link-1
NAS_PORT:1
NAS_PORT_TYPE:pppoe
CALLING_STATION_ID:00138f89556b
CALLED_STATION_ID:
SELF_NAME:
PEER_NAME:
SELF_ADDR:
PEER_ADDR:00:13:8f:89:55:6b
PEER_PORT:
PEER_MAC_ADDR:00:13:8f:89:55:6b
PEER_IFACE:vlan23
PEER_IDENT:



Спасибо всем за помощ в разборках.  smile 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0654 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.