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: С линуксом знаком не очень хорошо, по факту это мои первые попытки написать скрипт. Самостоятельно решение искал долго но не нашел.
Копайте в сторону expect (напр. см сюда: http://linux.die.net/man/1/expect)
Спасибо. Получилось.Вот как сделал (может кому то пригодиться)
Есть 3 файла;
1. Read Logins (Считывает логины и передает их во второй файл)
2.Connect (По очереди для каждой учетной записи подключается и выполняет действия)
3.Logins.txt (собственно сам файл с логинами
------------------------------файл 1 (Read Logins)--------------
#!/bin/bashcat '/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.Если кто-то подскажет как это сделать буду очень благодарен.
> К сожалению в один файл весь скрипт впихнуть не получилось - так
> и не разобрался как сделать так что бы определенные строки обрабатывались
> через Bash а определенные через Expect.
> Если кто-то подскажет как это сделать буду очень благодарен.Можно, например, попробовать так:
1. Заменить в файле logins.txt запятые на пробелы. У вас ведь, я надеюсь, нет пробелов ни в
именах пользователей, ни в паролях? А вот запятая в пароле вполне себе может возникнуть. И
что тогда? ;-) Плюс ко всему не нужна станет возня с IFS.2. Сформировать из двух имеющихся скриптов один:
#!/bin/bashwhile 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