Автоматическая настройка 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 согласно скриншотам ниже:
img-2015-11-09-15-22-18-png.10171


img-2015-11-09-15-26-40-png.10172


Итак, пол дела сделано. Как работать с данной библиотекой будет показано на конкретном примере, а именно, на примере установки панели 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@yandex.ru --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-} вы получаете ящики info1@vashdomen.ru, info2@vashdomen.ruи т.д.
{-Variable.pass-} - пароль для создаваемых ящиков

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

Ящики есть, теперь надо чтобы все заработало и доставлялось. В панели Vesta для домена на автомате создались DNS записи.
img-2015-11-09-16-44-49-png.10173

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

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

Код:
Развернуть Свернуть Копировать
user=admin&password=pass&cmd=v-list-dns-records&arg1=admin&arg2=hostname

В ответ вернется текст с dns записями. Далее регулярками расфасовываем данные по переменным и прописываем у регистратора.

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

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

img-2015-11-09-16-50-57-png.10174


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

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

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

img-2015-11-09-21-05-30-png.10175

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

На выходе получается два файла. В первом (create.txt) будут находится созданные почтовые ящики.
img-2015-11-09-21-08-28-png.10176

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

img-2015-11-09-19-54-53-png.10177

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

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

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

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

Вложения

  • img-2015-11-09-15-22-18.png
    img-2015-11-09-15-22-18.png
    28,8 KB · Просмотры: 8 146
  • img-2015-11-09-15-26-40.png
    img-2015-11-09-15-26-40.png
    34,4 KB · Просмотры: 8 002
  • img-2015-11-09-16-44-49.png
    img-2015-11-09-16-44-49.png
    33,7 KB · Просмотры: 7 742
  • img-2015-11-09-16-50-57.png
    img-2015-11-09-16-50-57.png
    28,3 KB · Просмотры: 7 880
  • img-2015-11-09-21-05-30.png
    img-2015-11-09-21-05-30.png
    20,3 KB · Просмотры: 7 815
  • img-2015-11-09-21-08-28.png
    img-2015-11-09-21-08-28.png
    6,5 KB · Просмотры: 7 743
  • img-2015-11-09-19-54-53.png
    img-2015-11-09-19-54-53.png
    15,3 KB · Просмотры: 7 801
  • vestamail.rar
    vestamail.rar
    187,3 KB · Просмотры: 1 688
5 балов из 5.
 
Спасибо как раз нужно было общение с серверов по ssh. Очень вовремя!
 
этот конкурс реально радует с первых статей :)
 
  • Спасибо
Реакции: angel737
можно ли получать последнее значение командной строки?
 
Раджаб, в этой статье основной упор не на ssh, а в том, что ты в один клик создашь почтовые ящики для рассылки.

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

Master Woo, я точно не знаю, там методов гора целая. Но последнюю строчку из ответа сервера при соединении через shellstream я смог получить, добавив перед Writeline строку
Код:
Развернуть Свернуть Копировать
StreamReader reader = new StreamReader(shellStream);
И после Expect
Код:
Развернуть Свернуть Копировать
string out = reader.ReadToEnd();
Ну и в конце return out, чтобы положить результат в переменную.
последняя строчка это хорошо, но часто бывает что вывод - несколько строк, вот тут хорошо было бы делать все выборку после введенной команды и уже на основе полученного результата включать логику...
но все равно спасибо, буду копать в эту сторону
 
Как то тихо с конкурсами, нету взрывающих "тем-бомб"
 
sekoan said:
Как то тихо с конкурсами, нету взрывающих "тем-бомб"
А какие темы по Вашему мнению могли бы "взорвать" конкурс?
Ну из предыдущего конкурса, инстограм, вконтакте, буржуйский трафик и т д)
 
Ну из предыдущего конкурса, инстограм, вконтакте, буржуйский трафик и т д)
Ну тоже спорно, все темы что вы перечислили именно заработок. А такого плана темы именно показывают и другие способы применение зенки + если подумать и в этой теме можно заработать;-)
 
Ну тоже спорно, все темы что вы перечислили именно заработок. А такого плана темы именно показывают и другие способы применение зенки + если подумать и в этой теме можно заработать;-)
Большинство людей хотят кнопку бабло:) Думать же практически никто не хочет.
 
Ну никто просто так это не спалит, нужно самим её создавать, зенка хороший инструмент для этого
 
  • Спасибо
Реакции: APXOHT
Автору 5 баллов из 5! Как раз хотел через научиться через ssh ставить весту с помощью зеньки! Автор это не вы случаем на складчике эту тему по автоматизации создания smtp серверов и поднятия прокси продаете? )))
 
  • Спасибо
Реакции: Nick
Mогу я использовать это библиотеку, чтобы подключиться к удаленную mysql. ? Теперь я использую putty.exe для подключения к серверу через SSH, И тогда я использую C # для подключения к MySQL.
хотел избавляться от putty :-)

Cпасибо
 
Mогу я использовать это библиотеку, чтобы подключиться к удаленную mysql. ? Теперь я использую putty.exe для подключения к серверу через SSH, И тогда я использую C # для подключения к MySQL.
хотел избавляться от putty :-)

Cпасибо
Я не понял вопрос. А зачем вы открываете putty чтобы что-то сделать с базой данных. Есть же например библиотека MySql.Data, где можно все сделать, и соединиться, и команду любую выполнить. Или как?
 
Я не понял вопрос. А зачем вы открываете 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.
 
Странно, странно, где живете? =) Вот если б вы показали как вы это делаете, то можно было бы и подумать. А вообще в чем проблема то конкретно. Если вы говорите, что у вас все готово, только от putty надо избавиться, то скорее всего , того, что описано в этой статье вполне хватит, в чем может быть загвоздка то? Я только могу вам скинуть код, с помощью которого я с базой данных работаю. А во вторых, вы уж явно поумнее меня, так что сами разберетесь (я вообще ни разу ни программист=)).
 
Странно, странно, где живете? =) Вот если б вы показали как вы это делаете, то можно было бы и подумать. А вообще в чем проблема то конкретно. Если вы говорите, что у вас все готово, только от putty надо избавиться, то скорее всего , того, что описано в этой статье вполне хватит, в чем может быть загвоздка то? Я только могу вам скинуть код, с помощью которого я с базой данных работаю. А во вторых, вы уж явно поумнее меня, так что сами разберетесь (я вообще ни разу ни программист=)).


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


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
 
да сделаете без проблем =) я то всегда вторым, не очень то безопасным способ пользуюсь =) а о первом, безопасном, и не слышал, где вы его только откопали=)
 
А я вот не пойму, че вы все тот пиратский ресурс все пиарите? Ростоникс тоже молодец, прям развивает тот ресурс, здесь как будто нельзя было продать свои курсы)

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

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

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

img-2015-12-10-20-35-02-png.10647


Приложение создано, теперь переходим во вкладку keys и access token
img-2015-12-10-20-37-25-png.10648

Внизу нажимаем на Create acess_token
img-2015-12-10-20-37-48-png.10649

Все, теперь на этой странице у нас есть четыре ключа:
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 авторизацию, и много-много всего еще. Но об этом я вам расскажу, когда посмотрю на результаты голосования :((
 

Вложения

  • img-2015-12-10-20-35-02.png
    img-2015-12-10-20-35-02.png
    46,3 KB · Просмотры: 6 447
  • img-2015-12-10-20-37-25.png
    img-2015-12-10-20-37-25.png
    35,3 KB · Просмотры: 6 464
  • img-2015-12-10-20-37-48.png
    img-2015-12-10-20-37-48.png
    19,1 KB · Просмотры: 6 429
  • TweetinviAPI.rar
    TweetinviAPI.rar
    446,5 KB · Просмотры: 676
Последнее редактирование:
почемуто при попытке установить соединение получаю ошибку

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

для теста взят минимальный конфиг

Код:
Развернуть Свернуть Копировать
SshClient sshClient = new SshClient("ip", 22, "root", "password");

sshClient.Connect();

return "ok";

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

библиотека подключена
 
Может где-то есть еще один c# блок с ошибкой?, только если пришлете проект я могу посмотреть, а так даже не знаю. Может в директиве using не стоит где-то ; ?
 
Может где-то есть еще один c# блок с ошибкой?, только если пришлете проект я могу посмотреть, а так даже не знаю. Может в директиве using не стоит где-то ; ?
так блок то всего 1
дериктивы вроде все прописаны...
 

Вложения

  • ssh.xmlz
    ssh.xmlz
    10,3 KB · Просмотры: 689
using Renci.SshNet; точку с запятой в конце поставь
 
Директивы using открываешь, и в конце надо поставить точку с запятой, вот так using Renci.SshNet;
 

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