Добрый день.
Как уже отмечалось ранее, для автоматизации интерактивного общения с системой можно применять инструменты семейства 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
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?
Всего доброго.
Что такое качество программного обеспечения и как его улучшить: теория и практика, задачи и решения, подводные камни и обходные пути.
Автор комментария : Nicholas | October 24, 2011
http://stackoverflow.com/questions/305035/how-to-use-ssh-to-run-shell-script-on-a-remote-machine
вывод команд выполняемых на удалённой машине можно перенаправлять в файлы, а на досуге анализировать
[Ответить]
Автор комментария : Капитан | October 24, 2011
Nicholas, спасибо за комментарий.
Нет, plink – это не совсем то, что нужно. Не хватает интерактивности – той, что присутствует в описанном выше tst10.exe (ожидаешь определенную строку, посылаешь ответ, снова ждешь и т.д. – и все это в рамках одной сессии).
Конечно, таким образом можно попробовать запускать скрипт Expect, но хочется более удобное решение.
[Ответить]
Автор комментария : 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
[Ответить]
Автор комментария : Капитан | October 25, 2011
Nicholas,
Да, Expect и его клоны – известная тема. Когда-то я про это уже писал:
http://blog.openquality.ru/expect-introduction/
http://blog.openquality.ru/expect-children/
Но вот хочется без локальных бубнов, хоть тресни. Больше всего меня смущает отсутствие в Интернете широкого обсуждения такой возможности: то ли это никому не нужно, то ли есть технические трудности. Все не соберусь написать автору plink и спросить :)
Про псевдотерминалы почитаю, спасибо.
[Ответить]
Автор комментария : Kolosov | July 5, 2016
Также можно использовать пакетный клиент telnet Ctel http://helpform.ru/s0001
[Ответить]
Автор комментария : Капитан | July 5, 2016
Kolosov, спасибо!
[Ответить]