Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Как закрыть лог файл expect  (Прочитано 915 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн prizes

  • Автор темы
  • Любитель
  • *
  • Сообщений: 57
    • Просмотр профиля
Как закрыть лог файл expect
« : 29 Апрель 2016, 12:07:43 »
Есть скрипт подключающийся к pop.mail.ru и читающий письма командой top. Надо чтобы вывод команды top для каждого письма в цикле сохранялся в отдельный лог файл. Для этого существует строка в скрипте
Код: TCL
  1. log_file $mail_n.log
(где переменная mail_n номер письма и имя файла). Но вылетает ошибка
Код: Text
  1. cannot start logging without first stopping logging
. Т.е. пока тот лог файл не закроется новый не создастся.
Вопрос: как закрыть?
Код: TCL
  1. #!/usr/bin/expect -f
  2. set ufile [open "idpisma.log" r]
  3. spawn openssl s_client -ign_eof -connect pop.mail.ru:995
  4. expect "+OK"
  5. send "user имя_пользователя\r"
  6. expect "+OK"
  7. send "pass пароль\r"
  8. expect "Welcome"
  9. send "list\r"
  10. foreach uline [split [read $ufile] "\n"] {
  11. set mail_n [lindex $uline 0]
  12. if { [string length $mail_n] > 0 } {
  13. log_file $mail_n.log
  14. send "top $mail_n 200 \r"
  15. close
  16. }
  17. }
  18. close $ufile
  19. send "quit\r"
  20. expect eof
« Последнее редактирование: 29 Апрель 2016, 13:41:06 от Azure »

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 5659
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Re: Как закрыть лог файл expect
« Ответ #1 : 29 Апрель 2016, 13:42:59 »
  • Почему не использовать 1 лог для всех писем? Зачем для каждого отдельный лог?
  • Если надо сохранять вывод в отдельный файл, то почему не использовать просто перенаправление вывода?
« Последнее редактирование: 29 Апрель 2016, 13:45:23 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн prizes

  • Автор темы
  • Любитель
  • *
  • Сообщений: 57
    • Просмотр профиля
Re: Как закрыть лог файл expect
« Ответ #2 : 30 Апрель 2016, 05:02:38 »
долго думал что ответить, вообщем мне надо чтобы скрипт складывал в отдельные файлы смысловое сообщение письма(не служебное). Т.е
Вася.txt
   Привет как дела
   ......бла бла

Peter.txt
   Hello.
   How are you

Я ходел отфильтровать общий лог командой sed, но у писем почему-то формат не единный, да и со строками не угадаешь, нет жесткой последовательности в количестве. Есть идеи как это сделать?

Пользователь добавил сообщение 30 Апрель 2016, 05:05:13:
Если сложить все письма в разные файлы, тут думаю получится командой sed вырезать служебную информацию сверху и снизу, оставив только само сообщение. Хотя может и не получится т.к. еще есть теги оформления, а это еще доп. строки. Ну как-то же это все-равно возможно
« Последнее редактирование: 30 Апрель 2016, 05:05:13 от prizes »

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 5659
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Re: Как закрыть лог файл expect
« Ответ #3 : 30 Апрель 2016, 10:30:05 »
у писем почему-то формат не единный, да и со строками не угадаешь, нет жесткой последовательности в количестве. Есть идеи как это сделать?
Пока Вы не приведете все возможные форматы (в виде образца лог-файла) совет дать невозможно — хрустальный шар поломался.
Почему Вы читаете посты не полностью? Разве команда
Код: TCL
  1. send "top $mail_n 200 \r" >$mail_n.log
не делает что надо? Тогда через лог
Код: TCL
  1. log_file $mail_n.log
  2. send "top $mail_n 200 \r"
  3. log_file
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн prizes

  • Автор темы
  • Любитель
  • *
  • Сообщений: 57
    • Просмотр профиля
Re: Как закрыть лог файл expect
« Ответ #4 : 30 Апрель 2016, 12:37:04 »
>$mail_n.log не прокатит т.к. этот синтаксис понимает bash, а у меня expect. Ну я попробовал, вот что выдал терминал
Цитировать
can't read "mail": no such variable
    while executing
"send "top $mail_n 200 \r" >$mail.log"
    ("foreach" body line 4)
    invoked from within
"foreach uline [split [read $ufile] "\n"] {
set mail_n [lindex $uline 0]
if { [string length $mail_n] > 0 } {
send "top $mail_n 200 \r" >$mail.log
clos..."
    (file "./read_letter.sh" line 10)

2-й вариант
Цитировать
log_file $mail_n.log
send "top $mail_n 200 \r"
log_file
создал 2 файла с именами 1.log и 2.log. Первый файл пустой во второй сложил ниже изложенный текст ошибки
Цитировать
send: spawn id exp7 not open
    while executing
"send "top $mail_n 200 \r""
    ("foreach" body line 5)
    invoked from within
"foreach uline [split [read $ufile] "\n"] {
set mail_n [lindex $uline 0]
if { [string length $mail_n] > 0 } {
log_file $mail_n.log
send "top $mail_n 20..."
    (file "./read_letter.sh" line 10)

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 5659
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Re: Как закрыть лог файл expect
« Ответ #5 : 30 Апрель 2016, 15:25:38 »
1.
Как говорится найдите разницу
"send "top $mail_n 200 \r" >$mail.log"
send "top $mail_n 200 \r" >$mail_n.log
2.
Почему close внутри цикла? Что Вы закрываете каждую иттерацию?
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн prizes

  • Автор темы
  • Любитель
  • *
  • Сообщений: 57
    • Просмотр профиля
Re: Как закрыть лог файл expect
« Ответ #6 : 02 Май 2016, 05:09:32 »
Разницу нашел в кавычках. Но эти кавычки не в скрипте(в файле), а в выводе ошибки терминала. Т.е это интерпритатор вставил туда кавычки. Close не знаю для чего, когда гуглил нашел именно такой шаблон и он оказался рабочим. Close убрал, ничего не изменилось. Ну раз он не нужен оставил скрипт без него. Лог файл по прежнему нужно как-то закрыть для того чтобы цикл скрипта мог создать новый.

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 5659
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Re: Как закрыть лог файл expect
« Ответ #7 : 02 Май 2016, 13:43:45 »
send "top $mail_n 200 \r" >$mail.log
send "top $mail_n 200 \r" >$mail_n.log
Так заметнее?
Это вообще должно работать если убрали close
Код: TCL
  1. log_file $mail_n.log
  2. send "top $mail_n 200 \r"
  3. log_file
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн prizes

  • Автор темы
  • Любитель
  • *
  • Сообщений: 57
    • Просмотр профиля
Re: Как закрыть лог файл expect
« Ответ #8 : 03 Май 2016, 07:39:44 »
Это не то. Интуиция подсказывает что expect не понимает ввод в вайл символом > Это понимает bash.
Цитировать
+OK Welcome!
usage: send [args] string
    while executing
"send "top $mail_n 200 \r" >$mail_n.log"
    ("foreach" body line 4)
    invoked from within
"foreach uline [split [read $ufile] "\n"] {
set mail_n [lindex $uline 0]
if { [string length $mail_n] > 0 } {
send "top $mail_n 200 \r" >$mail_n.log
}
..."
    (file "./read_letter.sh" line 10)

Оффлайн prizes

  • Автор темы
  • Любитель
  • *
  • Сообщений: 57
    • Просмотр профиля
Re: Как закрыть лог файл expect
« Ответ #9 : 05 Май 2016, 08:06:50 »
не знаю почему до этого не работало, но сегодня заработало так:
Цитировать
log_file $mail_n.log
send "top $mail_n 200 \r"
log_file
Создал столько лог файлов сколько надо, но они пустые. Почему они пустые???

Оффлайн mihasЬ

  • Участник
  • *
  • Сообщений: 236
    • Просмотр профиля
Re: Как закрыть лог файл expect
« Ответ #10 : 05 Май 2016, 08:15:50 »
prizes, Может не в тему, но 2 замечания - итерация -- грубо говоря - повторение. 2 - Почему бы логам не писаться при загрузке оси?

Оффлайн prizes

  • Автор темы
  • Любитель
  • *
  • Сообщений: 57
    • Просмотр профиля
Re: Как закрыть лог файл expect
« Ответ #11 : 05 Май 2016, 08:30:46 »
не много не уловил мысль. Вы имеете ввиду почему не писать общий лог в файл при подключении к pop.mail.ru и до самого завершения сессии? Если да, то мне надо раскидать каждое письмо в оттедльный текстовый файл. Не понял что такое загрузка оси(ось для меня это всегда была операционной системой, но здесь не об ОС идет речь)

Пользователь добавил сообщение 05 Май 2016, 09:01:37:
Все народ сам допер как это сделать. Ниже привожу уже готовый скрипт:
Цитировать
#!/usr/bin/expect -f
set ufile [open "idpisma.log" r] #объявляю переменную ufile значение которой равно файлу idpisma.log
spawn openssl s_client -ign_eof -connect pop.mail.ru:995  #подключаюсь к серверу
expect "+OK"         #найди +OK и если нашел
send "user имя пользователя"  #отправь команду user имя_пользователя
expect "+OK"         #найди +OK и если нашел
send "pass пароль\r"  #отправь команду pass пароль
expect "Welcome"      #найди Welcome и если нашел
log_file list.log     #начать логгинг
send "list\r"         #отправь команду pass пароль list
expect eol            #к этому пришел чисто интуитивно, ну как я понял это означает выдели все что породила предыдущая строка(найди конец строки)
log_file              #завершить логгинг. Остальное уже описывал выше.Короче устал описывать
foreach uline [split [read $ufile] "\n"] {
set mail_n [lindex $uline 0]
if { [string length $mail_n] > 0 } {
log_file $mail_n.log
send "top $mail_n 200 \r"
expect eol
log_file
}
}
close $ufile
send "quit\r"
expect eof
Но есть одно замечание все это работает с паузами перед созданием файла. Почему не знаю. Если в файлы не писать т.е это выполняется за 1 секунду.
« Последнее редактирование: 05 Май 2016, 09:01:37 от prizes »

 

Страница сгенерирована за 0.064 секунд. Запросов: 24.