OpenQuality.ru

Качество программного обеспечения

Качество программного обеспечения: в главных ролях

Лента  Радар  Блог  Опыт  
Разум  Видео  Заметки  Эпизоды


Telnet Scripting Tool: автоматизация telnet-сессий

Добрый день.

Как уже отмечалось ранее, для автоматизации интерактивного общения с системой можно применять инструменты семейства Expect (раз, два). Ниже представлена еще одна полезная утилита, позволяющая с Windows-машины управлять telnet-сессией к удаленной системе по протоколу telnet. Пример такой системы: HP iLO. По умолчанию, в ней открыт только telnet-доступ, а возможность пользоваться ssh приобретается за отдельную плату. Другой пример: продукты Cisco, также позволяющие обращаться к себе по telnet, несмотря на очевидную незащищенность такого соединения.

Итак, утилита называется Telnet Scripting Tool 1.0 (tst10.exe) и лежит здесь. Она не единственная в своем роде, но довольно удобная в интеграции с другими инструментами.

Вот ее описание, выдаваемое при запуске без параметров:

Usage Syntax:

tst10.exe /r:script.txt [options]

/r:script.txt      run script.txt
[options]          any of these:

/o:output.txt      send session output to output.txt
/m                 run script in minimized window

Usage Example:

tst10.exe /r:script.txt /o:output.txt /m

Scripting Syntax:

HOSTNAME PORT      port number optional, default: 23
WAIT "string"      string to wait for
SEND "string"      string to send
\"                 represents the a quote character
\m                 represents a 
\\                 represents the backslash character

Scripting Example:

hostname.com 23
WAIT “login”
SEND “root\m”
WAIT “password”
SEND “mypassword\m”
WAIT “>”
SEND “dip internet.dip\m”
WAIT “>”

Scripting Note:

You can start with either WAIT or SEND commands, but you *must* alternate them. ie: you can’t use two or more WAIT or SEND in a row.

Note:

TST will disconnect and close as soon as its done with the last entry of the script.

If you need to, you can type in the terminal window while the script is running.

Рассмотрим такую задачу: для целей автотестирования нам нужно выполнять последовательность команд на удаленной системе (скажем, HP iLo). Последовательность команд может быть разной. Параметры команд также могут различаться. К примеру, нам нужно добавлять и удалять пользователя в той или иной системе и анализировать успешность операции.

Подготовим шаблоны для сессий добавления и удаления пользователя.

Файл create.template:

%Host% 23
WAIT "login"
SEND "%RunningUser%\m"
WAIT "password"
SEND "%RunningUserPassword%\m"
WAIT "MP>"
SEND "CM\m"
WAIT "CM>"
SEND "UC -new %NewUser% -user TestUser -rights e all -mode multiple -enable e -password %NewUserPassword%\m"
WAIT "Confirm?"
SEND "Y\m"
WAIT "Command successful"

Файл delete.template:

%Host% 23
WAIT "login"
SEND "%RunningUser%\m"
WAIT "password"
SEND "%RunningUserPassword%\m"
WAIT "MP>"
SEND "CM\m"
WAIT "CM>"
SEND "UC -delete %NewUser%\m"
WAIT "to delete this user?"
SEND "Y\m"
WAIT "Command successful"

Параметры в шаблонах будут заменяться на требуемые значения, получаемые из командной строки при запуске следующего скрипта (telnetsession.js):

// How to run:
// cscript /NoLogo .\telnetsession.js Command Host RunningUser RunningUserPassword <NewUser> <NewUserPassword>
// Example: 
// cscript /NoLogo .\telnetsession.js create 192.168.11.180 root P1n5e3R4s9 jdoe w34Rt8yU94d
 
 
 
/////////////// Get command line parameters ///////////////
 
 
var Args = WScript.Arguments;
 
var Command, Host, RunningUser, RunningUserPassword, NewUser, NewUserPassword   // cmdline parameters 0 through 5
var Parameters = "Host,RunningUser,RunningUserPassword,NewUser,NewUserPassword";
 
 
Command = Args(0);
Host = Args(1);
RunningUser = Args(2);
RunningUserPassword = Args(3);
 
 
// Some other commands may not require these parameters:
 
if ((Command == "create") || (Command == "delete"))  
{
	NewUser = Args(4);
}
 
if (Command == "create") 
{
	NewUserPassword = Args(5);
}
 
 
var ScriptTemplate = Command + ".template";
var ScriptScenario = Command + ".scenario"; 
var LogFile = "telnet_session.log";
 
 
/////////////// Prepare scenario for telnet session  /////////////// 
 
 
// Read script template into array
 
var mfso = new ActiveXObject("Scripting.FileSystemObject");           
var infile = mfso.OpenTextFile(ScriptTemplate);
var ScriptTemplateArray = new Array();
var arrayIndex = 0;
 
 
while (!infile.AtEndOfStream)
{
	instring = infile.ReadLine()
	ScriptTemplateArray[arrayIndex] = instring;
	arrayIndex++;
}
infile.Close();
 
 
// Replacement stuff
 
 
var ParametersArray = Parameters.split(",");
var ParameterInTemplate, ParameterInScenario, ParameterTmp;
 
var ParametersArrayLength=ParametersArray.length;
 
for(var i=0; i<ParametersArrayLength; i++)
{
 
	ParameterInTemplate = "%" + ParametersArray[i] + "%";
 
	ParameterInScenario=eval(ParametersArray[i]);
 
	for (var j=0;j<arrayIndex;j++)
	{
		if (ScriptTemplateArray[j].match(ParameterInTemplate))
		{
			ScriptTemplateArray[j]=ScriptTemplateArray[j].replace(ParameterInTemplate, ParameterInScenario)
		}
	}
}
 
/////////////// Create telnet scenario /////////////// 
 
var outfile = mfso.OpenTextFile(ScriptScenario,2,true);
 
for (var k=0;k<arrayIndex;k++) outfile.WriteLine(ScriptTemplateArray[k]);
 
outfile.Close();
 
 
///////////////  Run telnet session /////////////// 
 
var mshell = new ActiveXObject("WScript.Shell");
var RunStr = "tst10.exe /r:" + ScriptScenario + " /o:" + LogFile;
mshell.run(RunStr,1,true);
 
 
///////////////  Analyze log and exit with Return Code /////////////// 
 
var logfso = new ActiveXObject("Scripting.FileSystemObject");           
var logfile = logfso.OpenTextFile(LogFile);
var LogContent = logfile.ReadAll();
 
if (LogContent.match("Command successful"))
{
	WScript.Echo("Success");    
} else {
	WScript.Echo("Failure");   
}

Пример запуска:

D:\Work\Tst10\cscript /NoLogo .\telnetsession.js create 192.168.11.180 root P1n5e3R4s9 jdoe w34Rt8yU94d
Success
При выполнении скрипта параметры в соответствующем шаблоне заменяются на требуемые значения. В результате получается готовый сценарий для telnet-сессии (файл create.scenario):
192.168.11.180 23
WAIT "login"
SEND "root\m"
WAIT "password"
SEND "P1n5e3R4s9\m"
WAIT "MP>"
SEND "CM\m"
WAIT "CM>"
SEND "UC -new jdoe -user TestUser -rights e all -mode multiple -enable e -password w34Rt8yU94d\m"
WAIT "Confirm?"
SEND "Y\m"
WAIT "Command successful"

Этот сценарий используется при запуске tst10.exe. В логе telnet_session.log будет следующее:

 *************************************************************************
  This is a private system.
  Do not attempt to login unless you are an authorized user.
  Any authorized or unauthorized access or use may be monitored and can
  result in criminal or civil prosecution under applicable law.
 *************************************************************************

MP login: root
root

MP password: P1n5e3R4s9
**********


       Hewlett-Packard Integrated Lights-Out HP Integrity and HP 9000

    (c) Copyright Hewlett-Packard Company 1999-2004.  All Rights Reserved.

                           MP Host Name: mp00163545407c

                              Revision E.03.15

 *************************************************************************
                         MP ACCESS IS NOT SECURE
  Default MP users are currently configured and remote access is enabled.
  Modify default users passwords or delete default users (see UC command)
                                    OR
            Disable all types of remote access (see SA command)
 *************************************************************************

 *************************************************************************
                           Your Certificate is expired.
               Use the SO command to generate a new certificate.
 *************************************************************************

   MP MAIN MENU:

         CO: Console

        VFP: Virtual Front Panel

         CM: Command Menu

         CL: Console Log

         SL: Show Event Logs

         HE: Main Help Menu

          X: Exit Connection

[mp00163545407c] MP> CM
CM

	(Use Ctrl-B to return to MP main menu.)

[mp00163545407c] MP:CM> UC -new jdoe -user TestUser -rights e all -mode multiple -enable e -password w34Rt8yU94d
UC -new jdoe -user TestUser -rights e all -mode multiple -enable e -password w34Rt8yU94d

UC -new jdoe -user TestUser -rights e all -mode multiple -enable e -password w34Rt8yU94d

New User Parameters (* modified values):

   * User Login ID         : jdoe

   * User Password         : ************

   * User Name             : TestUser

     User Workgroup        : 

   * User Access Rights    : Console access, Power control, MP configuration, 

                             User administration

   * User Operating Mode   : Multiple

   * User Enabled/Disabled : Enabled 

     Modem Dial-back       : Disabled 

     Modem Dial-back Phone : 

   Confirm? (Y/[N]): Y
Y

Y

   -> User Configuration has been updated.

-> Command successful.

[mp00163545407c] MP:CM>

 

Вопрос в студию: существуют ли подобные инструменты для организации ssh-сессий? Что-нибудь наподобие plink, но с интерактивностью как в tst10.exe?

Всего доброго.

Отправить в Twitter, Facebook, FriendFeed, ВКонтакте | Опубликовано 24.10.2011 в рубрике "Инструменты"

Комментарии (6)

  1. Автор комментария : Nicholas | October 24, 2011

    http://stackoverflow.com/questions/305035/how-to-use-ssh-to-run-shell-script-on-a-remote-machine

    вывод команд выполняемых на удалённой машине можно перенаправлять в файлы, а на досуге анализировать

    [Ответить]


  2. Автор комментария : Капитан | October 24, 2011

    Nicholas, спасибо за комментарий.

    Нет, plink – это не совсем то, что нужно. Не хватает интерактивности – той, что присутствует в описанном выше tst10.exe (ожидаешь определенную строку, посылаешь ответ, снова ждешь и т.д. – и все это в рамках одной сессии).

    Конечно, таким образом можно попробовать запускать скрипт Expect, но хочется более удобное решение.

    [Ответить]


  3. Автор комментария : Nicholas | October 25, 2011

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

    ещё вроде как можно попробовать использовать pseudo-terminals http://rachid.koucha.free.fr/tech_corner/pty_pdip.html

    или без компиляции
    http://www.noah.org/wiki/pexpect

    http://www.opensourcetesting.org/functional.php
    Expect
    Description:
    Expect is a Unix automation and testing tool, for automating interactive applications such as telnet, ftp, passwd, fsck, rlogin, ssh, tip, etc. And by adding Tk, you can also wrap interactive applications in X11 GUIs.
    Requirement:
    Windows / UNIX
    Download data:
    No data feed available

    [Ответить]


  4. Автор комментария : Капитан | October 25, 2011

    Nicholas,

    Да, Expect и его клоны – известная тема. Когда-то я про это уже писал:

    http://blog.openquality.ru/expect-introduction/
    http://blog.openquality.ru/expect-children/

    Но вот хочется без локальных бубнов, хоть тресни. Больше всего меня смущает отсутствие в Интернете широкого обсуждения такой возможности: то ли это никому не нужно, то ли есть технические трудности. Все не соберусь написать автору plink и спросить :)

    Про псевдотерминалы почитаю, спасибо.

    [Ответить]


  5. Автор комментария : Kolosov | July 5, 2016

    Также можно использовать пакетный клиент telnet Ctel http://helpform.ru/s0001

    [Ответить]


  6. Автор комментария : Капитан | July 5, 2016

    Kolosov, спасибо!

    [Ответить]



Добавить комментарий

Пожалуйста, исправьте результат: дважды два равно



КРАТКОЕ СОДЕРЖАНИЕ

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


ПУТЕВОДИТЕЛЬ

Список всех статей с краткой аннотацией и разбивкой по рубрикам. Открыть карту.

ПОДПИСКА

Доступ к самым интересным материалам по электропочте и RSS. Подробности.

ИЩЕЙКА