URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9165
[ Назад ]

Исходное сообщение
"Openssl & IMAP  (Помогите со скриптом)"

Отправлено FrenzyC , 17-Июн-11 20:34 
OS - Ubuntu

Задача следующая - Подключиться к почтовому серверу по IMAP-протоколу и удалить почту и нужной папки, с чем я прекрасно справился поочередно вводя следующие комманды в консоли.

openssl s_client -ssl3 -ign_eof -crlf -connect imap.gmail.com:993
. login  LOGIN PASSWORD
. select "[Gmail]/All Mail"
. store 1:10 flags \deleted
. expunge
. logout

Решил написать скрипт.
Запихиваю все это в файл - делаю его исполняемым

#!/bin/bash
openssl s_client -ssl3 -ign_eof -crlf -connect imap.gmail.com:993  # подключаюсь к серваку
. login  LOGIN PASSWORD  # вводится логин и пароль
. select "[Gmail]/All Mail"   # выбираю папку
. store 1:10 flags \deleted # помечаю письма с 1-го по 10-е на удаление
. expunge  # удаляю письма
. logout

Когда запускаю на выполнение - Выполняется только подключение к серверу - дальше скрипт не выполняется (Такое ощущение что остальные строки туда не передаются)
При этом (после того как подключился к серверу через скрипт) - могу вручную вводить все те же строки и все будет работать.


Подскажите в чем проблема и как от нее избавиться.

PS: С линуксом знаком не очень хорошо, по факту это мои первые попытки написать скрипт. Самостоятельно решение искал долго но не нашел.


Содержание

Сообщения в этом обсуждении
"Openssl & IMAP  (Помогите со скриптом)"
Отправлено elvenic , 17-Июн-11 20:52 
Копайте в сторону expect (напр. см сюда: http://linux.die.net/man/1/expect)

"Openssl & IMAP  (Помогите со скриптом)"
Отправлено FrenzyC , 23-Июн-11 12:08 
Спасибо. Получилось.

Вот как сделал (может кому то пригодиться)

Есть 3 файла;
1. Read Logins (Считывает логины и передает их во второй файл)
2.Connect (По очереди для каждой учетной записи подключается и выполняет действия)
3.Logins.txt (собственно сам файл с логинами


------------------------------файл 1 (Read Logins)--------------
#!/bin/bash

cat '/home/frenzy/logins.txt' | while read line; do                         #построчно считывает логин\пароль для подключения
IFS=","                                    # указывает разделитель между логином и паролем
set -- $line                               # пазбиваем строку на 2 части
username=$1                                 # сохранение первой части строки в переменную
password=$2                                 #сохранение второй части строки в переменную

'/home/frenzy/connect.sh' $username $password                        # передача переменных во второй скрипт
done


------------------------------файл 2 (connect.sh)---------------------
#!/usr/bin/expect -f
set timeout 4
set login [lindex $argv 0]
set password [lindex $argv 1]
spawn openssl s_client -ssl3 -ign_eof  -crlf -connect imap.gmail.com:993 #подключение к серверу
expect "*\r"
sleep 3
send ". login $login $password\r"                      # логинимся
expect "*\r"                                            #Ожидание новой строки для ввода данных
sleep 3                                 #Задержка
send ". select \"\[Gmail\]/Drafts\"\r"                         #Выбираем папку Черновики \ Подставляем нужную папку Inbox,Sent To )
expect "*\r"
sleep 3
send ". store 1:10 flags \\deleted\r"                        # помечаем письма с 1го по 10е на удаление
expect "*\r"
sleep 3
send ". expunge\r"                      # Удаляем письма
expect "*\r"
sleep 20
send ". logout\r"                       # Отключаемся от сервера
expect eof

----------------------------файл 3 (logins.txt)--------------
EmailLogin1,Password1
EmailLogin2,Password2
EmailLogin3,Password3


*Примечание - Что бы письма удалялись после команды EXPUNGE - это надо выставить в настройках IMAP\POP3


К сожалению в один файл весь скрипт впихнуть не получилось - так и не разобрался как сделать так что бы определенные строки обрабатывались через Bash а определенные через Expect.

Если кто-то подскажет как это сделать буду очень благодарен.



"Openssl & IMAP  (Помогите со скриптом)"
Отправлено allez , 24-Июн-11 05:42 
> К сожалению в один файл весь скрипт впихнуть не получилось - так
> и не разобрался как сделать так что бы определенные строки обрабатывались
> через Bash а определенные через Expect.
> Если кто-то подскажет как это сделать буду очень благодарен.

Можно, например, попробовать так:

1. Заменить в файле logins.txt запятые на пробелы. У вас ведь, я надеюсь, нет пробелов ни в
именах пользователей, ни в паролях? А вот запятая в пароле вполне себе может возникнуть. И
что тогда? ;-) Плюс ко всему не нужна станет возня с IFS.

2. Сформировать из двух имеющихся скриптов один:


#!/bin/bash

while read username password; do            # Построчно считываем логин\пароль для подключения

    expect -c "
    set timeout 4
    spawn openssl s_client -ssl3 -ign_eof  -crlf -connect imap.gmail.com:993 # Подключение к серверу
    expect *\r
    sleep 3
    send .\ login $username $password\r     # Логинимся
    expect *\r                              # Ожидание новой строки для ввода данных
    sleep 3                                 # Задержка
    send .\ select\ \"\[Gmail\]/Drafts\"\r  # Выбираем папку Черновики \ Подставляем нужную папку Inbox, Sent To )
    expect *\r
    sleep 3
    send .\ store\ 1:10\ flags\ \\deleted\r # Помечаем письма с 1-го по 10-е на удаление
    expect *\r
    sleep 3
    send .\ expunge\r                       # Удаляем письма
    expect *\r
    sleep 20
    send .\ logout\r                        # Отключаемся от сервера
    expect eof"

done < /home/frenzy/logins.txt