megatron Posted May 4, 2007 Posted May 4, 2007 Summary of problem: Script runs plink (SSH command line tool) to connect to a network device, in some cases the network device will display a warning like: "you do not have the certificate cached in the registry, add to registry? (y/n)" --- This output appears from the error output, therefore can be read from StderrRead. However StderrRead will pase the program UNTIL it has some input, which, in this instance is unhelpful as I want to take action if no input is given from the error... Code: $stream = Run(@comspec & " /k c:\plink.exe " & $hostname & " -pw xxxxx -l * -ssh ",'',$STDIN_CHILD + $STDOUT_CHILD + $STDERR_CHILD) $output = $OUT = StderrRead($stream) If $output = "you do not have the certificate cached in the registry, add to registry?" Then Do XXXXXX Else Do XXXXXX .................................................................................................... ..................................... I have tried setting the "peak" option, but it doesn't appear to help me, I'm sure i'm being dumb here; any advice would be greatly appreciated. Cheers
arcker Posted May 4, 2007 Posted May 4, 2007 (edited) really interesting your command line tool, but are you sure that it works as good as Putty ? can you post you current script i would like to test your work because it's really interesting Edited May 4, 2007 by arcker -- Arck System _ Soon -- Ideas make everything "La critique est facile, l'art est difficile" Projects :[list] [*]Au3Service : Run your exe as service V3 / Updated 29/07/2013 Get it Here [/list]
megatron Posted May 4, 2007 Author Posted May 4, 2007 really interesting your command line tool, but are you sure that it works as good as Putty ?can you post you current script i would like to test your work because it's really interestingThanks for your interest, I am a network administrator and have written a fair few scripts to do various things, backups, audits, firmware updates, security checks, I would be happy to send you a copy of the script once it's working The most robust way I have scripted this type of thing is via telnet, you can make a TCP connection to devices which is very robust indeed (never fails). the scripts look through ini files and connect to all the devices in turn, perform a set of commands and log out. Really vey simple, I just hope I can get this StderrRead thing to work, some boffin out there will be able to help me i'm sure
megatron Posted May 4, 2007 Author Posted May 4, 2007 Oh BTW plink.exe is the command line version of putty
arcker Posted May 4, 2007 Posted May 4, 2007 ok post your current work and i will try to help you i've always search a command line utility as putty, but i've never heard plink...ARGH ! i wait for your script and i will help you -- Arck System _ Soon -- Ideas make everything "La critique est facile, l'art est difficile" Projects :[list] [*]Au3Service : Run your exe as service V3 / Updated 29/07/2013 Get it Here [/list]
megatron Posted May 4, 2007 Author Posted May 4, 2007 ok post your current work and i will try to help you i've always search a command line utility as putty, but i've never heard plink...ARGH ! i wait for your script and i will help you expandcollapse popup#include <Constants.au3> ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Script to conect via SSH to remote devices, download a backup image via TFTP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; $numswitches = IniRead( "C:\myfile1.ini", "Switches", "Count", "0" ) for $x = 0 to $numswitches $hostname = IniRead( "C:\myfile1.ini", "Switches", ( "Switch" & $x ) , "0" ) Dim $szIPADDRESS = TCPNameToIP($hostname) $stream = Run(@comspec & " /k c:\plink.exe " & $hostname & " -pw password -l * -ssh ",'',$STDIN_CHILD + $STDERR_CHILD) $OUT = StderrRead($stream) If $OUT = "The server's host key is not cached in the registry*" Then Sleep(200) StdinWrite($stream, @CRLF) Sleep(200) StdinWrite($stream, "copy startup-config tftp " & @IPAddress1 & " " & $hostname & "_" & @MDAY & "." & @mon & "." & @YEAR & @LF) Sleep(2000) StdinWrite($stream, "logout" & @CRLF) Sleep(1200) StdinWrite($stream, "y") Sleep(1200) StdinWrite($stream, "y") Sleep(1500) ProcessClose($stream) Sleep(1500) Else StdinWrite($stream,"y" & @CRLF) Sleep(200) StdinWrite($stream, @CRLF) Sleep(200) StdinWrite($stream, "copy startup-config tftp " & @IPAddress1 & " " & $hostname & "_" & @MDAY & "." & @mon & "." & @YEAR & @LF) Sleep(2000) StdinWrite($stream, "logout" & @CRLF) Sleep(1200) StdinWrite($stream, "y") Sleep(1200) StdinWrite($stream, "y") Sleep(1500) ProcessClose($stream) Sleep(500) EndIf next
arcker Posted May 4, 2007 Posted May 4, 2007 ouch really difficult because you try to send some commands with some sleep i would start with cmd /c instead of /k, because /k don't return anything (it's is feature) you can after get the output, and make somes cases, like tcprecv does ! i'm sure it's possible btw, do you know if it's possible to disable the sound of plink ? i hate those pc speakers sounds ! -- Arck System _ Soon -- Ideas make everything "La critique est facile, l'art est difficile" Projects :[list] [*]Au3Service : Run your exe as service V3 / Updated 29/07/2013 Get it Here [/list]
megatron Posted May 4, 2007 Author Posted May 4, 2007 ouch really difficult because you try to send some commands with some sleepi would start with cmd /c instead of /k, because /k don't return anything (it's is feature)you can after get the output, and make somes cases, like tcprecv does !i'm sure it's possiblebtw, do you know if it's possible to disable the sound of plink ? i hate those pc speakers sounds !Ahh that's something to try, thanks for that... I iwll keep you posted. As for the pc speaker sounds, no idea - on my system I don't hear anything.
megatron Posted May 4, 2007 Author Posted May 4, 2007 OK, an update: After further testing it appears that none of the measures have helped the problem is this: sometimes you need to take action based on the STDERR, however, if there is no error then the function StderrRead will halt execution of the script. You can't just say: IF (the error output = x) Then (do y) --- because if there is no error to read (which in some cases there won't be) then you just get paused until there is. If anyone can help I would be most appreciative.
PsaltyDS Posted May 4, 2007 Posted May 4, 2007 (edited) It doesn't work because you have no loop to read the streams. The return from Run() is process ID. Microseconds after you kick it off you do ONE read of STDERR and act on it. There probably hasn't been time for anything to happen yet. You need a loop to read the streams you are interested in:$PID = Run($YourCommandLine, '', @SW_SHOW, $STDIN_CHILD + $STDOUT_CHILD + $STDERR_CHILD) DIM $sSTDOUT = "", $sSTDERR = "" Do $sSTDOUT &= StdoutRead($PID) $sSTDERR &= StderrRead($PID) _FuncToActOnOutput() Sleep(20) Until Not ProcessExists($PID)Notice the use of the '&=' operator to assemble the output streams into complete strings... Edit: Forgot to include $STDOUT_CHILD in example Run() function...Edit2: Sigh... Also didn't include show flag before IO... :"> Edited May 4, 2007 by PsaltyDS Valuater's AutoIt 1-2-3, Class... Is now in Session!For those who want somebody to write the script for them: RentACoder"Any technology distinguishable from magic is insufficiently advanced." -- Geek's corollary to Clarke's law
megatron Posted May 4, 2007 Author Posted May 4, 2007 It doesn't work because you have no loop to read the streams. The return from Run() is process ID. Microseconds after you kick it off you do ONE read of STDERR and act on it. There probably hasn't been time for anything to happen yet. You need a loop to read the streams you are interested in: $PID = Run($YourCommandLine, '', $STDIN_CHILD + $STDERR_CHILD) DIM $sSTDOUT = "", $sSTDERR = "" Do $sSTDOUT &= StdoutRead($PID) $sSTDERR &= StderrRead($PID) _FuncToActOnOutput() Sleep(20) Until Not ProcessExists($PID) Notice the use of the '&=' operator to assemble the output streams into complete strings... YEAHHHHHH, Man thank you so much - I knew it was somehting like this, but i'm a noob with programming concepts
arcker Posted May 4, 2007 Posted May 4, 2007 strange i've anything from output does it work for you ? -- Arck System _ Soon -- Ideas make everything "La critique est facile, l'art est difficile" Projects :[list] [*]Au3Service : Run your exe as service V3 / Updated 29/07/2013 Get it Here [/list]
PsaltyDS Posted May 4, 2007 Posted May 4, 2007 (edited) strange i've anything from outputdoes it work for you ?I didn't format the Run() function correctly in my original post. Make sure you have CommandLine, WorkingDir, ShowFlag, IOFlags. :"> Edited May 4, 2007 by PsaltyDS Valuater's AutoIt 1-2-3, Class... Is now in Session!For those who want somebody to write the script for them: RentACoder"Any technology distinguishable from magic is insufficiently advanced." -- Geek's corollary to Clarke's law
megatron Posted May 4, 2007 Author Posted May 4, 2007 I will be back at work on Tuesday and will give this a shot, thanks again, I'm kinda knew I needed to have the functions in a loop - but never having been trained to program it's a new concept for me. cheers
arcker Posted May 6, 2007 Posted May 6, 2007 (edited) thx to you for learn ms (maybe us) that we can develop some script to manage our unix/aix/linux servers from windows BTW, i wait for your example and i'll try it as soon as possible omg, i've forgotten the show flag too....tssss Edited May 6, 2007 by arcker -- Arck System _ Soon -- Ideas make everything "La critique est facile, l'art est difficile" Projects :[list] [*]Au3Service : Run your exe as service V3 / Updated 29/07/2013 Get it Here [/list]
PsaltyDS Posted May 7, 2007 Posted May 7, 2007 ...we can develop some script to manage our unix/aix/linux servers from windows.Eww! Isn't that a bit like managing your French cuisine from a McDonald's grill? Valuater's AutoIt 1-2-3, Class... Is now in Session!For those who want somebody to write the script for them: RentACoder"Any technology distinguishable from magic is insufficiently advanced." -- Geek's corollary to Clarke's law
megatron Posted May 8, 2007 Author Posted May 8, 2007 (edited) OK update: It still doesn't work, because; the StderrRead and StdoutRead functions will pause proggy execution until there is some data. Which is fine in itself, but given that for me, in some cases there will be data for StdError not StdOut and vice verse I can't see a way of making it work all the time that these functions pause the script until they have data. Edited May 8, 2007 by megatron
PsaltyDS Posted May 8, 2007 Posted May 8, 2007 Tweaked to be non-blocking by checking with 'peek' that there are characters to read before doing so: $PID = Run($YourCommandLine, '', @SW_SHOW, $STDIN_CHILD + $STDOUT_CHILD + $STDERR_CHILD) DIM $sSTDOUT = "", $sSTDERR = "" Do If StdoutRead($PID, 0, True) Then $sSTDOUT &= StdoutRead($PID) If StderrRead($PID, 0, True) Then $sSTDERR &= StderrRead($PID) _FuncToActOnOutput() Sleep(20) Until Not ProcessExists($PID) Valuater's AutoIt 1-2-3, Class... Is now in Session!For those who want somebody to write the script for them: RentACoder"Any technology distinguishable from magic is insufficiently advanced." -- Geek's corollary to Clarke's law
megatron Posted May 8, 2007 Author Posted May 8, 2007 Tweaked to be non-blocking by checking with 'peek' that there are characters to read before doing so: $PID = Run($YourCommandLine, '', @SW_SHOW, $STDIN_CHILD + $STDOUT_CHILD + $STDERR_CHILD) DIM $sSTDOUT = "", $sSTDERR = "" Do If StdoutRead($PID, 0, True) Then $sSTDOUT &= StdoutRead($PID) If StderrRead($PID, 0, True) Then $sSTDERR &= StderrRead($PID) _FuncToActOnOutput() Sleep(20) Until Not ProcessExists($PID) Ahh it makes sense!! - and it's starting to work in production with the correct sleep(xxx) inserted. I will post the fll code up when it's done. PsaltyDS - Thanks so much for your help on this, it's just great to be able to ask questions on here and have them answered in such a way, you couldn't pay for a better service.
arcker Posted May 8, 2007 Posted May 8, 2007 Isn't that a bit like managing your French cuisine from a McDonald's grill?ohh yes it was an imagebut sometimes for recurrent information retrieval (like cpu) it's really boring to log on by putty, enter user/pass and execute a commandthis open up some ways, that's just what i wanted to say -- Arck System _ Soon -- Ideas make everything "La critique est facile, l'art est difficile" Projects :[list] [*]Au3Service : Run your exe as service V3 / Updated 29/07/2013 Get it Here [/list]
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now