Автоматическая настройка SMTP сервера. Соединение с сервером по SSH.

Лев

Client
Регистрация
09.12.2014
Сообщения
290
Благодарностей
273
Баллы
63
В данной статье я затрону работу с протоколом ssh через Zennoposter. Если вам приходится постоянно работать с настройкой серверов, используя клиент Putty, и каждый день вводить одни и те же команды, то теперь Вы сможете легко автоматизировать этот процесс с помощью Zennoposter и библиотеки, которая называется SSH.NET. Как добавлять сторонние библиотеки в Zenno писалось уже ни один раз, но чтобы статья была законченной опишу данный процесс еще раз. В папке с проектом к данной статье Вы найдете библиотеку Renci.SshNet.dll. Данный файл необходимо положить в папку ExternalAssemblies. На моем компьютере путь будет таким: C:\Program Files (x86)\ZennoLab\ZennoPoster Lite\Progs\ExternalAssemblies. Теперь осталась добавить ссылку в GAC и прописать using согласно скриншотам ниже:




Итак, пол дела сделано. Как работать с данной библиотекой будет показано на конкретном примере, а именно, на примере установки панели VESTA. VESTA - бесплатный аналог isp Manager. Для того, чтобы поставить эту панель, необходимо ввести ряд команд,указанных в документации, соединившись с сервером по SSH.

В документации разработчиков указаны следующие команды:
Код:
curl -O http://vestacp.com/pub/vst-install.sh
bash vst-install.sh
Однако на некоторых хостингах приходится добавлять еще одну команду

Код:
bash vst-install-rhel.sh --force
Я так понял, что это связано с тем, что на сервере уже стоят какие-то пакеты, а установка весты возможна только на чистый сервер. Вобщем не суть. В любом случае, в своей задаче, вам необходимо точно узнать последовательность команд, которые нужно вводить для установки (настройки) чего-либо.

Вообще работать с библиотекой просто, но возникла одна загвоздка, но об этом позже.

Чтобы начать работать с библиотекой, создается sshClient

Код:
SshClient sshClient = new SshClient("ip", 22, "root", "password");

sshClient.Connect();
Вместо ip и password Вы указываете данные, которые Вам предоставил хостинг.

Теперь, чтобы выполнить команду, просто используем метод CreateCommand и выполняем ее через Execute().

Код:
var cmd = sshClient.CreateCommand("curl -O http://vestacp.com/pub/vst-install.sh");
        cmd.Execute();
cmd = sshClient.CreateCommand("bash vst-install.sh");
        cmd.Execute();
Но дальше возникает небольшая проблема. Дело в том, что после последней команды:

Код:
bash vst-install-rhel.sh -–force
запрашивается подтверждение установки панели: Вы действительно хотите продолжить? [y/n]

И если сделать вот так:

Код:
cmd = sshClient.CreateCommand("bash vst-install-rhel.sh --force");
        cmd.Execute();
То Zennoposter зависнет, так как будет ждать завершения выполнения этой команды, а завершения команды не произойдет, так как ожидается ввод буковки «y».

Поэтому в таких ситуация используется специальное соединение shellStream. Согласно документации создается оно следующим образом:

Код:
IDictionary<Renci.SshNet.Common.TerminalModes, uint> termkvp = new Dictionary<Renci.SshNet.Common.TerminalModes, uint>();
termkvp.Add(Renci.SshNet.Common.TerminalModes.ECHO, 53);
ShellStream shellStream = sshClient.CreateShellStream("xterm", 80,24, 800, 600, 1024, termkvp);
Поэтому добавляем последнюю команду для установки Vesta в таком виде:

Код:
shellStream.WriteLine("bash vst-install-rhel.sh --force --email [email protected] --hostname domen.ru --password pass");
Я сразу добавил после команды опции --email, --hostname, --password

Иначе придется ввести не только «y», но и последовательно email, password, hostname.

И дальше есть два пути. Первый - определить примерно сколько времени будет выполняться эта команда (в нашем случае сколько будет выполняться команда до возникновения вопроса[y/n]).Очевидно, что это происходит в доли секунды, поэтому можно просто сделать паузу и вводить следующую команду. Поэтому делаем так:

Код:
System.Threading.Thread.Sleep(3000);
Теперь подтверждаем, что мы действительно хотим установить эту панель. Для этого вводим букву «y»

При этом сервер знает, что эта команда является именно ответом на этот запрос.

Код:
shellStream.WriteLine("y");
Далее идет установка панели, но теперь просто поставить паузу не удастся (т.к. панель устанавливается от 5 до 10 минут) и ставить паузу с большим запасом не очень круто. Поэтому используется специальный метод Expect, которому передается регулярка. Т.е. При соединении идет отслеживание ответов от сервера. Когда панель установится, то в конце будут слова с поздравлениями. Я просто взял какую-то строчку как регулярное выражение. Т.е. Я указал, что как только данная строчка появится в ответе от сервера, то можно переходить к следующей команде.

Код:
shellStream.Expect(new Regex(@"Sincerely yours"), new TimeSpan(0, 15, 0));
Также вторым аргументом идет тайм-аут (время, через которое стоит прекратить дожидаться указанной строки). Т.к. разработчики указывают, что панель может устанавливаться до 15 минут, то я и указал это время (хотя на практике веста устанавливается за 5-10 минут).

Панель установилось, а значит соединение можно закрывать.

Код:
sshClient.Disconnect();
Если все прошло успешно, то по адресу https://ip:8083/ будет форма авторизации.

Теперь давайте на базе сервера с панелью Vesta настроим SMTP сервер и на полном автомате создадим неограниченное количество почтовых ящиков.

Для этого воспользуемся api, который предоставили нам разработчики. Как только мы поставили панель, то у нас уже добавлен домен (который был указан в опции --hostname), а также пароль администратора (который был указан в опции —-password). Для доступа к api необходимо указывать имя администратора (всегда admin), указанный пароль, команду, и обязательные аргументы для этой команды.


Давайте на конкретном примере. Создадим неограниченное количество почтовых аккаунтов на домене. Запросы для настройки Vesta отправляются по адресу:

https://{-Variable.ip-}:8083/api/

где {-Variable.ip-} - ip адрес вашего сервера.

Для создания одного ящика используем следующий запрос:

Код:
user={-Variable.user-}&password={-Variable.pass-}&returncode=yes&cmd=v-add-mail-account&arg1={-Variable.user-}&arg2={-Variable.domen-}&arg3={-Variable.prefix-}{-Variable.count-}&arg4={-Variable.passemail-}
Где {-Variable.user-} - admin
{-Variable.pass-} - пароль администратора
cmd - команда из документации
returncode – возвращать ли числовой код ошибки (вернется 0 — все хорошо=))
{-Variable.prefix-}{-Variable.count-} - это имя почтового ящика. Т.е. Во входных настройках Вы указываете префикс (например info), и далее в цикле, увеличивая {-Variable.count-} вы получаете ящики [email protected], [email protected]и т.д.
{-Variable.pass-} - пароль для создаваемых ящиков

Ну и, как я уже писал, в цикле Вы можете создать неограниченное количество ящиков на домене. Подробнее можете посмотреть в шаблоне для этой статьи.

Ящики есть, теперь надо чтобы все заработало и доставлялось. В панели Vesta для домена на автомате создались DNS записи.

которые просто нужно прописать у регистратора (или туда, куда вы делегировали свой домен). Можно конечно это сделать вручную, но можно опять воспользоваться api vesta + api регистратора.

Чтобы получить все dns записи для домена используем апи запрос:

Код:
user=admin&password=pass&cmd=v-list-dns-records&arg1=admin&arg2=hostname
В ответ вернется текст с dns записями. Далее регулярками расфасовываем данные по переменным и прописываем у регистратора.

Я пользуюсь регистратором reg.ru, у которого есть свой api, и все функции для добавления записей.

Все стандартно, для каждой записи есть своя команда. Чтобы добавить, например, mx запись используется add_mx



Вы также можете создать неограниченное количество поддоменов, и уже на них сколько угодно ящиков (что улучшит доставляемость ваших писем)

Что из себя представляет шаблон к статье.

Шаблон имеет входные настройки. Напротив каждого поля имеются подсказки, что конкретно необходимо ввести.


Т.е. Шаблон последовательно устанавливает панель, добавляет указанное в настройках количество ящиков (с указанным префиксом), и считывает цифровой ключ DKIM для домена.

На выходе получается два файла. В первом (create.txt) будут находится созданные почтовые ящики.

Во втором (dns.txt) – днс записи, которые необходимо прописать у регистратора.


Все почтовые ящики будут с валидными dkim и spf, что является обязательным условием доставляемости для google и yandex.

Ну и еще раз напоминаю, что установка панели на каждом конкретном сервере может немного отличаться, поэтому желательно один раз проделать все руками, и, в случае надобности, подкорректировать команды

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

Спасибо за внимание =)
 
Тема статьи
Нестандартные хаки
Номер конкурса статей
Четвертый конкурс статей

Вложения

Для запуска проектов требуется программа ZennoPoster или ZennoDroid.
Это основное приложение, предназначенное для выполнения автоматизированных шаблонов действий (ботов).
Подробнее...

Для того чтобы запустить шаблон, откройте нужную программу. Нажмите кнопку «Добавить», и выберите файл проекта, который хотите запустить.
Подробнее о том, где и как выполняется проект.

looternsk

Client
Регистрация
24.08.2013
Сообщения
7
Благодарностей
1
Баллы
3
5 балов из 5.
 

RipWay

Client
Регистрация
21.11.2013
Сообщения
101
Благодарностей
46
Баллы
28
Спасибо как раз нужно было общение с серверов по ssh. Очень вовремя!
 

codeby

Client
Регистрация
25.08.2014
Сообщения
394
Благодарностей
53
Баллы
28
этот конкурс реально радует с первых статей :-)
 
  • Спасибо
Реакции: angel737

Master Woo

Client
Регистрация
06.12.2014
Сообщения
122
Благодарностей
129
Баллы
43
можно ли получать последнее значение командной строки?
 

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 500
Благодарностей
1 268
Баллы
113
там ssh - тут ssh) Скоро мы узнаем как сидеть в торе через ssh
 

Лев

Client
Регистрация
09.12.2014
Сообщения
290
Благодарностей
273
Баллы
63
Раджаб, в этой статье основной упор не на ssh, а в том, что ты в один клик создашь почтовые ящики для рассылки.

Master Woo, я точно не знаю, там методов гора целая. Но последнюю строчку из ответа сервера при соединении через shellstream я смог получить, добавив перед Writeline строку
Код:
StreamReader reader = new StreamReader(shellStream);
И после Expect
Код:
string out = reader.ReadToEnd();
Ну и в конце return out, чтобы положить результат в переменную.
 

Master Woo

Client
Регистрация
06.12.2014
Сообщения
122
Благодарностей
129
Баллы
43
Раджаб, в этой статье основной упор не на ssh, а в том, что ты в один клик создашь почтовые ящики для рассылки.

Master Woo, я точно не знаю, там методов гора целая. Но последнюю строчку из ответа сервера при соединении через shellstream я смог получить, добавив перед Writeline строку
Код:
StreamReader reader = new StreamReader(shellStream);
И после Expect
Код:
string out = reader.ReadToEnd();
Ну и в конце return out, чтобы положить результат в переменную.
последняя строчка это хорошо, но часто бывает что вывод - несколько строк, вот тут хорошо было бы делать все выборку после введенной команды и уже на основе полученного результата включать логику...
но все равно спасибо, буду копать в эту сторону
 

sekoan

Client
Регистрация
04.01.2015
Сообщения
219
Благодарностей
92
Баллы
28
Как то тихо с конкурсами, нету взрывающих "тем-бомб"
 

olga.armalita

Client
Регистрация
05.04.2014
Сообщения
194
Благодарностей
42
Баллы
28

sekoan

Client
Регистрация
04.01.2015
Сообщения
219
Благодарностей
92
Баллы
28
sekoan said:
Как то тихо с конкурсами, нету взрывающих "тем-бомб"
А какие темы по Вашему мнению могли бы "взорвать" конкурс?
Ну из предыдущего конкурса, инстограм, вконтакте, буржуйский трафик и т д)
 

Valandersi

Client
Регистрация
19.01.2015
Сообщения
1 935
Благодарностей
1 123
Баллы
113
Ну из предыдущего конкурса, инстограм, вконтакте, буржуйский трафик и т д)
Ну тоже спорно, все темы что вы перечислили именно заработок. А такого плана темы именно показывают и другие способы применение зенки + если подумать и в этой теме можно заработать;-)
 

Ghisool

Client
Регистрация
21.02.2013
Сообщения
41
Благодарностей
9
Баллы
8
Ну тоже спорно, все темы что вы перечислили именно заработок. А такого плана темы именно показывают и другие способы применение зенки + если подумать и в этой теме можно заработать;-)
Большинство людей хотят кнопку бабло:-) Думать же практически никто не хочет.
 

Valandersi

Client
Регистрация
19.01.2015
Сообщения
1 935
Благодарностей
1 123
Баллы
113
Ну никто просто так это не спалит, нужно самим её создавать, зенка хороший инструмент для этого
 
  • Спасибо
Реакции: APXOHT

fearnewstyle

Новичок
Регистрация
17.02.2014
Сообщения
22
Благодарностей
3
Баллы
3
Автору 5 баллов из 5! Как раз хотел через научиться через ssh ставить весту с помощью зеньки! Автор это не вы случаем на складчике эту тему по автоматизации создания smtp серверов и поднятия прокси продаете? )))
 
  • Спасибо
Реакции: Nick

lokiys

Moderator
Регистрация
01.02.2012
Сообщения
4 813
Благодарностей
1 188
Баллы
113
Mогу я использовать это библиотеку, чтобы подключиться к удаленную mysql. ? Теперь я использую putty.exe для подключения к серверу через SSH, И тогда я использую C # для подключения к MySQL.
хотел избавляться от putty :-)

Cпасибо
 

Лев

Client
Регистрация
09.12.2014
Сообщения
290
Благодарностей
273
Баллы
63
Mогу я использовать это библиотеку, чтобы подключиться к удаленную mysql. ? Теперь я использую putty.exe для подключения к серверу через SSH, И тогда я использую C # для подключения к MySQL.
хотел избавляться от putty :-)

Cпасибо
Я не понял вопрос. А зачем вы открываете putty чтобы что-то сделать с базой данных. Есть же например библиотека MySql.Data, где можно все сделать, и соединиться, и команду любую выполнить. Или как?
 

lokiys

Moderator
Регистрация
01.02.2012
Сообщения
4 813
Благодарностей
1 188
Баллы
113
Я не понял вопрос. А зачем вы открываете putty чтобы что-то сделать с базой данных. Есть же например библиотека MySql.Data, где можно все сделать, и соединиться, и команду любую выполнить. Или как?
Mnje ochen trudno pisakj po ruski tak kak mnje netu ruskovo bukvah na klavish.

No SSL nuzno potomu shto Remote access u menja vikjochen, tak namnogo bezopasnje.
 

Лев

Client
Регистрация
09.12.2014
Сообщения
290
Благодарностей
273
Баллы
63
Странно, странно, где живете? =) Вот если б вы показали как вы это делаете, то можно было бы и подумать. А вообще в чем проблема то конкретно. Если вы говорите, что у вас все готово, только от putty надо избавиться, то скорее всего , того, что описано в этой статье вполне хватит, в чем может быть загвоздка то? Я только могу вам скинуть код, с помощью которого я с базой данных работаю. А во вторых, вы уж явно поумнее меня, так что сами разберетесь (я вообще ни разу ни программист=)).
 

lokiys

Moderator
Регистрация
01.02.2012
Сообщения
4 813
Благодарностей
1 188
Баллы
113
Странно, странно, где живете? =) Вот если б вы показали как вы это делаете, то можно было бы и подумать. А вообще в чем проблема то конкретно. Если вы говорите, что у вас все готово, только от putty надо избавиться, то скорее всего , того, что описано в этой статье вполне хватит, в чем может быть загвоздка то? Я только могу вам скинуть код, с помощью которого я с базой данных работаю. А во вторых, вы уж явно поумнее меня, так что сами разберетесь (я вообще ни разу ни программист=)).

Ja iz Latvia :-) I ja ta toze ne programist, ja
Jeslji tochno togda etot vobshe defaultnaja nastroika:


Jesho odjin primer kak vkljuchikj remote mysql shto ne ochenj to bezopasno: http://support.hostgator.com/articles/cpanel/how-to-connect-to-the-mysql-database-remotely
Tak shto ja budu probovakj s tvojim primerom i otpishus potom :-)

Sposibo
 

Лев

Client
Регистрация
09.12.2014
Сообщения
290
Благодарностей
273
Баллы
63
да сделаете без проблем =) я то всегда вторым, не очень то безопасным способ пользуюсь =) а о первом, безопасном, и не слышал, где вы его только откопали=)
 

Nick

Client
Регистрация
22.07.2014
Сообщения
1 984
Благодарностей
817
Баллы
113

nomarketing

Client
Регистрация
01.11.2013
Сообщения
911
Благодарностей
178
Баллы
43

Лев

Client
Регистрация
09.12.2014
Сообщения
290
Благодарностей
273
Баллы
63
А я вот не пойму, че вы все тот пиратский ресурс все пиарите? Ростоникс тоже молодец, прям развивает тот ресурс, здесь как будто нельзя было продать свои курсы)

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

Хотя им это не надо наверное, ну кто-нибудь из пользователей тогда=) А то я смотрю, там каждая вторая легальная тема - шаблон зеннопостер =)
 
Последнее редактирование модератором:
  • Спасибо
Реакции: Matros

Лев

Client
Регистрация
09.12.2014
Сообщения
290
Благодарностей
273
Баллы
63
Twitter

Для того, чтобы воспользоваться апи твитера, как и везде, необходимо сначала создать приложения. Для этого переходим по ссылке:
https://apps.twitter.com
Далее создаем приложение указав адрес сайт, название приложения и его описание.



Приложение создано, теперь переходим во вкладку keys и access token

Внизу нажимаем на Create acess_token

Все, теперь на этой странице у нас есть четыре ключа:
Consumer Key (API Key)
Consumer Secret (API Secret)
Access Token
Access Token Secret

Следующим шагом качаем библиотеку dll TweetinviAPI.dll (качаем ее из приложения к этому посту).

Добавляем эту библиотеку в GAC и добавляем директиву using

using Tweetinvi;

Благодаря этой библиотеке любой код будет в пару строчек.

Например, добавляем пост в аккаунт:

Код:
var creds = new Tweetinvi.Core.Credentials.TwitterCredentials("CONSUMER_KEY", "CONSUMER_SECRET", "ACCESS_TOKEN", "ACCESS_TOKEN_SECRET");
var tweet = Tweetinvi.Auth.ExecuteOperationWithCredentials(creds, () =>
{
      return Tweetinvi.Tweet.PublishTweet("Hello World");
  
});
Будет отправлен пост с текстом "Hello World"

А вот так просто добавить пост с картинкой:

Код:
var creds = new Tweetinvi.Core.Credentials.TwitterCredentials("CONSUMER_KEY", "CONSUMER_SECRET", "ACCESS_TOKEN", "ACCESS_TOKEN_SECRET");
var tweeter = Tweetinvi.Auth.ExecuteOperationWithCredentials(creds, () =>
{
      byte[] file1 = File.ReadAllBytes(@"C:\Путь_до_картинки.jpg");
var media = Upload.UploadImage(file1);

return Tweet.PublishTweetWithImage("Привет мир", file1);
 
});
Также Вы с помощью этой библиотеки легко сможете авторизовать другие аккаунты через это приложение, используя oauth авторизацию, и много-много всего еще. Но об этом я вам расскажу, когда посмотрю на результаты голосования :((
 

Вложения

Последнее редактирование:

Master Woo

Client
Регистрация
06.12.2014
Сообщения
122
Благодарностей
129
Баллы
43
почемуто при попытке установить соединение получаю ошибку

Код:
    21:34:57    Компиляция кода  Ошибка в действии "CS1002" "ожидалась ;". [Строка: -9; Cтолбец: 19]
для теста взят минимальный конфиг

Код:
SshClient sshClient = new SshClient("ip", 22, "root", "password");

sshClient.Connect();

return "ok";
вместо IP и пароля стоят соответсвующие значения

библиотека подключена
 

Лев

Client
Регистрация
09.12.2014
Сообщения
290
Благодарностей
273
Баллы
63
Может где-то есть еще один c# блок с ошибкой?, только если пришлете проект я могу посмотреть, а так даже не знаю. Может в директиве using не стоит где-то ; ?
 

Master Woo

Client
Регистрация
06.12.2014
Сообщения
122
Благодарностей
129
Баллы
43
Может где-то есть еще один c# блок с ошибкой?, только если пришлете проект я могу посмотреть, а так даже не знаю. Может в директиве using не стоит где-то ; ?
так блок то всего 1
дериктивы вроде все прописаны...
 

Вложения

  • 10,3 КБ Просмотры: 582

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 375
Благодарностей
2 041
Баллы
113
using Renci.SshNet; точку с запятой в конце поставь
 

Лев

Client
Регистрация
09.12.2014
Сообщения
290
Благодарностей
273
Баллы
63
Директивы using открываешь, и в конце надо поставить точку с запятой, вот так using Renci.SshNet;
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)