kelso

Expect with AutoIt?

25 posts in this topic

Hi,

 

I wrote a script to launch putty as telnet and connect with user\password, it works, but the challenge I am facing now is how to limit the script to only continue once the following message appears in putty "login:" :

Welcome to Microsoft Telnet Service

login:

tJkocTb.png

The script:

 

#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Outfile=test_cmd2.exe
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
;Global $ip
$ip = $CmdLine[1]
$username = $CmdLine[2]
$pwd = $CmdLine[3]
$port = ':23'

Run(@ScriptFullPath, 'c:\putty\putty.exe telnet://' & $ip & $port)
;Run(@ScriptFullPath &'c:\putty\putty.exe telnet://' & $ip & $port)
WinWait($ip & " - PuTTY")
; how do I add only continue if 'Login:' appears?
ControlSend($ip & " - PuTTY", "", "", $username & "{ENTER}")
ControlSend($ip & " - PuTTY", "", "", $pwd & "{ENTER}")

I tried to extract information I can use with autoIt windows info, but no luck for the cmd output.

 

Thanks!

Share this post


Link to post
Share on other sites



Set the opt_flag of the Run function to $STDOUT_CHILD. Then use StdoutRead to process the displayed lines.

1 person likes this

My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2017-04-18 - Version 1.4.8.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (NEW 2017-02-27 - Version 1.3.1.0) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2015-04-01 - Version 0.4.0.0) - Download - General Help & Support - Example Scripts
Excel - Example Scripts - Wiki
Word - Wiki
PowerPoint (2015-06-06 - Version 0.0.5.0) - Download - General Help & Support

Tutorials:
ADO - Wiki

 

Share this post


Link to post
Share on other sites

#3 ·  Posted (edited)

35 minutes ago, water said:

Set the opt_flag of the Run function to $STDOUT_CHILD. Then use StdoutRead to process the displayed lines.

Thank you.

 

I am clearly doing something wrong.

this works:

#include <constants.au3>


$ip = '192.168.1.11'
$username = 'telnet'
$pwd = 'Aa123456'
$port = ':23'

Run(@ScriptDir &'\putty.exe telnet://' & $ip & $port)
WinWait($ip & " - PuTTY")
ControlSend($ip & " - PuTTY", "", "", $username & "{ENTER}")
ControlSend($ip & " - PuTTY", "", "", $pwd & "{ENTER}")

this doesnt:

 

#include <constants.au3>


$ip = '192.168.1.11'
$username = 'telnet'
$pwd = 'Aa123456'
$port = ':23'

Run(@ScriptDir &'\putty.exe telnet://' & $ip & $port, "","", $STDOUT_CHILD)
WinWait($ip & " - PuTTY")
ControlSend($ip & " - PuTTY", "", "", $username & "{ENTER}")
ControlSend($ip & " - PuTTY", "", "", $pwd & "{ENTER}")

I see that it opens task for putty.exe, but nothing is displayed on my screen.

also, how do I print everything $STDOUT_CHILD get, to make sure it is capturing it all?

 

Thanks again

Edited by kelso

Share this post


Link to post
Share on other sites

First:
Should be

Run(@ScriptDir & '\putty.exe telnet://' & $ip & $port, "", Default, $STDOUT_CHILD)


Second:
Use StdInWrite to send data to Telnet.


My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2017-04-18 - Version 1.4.8.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (NEW 2017-02-27 - Version 1.3.1.0) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2015-04-01 - Version 0.4.0.0) - Download - General Help & Support - Example Scripts
Excel - Example Scripts - Wiki
Word - Wiki
PowerPoint (2015-06-06 - Version 0.0.5.0) - Download - General Help & Support

Tutorials:
ADO - Wiki

 

Share this post


Link to post
Share on other sites
1 hour ago, water said:

First:
Should be

Run(@ScriptDir & '\putty.exe telnet://' & $ip & $port, "", Default, $STDOUT_CHILD)


Second:
Use StdInWrite to send data to Telnet.

it seems like $stdout_child is basically returning the PID of the executable whiten the run command.

I still fail to understand how will it log the data that is in the console?

also, is there a way to sample it and make sure it does capture every txt from putty.exe?

Local $process=Run(@ScriptDir & '\putty.exe telnet://' & $ip & $port, "", Default, $STDOUT_CHILD)
MsgBox(0, "data", $process)

 

 

 

Share this post


Link to post
Share on other sites

As I said in post #3 use StdoutRead to retrieve the output of putty.


My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2017-04-18 - Version 1.4.8.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (NEW 2017-02-27 - Version 1.3.1.0) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2015-04-01 - Version 0.4.0.0) - Download - General Help & Support - Example Scripts
Excel - Example Scripts - Wiki
Word - Wiki
PowerPoint (2015-06-06 - Version 0.0.5.0) - Download - General Help & Support

Tutorials:
ADO - Wiki

 

Share this post


Link to post
Share on other sites
45 minutes ago, water said:

As I said in post #3 use StdoutRead to retrieve the output of putty.

TRaDZMb.png

 

I would assume that it will log the highlighted part and print it in autoit editor no? it doesnt.

 

When I switch to ipconfig, it works:

local $out
;
$rslt = Run(@ComSpec & " /c netstat -an ", @SystemDir, @SW_HIDE, $STDERR_MERGED + $STDOUT_CHILD)
While 1
   $out = StdoutRead($rslt)
   If @error then exitloop
   if stringlen($out) > 0 then consolewrite($out & @lf)
WEnd

 

thoughts?

 

Share this post


Link to post
Share on other sites
2 hours ago, kelso said:

 

local $out
;
$rslt = Run(@ComSpec & " /c netstat -an ", @SystemDir, @SW_HIDE, $STDERR_MERGED + $STDOUT_CHILD)
While 1
   $out = StdoutRead($rslt)
   If @error then exitloop
   if stringlen($out) > 0 then consolewrite($out & @lf)
WEnd

 

thoughts?

 

Try this:
$STDOUT_CHILD + $STDERR_CHILD
And read the output like this:

While ProcessExists($cPID)
        $stdError = StderrRead($cPID)
        $stdOut &= StdoutRead($cPID)
WEnd
ConsoleWrite($stdOut&@CRLF)

Regards
Alien.

Share this post


Link to post
Share on other sites
6 minutes ago, alien4u said:

Try this:
$STDOUT_CHILD + $STDERR_CHILD
And read the output like this:

While ProcessExists($cPID)
        $stdError = StderrRead($cPID)
        $stdOut &= StdoutRead($cPID)
WEnd
ConsoleWrite($stdOut&@CRLF)

Regards
Alien.

Hi Alien,

 

Thanks for the response.

This is what I used:

 

#include <Constants.au3>

$cPID = Run(@ScriptDir &'\putty.exe telnet://192.168.1.11:23' , @SystemDir, $STDOUT_CHILD + $STDERR_CHILD)
While ProcessExists($cPID)
        $stdError = StderrRead($cPID)
        $stdOut &= StdoutRead($cPID)
WEnd
ConsoleWrite($stdOut&@CRLF)

I get:

"C:\putty\1\a.au3" (6) : ==> Variable used without being declared.:
$stdOut &= StdoutRead($cPID)
^ ERROR

 

What am I missing?

Share this post


Link to post
Share on other sites

HH7gbyi.png

it runs, I login enter, run help output shows up in putty, but nothing in my autoit, why?

Share this post


Link to post
Share on other sites

I am willing to pay for a quick session if something is willing to call/join go to meeting.

 

tHanks.

Share this post


Link to post
Share on other sites
1 hour ago, kelso said:

Hi Alien,

 

Thanks for the response.

This is what I used:

 

#include <Constants.au3>

$cPID = Run(@ScriptDir &'\putty.exe telnet://192.168.1.11:23' , @SystemDir, $STDOUT_CHILD + $STDERR_CHILD)
$stdOut = ""
While ProcessExists($cPID)
        $stdError = StderrRead($cPID)
        $stdOut &= StdoutRead($cPID)
WEnd
ConsoleWrite($stdOut&@CRLF)

I get:

"C:\putty\1\a.au3" (6) : ==> Variable used without being declared.:
$stdOut &= StdoutRead($cPID)
^ ERROR

 

What am I missing?

Just declare the variable first...like this:
 

#include <Constants.au3>
$cPID = Run(@ScriptDir &'\putty.exe telnet://192.168.1.11:23' , @SystemDir, $STDOUT_CHILD + $STDERR_CHILD)
$stdOut = ""
While ProcessExists($cPID)
        $stdError = StderrRead($cPID)
        $stdOut &= StdoutRead($cPID)
WEnd
ConsoleWrite($stdOut&@CRLF)

Don't pay... learn...

Regards
Alien.

Share this post


Link to post
Share on other sites
1 hour ago, alien4u said:

Just declare the variable first...like this:
 

#include <Constants.au3>
$cPID = Run(@ScriptDir &'\putty.exe telnet://192.168.1.11:23' , @SystemDir, $STDOUT_CHILD + $STDERR_CHILD)
$stdOut = ""
While ProcessExists($cPID)
        $stdError = StderrRead($cPID)
        $stdOut &= StdoutRead($cPID)
WEnd
ConsoleWrite($stdOut&@CRLF)

Don't pay... learn...

Regards
Alien.

Thank you for your continues help.

Here is where  I am at:

wSqxTpP.png

 

it runs, putty starts, I enter user name + password, authentication successful

then I click help to generate output within putty, but still don't see that in the console\editor (see above screenshot)

thoughts? 

Share this post


Link to post
Share on other sites

If you read the help file for the Function Run() you will notice:
Run ( "program" [, "workingdir" [, show_flag [, opt_flag]]] )

This mean your command should be:

Run(@ScriptDir &'\putty.exe telnet://192.168.1.11:23', @SystemDir, @SW_MAXIMIZE, $STDOUT_CHILD + $STDERR_CHILD)

You where missing a parameter needed by Run(). show_flag.

Regards
Alien.

Share this post


Link to post
Share on other sites
36 minutes ago, alien4u said:

If you read the help file for the Function Run() you will notice:
Run ( "program" [, "workingdir" [, show_flag [, opt_flag]]] )

This mean your command should be:

Run(@ScriptDir &'\putty.exe telnet://192.168.1.11:23', @SystemDir, @SW_MAXIMIZE, $STDOUT_CHILD + $STDERR_CHILD)

You where missing a parameter needed by Run(). show_flag.

Regards
Alien.

Thank you again my friend, but the result is still the same, this time with maximize screen.

 

#include <Constants.au3>
$cPID = Run(@ScriptDir &'\putty.exe telnet://192.168.1.11:23', @SystemDir, @SW_MAXIMIZE, $STDOUT_CHILD + $STDERR_CHILD)
$stdOut = ""
While ProcessExists($cPID)
        $stdError = StderrRead($cPID)
        $stdOut &= StdoutRead($cPID)
WEnd
ConsoleWrite($stdOut&@CRLF)

It runs well, but it doesnt log the output that I highlighted in the screenshot to the editor, how can I base my next actions on the output it gets to continue my script without it?

KFyc2Tw.png

 

I am looking to continue the script based on responses I get from the telnet, such as:

if "login:" enter username

if "password:" enter password

if "Enter the new time: quit

etc.

 

Thank you again, I really appreciate your help

 

Share this post


Link to post
Share on other sites

What about this:
 

Run(@ComSpec & " /k " & @ScriptDir &'\putty.exe telnet://192.168.1.11:23', "", @SW_MAXIMIZE, $STDOUT_CHILD + $STDERR_CHILD)

If this does not work for you then you should use plink that is putty command line tool.

Regards
Alien.

Share this post


Link to post
Share on other sites

As I stated in post #4 use StdInWrite to send data (Your login etc.) to Putty. I'm not sure you can mix a script accessing StdIn/StdOut/StdErr and Console input.


My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2017-04-18 - Version 1.4.8.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (NEW 2017-02-27 - Version 1.3.1.0) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2015-04-01 - Version 0.4.0.0) - Download - General Help & Support - Example Scripts
Excel - Example Scripts - Wiki
Word - Wiki
PowerPoint (2015-06-06 - Version 0.0.5.0) - Download - General Help & Support

Tutorials:
ADO - Wiki

 

Share this post


Link to post
Share on other sites
11 hours ago, alien4u said:

What about this:
 

Run(@ComSpec & " /k " & @ScriptDir &'\putty.exe telnet://192.168.1.11:23', "", @SW_MAXIMIZE, $STDOUT_CHILD + $STDERR_CHILD)

If this does not work for you then you should use plink that is putty command line tool.

Regards
Alien.

I get the output with plink:

#include <Constants.au3>
$cPID = Run(@ComSpec & " /k " & @ScriptDir &'\plink.exe -telnet telnet@192.168.1.11', "", @SW_MAXIMIZE, $STDOUT_CHILD + $STDERR_CHILD)
$stdOut = ""
While ProcessExists($cPID)
        $stdError = StderrRead($cPID)
        $stdOut &= StdoutRead($cPID)
WEnd
ConsoleWrite($stdOut&@CRLF)

I get in the console:

--> Press Ctrl+Alt+Break to Restart or Ctrl+Break to Stop
Welcome to Microsoft Telnet Service 

password: 
C:\putty\1>

 

which is great, but two questions:

1) the plink window shows up and disappear really quick, why doesn't it stay on the password: until further instructions?

2) ok, now I got the output to the terminal, which functions do I use to base my actions upon that output?

 

if "password:" 

write in console 123456 {ENTER}

something like that.

 

Thanks!

 

Share this post


Link to post
Share on other sites

What did I write in post #4 and #17? Do you read what people post here :poke:


My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2017-04-18 - Version 1.4.8.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (NEW 2017-02-27 - Version 1.3.1.0) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2015-04-01 - Version 0.4.0.0) - Download - General Help & Support - Example Scripts
Excel - Example Scripts - Wiki
Word - Wiki
PowerPoint (2015-06-06 - Version 0.0.5.0) - Download - General Help & Support

Tutorials:
ADO - Wiki

 

Share this post


Link to post
Share on other sites
7 minutes ago, water said:

What did I write in post #4 and #17? Do you read what people post here :poke:

Thanks water. this explains how I continue to interact with the terminal, but why does the window disappear? any ideas?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now