I've written something like this a few years ago. I don't advertise this any
longer, you can have a free copy or parts of the code if you wish.
Description is on http://homepages.fh-giessen.de/~hg12799
Contact me out of the list.
GetCmd below get's the position of a command within a script. I parse a
script line by line and when a command (html like in <> brackets) is the
next part of the line, DoCmd is called which executes the command.
I think you can exchange or add the string you wish to respond to in getcmd,
so just add a command without brackets if what you want is to just respnd to
a command line from the terminal.
Looking back, it's propably the worst spaghetti code I've ever written ;-).
But it's surprisingly still working ok in the environment I've written it
for (backup of about 150 network devices several times a day and recovery)
Benjamin Stadin
function TBenScript.GetCmdPos(LineString: String): Integer; // Führt
Kommando aus und liefert StringPosition des Kommandos
var CmdPos: Integer; // erstes Kommando in Zeile
ThisPos: Integer; // aktuelle geparsetes Kommando
// FirstCommand parsed welches abgeklapperte Kommando das erste ist
begin
CmdPos := 0; // Kein Vorgängerwert von Pos = logisch 0 für Result
FirstCommand := '';
NoReturn := False;
CmdLength := 0;
if Pos('<TELNET>',Uppercase(LineString)) > 0 then begin
CmdPos := Pos('<TELNET>',Uppercase(LineString));
FirstCommand := '<TELNET>';
NoReturn := True; // NoReturn = dieser befehl braucht keinen return,
wird aus scriptline entfernt
end;
if Pos('<WAIT>',Uppercase(LineString)) > 0 then begin
CmdPos := Pos('<WAIT>',Uppercase(LineString));
FirstCommand := '<WAIT>';
NoReturn := True;
end;
if Pos('<LINESTOFILE',Uppercase(LineString)) > 0 then begin
CmdPos := Pos('<LINESTOFILE',Uppercase(LineString));
CmdLength := Pos('>',ScriptLine);
FirstCommand := '<LINESTOFILE';
NoReturn := True;
end;
if Pos('</LINESTOFILE>',Uppercase(LineString)) > 0 then begin
CmdPos := Pos('</LINESTOFILE>',Uppercase(LineString));
FirstCommand := '</LINESTOFILE>';
hauptform.telnet.WriteStr(RetSeq);
// NoReturn := True;
// hier nicht, weil emulvt erst nach zeichenübergabe FSave2File ändert
end;
if Pos('<FILETOLINE',Uppercase(LineString)) > 0 then begin
CmdPos := Pos('<FILETOLINE',Uppercase(LineString));
CmdLength := Pos('>',ScriptLine);
FirstCommand := '<FILETOLINE';
NoReturn := True;
end;
if Pos('<NTINIT>',Uppercase(LineString)) > 0 then begin
CmdPos := Pos('<NTINIT>',Uppercase(LineString));
FirstCommand := '<NTINIT>';
NoReturn := True;
end;
if Pos('</TELNET>',Uppercase(LineString)) > 0 then begin
ThisPos := Pos('</TELNET>',Uppercase(LineString));
if (ThisPos < CmdPos) or (CmdPos = 0) then begin
CmdPos := Pos('</TELNET>',LineString);
FirstCommand := '</TELNET>';
NoReturn := True;
end;
end;
if Pos('<COMPORT>',Uppercase(LineString)) > 0 then begin
ThisPos := Pos('<COMPORT>',Uppercase(LineString));
if (ThisPos < CmdPos) or (CmdPos = 0) then begin
CmdPos := Pos('<COMPORT>',Uppercase(LineString));
FirstCommand := '<COMPORT>';
NoReturn := True;
end;
end;
if Pos('</COMPORT>',Uppercase(LineString)) > 0 then begin
ThisPos := Pos('</COMPORT>',Uppercase(LineString));
if (ThisPos < CmdPos) or (CmdPos = 0) then begin
CmdPos := Pos('</COMPORT>',Uppercase(LineString));
FirstCommand := '</COMPORT>';
NoReturn := True;
end;
end;
if Pos('<LOCALIP>',Uppercase(LineString)) > 0 then begin
ThisPos := Pos('<LOCALIP>',Uppercase(LineString));
if (ThisPos < CmdPos) or (CmdPos = 0) then begin
CmdPos := Pos('<LOCALIP>',Uppercase(LineString));
FirstCommand := '<LOCALIP>';
end;
end;
if Pos('<LOCALSUBNET>',Uppercase(LineString)) > 0 then begin
ThisPos := Pos('<LOCALSUBNET>',Uppercase(LineString));
if (ThisPos < CmdPos) or (CmdPos = 0) then begin
CmdPos := Pos('<LOCALSUBNET>',Uppercase(LineString));
FirstCommand := '<LOCALSUBNET>';
end;
end;
if Pos('<RECOVERY>',Uppercase(LineString)) > 0 then begin
ThisPos := Pos('<RECOVERY>',Uppercase(LineString));
if (ThisPos < CmdPos) or (CmdPos = 0) then begin
CmdPos := Pos('<RECOVERY>',Uppercase(LineString));
FirstCommand := '<RECOVERY>';
NoReturn := True;
end;
end;
if Pos('<CALCIP>',Uppercase(LineString)) > 0 then begin
ThisPos := Pos('<CALCIP>',Uppercase(LineString));
if (ThisPos < CmdPos) or (CmdPos = 0) then begin
CmdPos := Pos('<CALCIP>',Uppercase(LineString));
FirstCommand := '<CALCIP>';
end;
end;
if Pos('<PORT>',Uppercase(LineString)) > 0 then begin
ThisPos := Pos('<PORT>',Uppercase(LineString));
if (ThisPos < CmdPos) or (CmdPos = 0) then begin
CmdPos := Pos('<PORT>',Uppercase(LineString));
FirstCommand := '<PORT>';
NoReturn := True;
end;
end;
if Pos('<FILENAME>',Uppercase(LineString)) > 0 then begin
ThisPos := Pos('<FILENAME>',Uppercase(LineString));
if (ThisPos < CmdPos) or (CmdPos = 0) then begin
CmdPos := Pos('<FILENAME>',Uppercase(LineString));
FirstCommand := '<FILENAME>';
end;
end;
if Pos('<DATE>',Uppercase(LineString)) > 0 then begin
ThisPos := Pos('<DATE>',Uppercase(LineString));
if (ThisPos < CmdPos) or (CmdPos = 0) then begin
CmdPos := Pos('<DATE>',Uppercase(LineString));
FirstCommand := '<DATE>';
end;
end;
if Pos('<DATETIME>',Uppercase(LineString)) > 0 then begin
ThisPos := Pos('<DATETIME>',Uppercase(LineString));
if (ThisPos < CmdPos) or (CmdPos = 0) then begin
CmdPos := Pos('<DATETIME>',Uppercase(LineString));
FirstCommand := '<DATETIME>';
end;
end;
// #99 = c, #122 =z
if Pos('<GOTOTOP>',Uppercase(LineString)) > 0 then begin
ThisPos := Pos('<GOTOTOP>',Uppercase(LineString));
if (ThisPos < CmdPos) or (CmdPos = 0) then begin
CmdPos := Pos('<GOTOTOP>',Uppercase(LineString));
FirstCommand := '<GOTOTOP>';
NoReturn := True;
end;
end;
if Pos('<LOGINPW>',Uppercase(LineString)) > 0 then begin
ThisPos := Pos('<LOGINPW>',Uppercase(LineString));
if (ThisPos < CmdPos) or (CmdPos = 0) then begin
CmdPos := Pos('<LOGINPW>',Uppercase(LineString));
FirstCommand := '<LOGINPW>';
NoReturn := True;
end;
end;
if Pos('<ENABLEPW>',Uppercase(LineString)) > 0 then begin
ThisPos := Pos('<ENABLEPW>',Uppercase(LineString));
if (ThisPos < CmdPos) or (CmdPos = 0) then begin
CmdPos := Pos('<ENABLEPW>',Uppercase(LineString));
FirstCommand := '<ENABLEPW>';
NoReturn := True;
end;
end;
if Pos('<USERNAME>',Uppercase(LineString)) > 0 then begin
ThisPos := Pos('<USERNAME>',Uppercase(LineString));
if (ThisPos < CmdPos) or (CmdPos = 0) then begin
CmdPos := Pos('<USERNAME>',Uppercase(LineString));
FirstCommand := '<USERNAME>';
NoReturn := True;
end;
end;
Result := CmdPos;
end;
procedure TBenScript.DoCmd(Command: String);
var Attributes, i, x, instance, CmdLength: Integer;
Str, s, datum, zeit, tempstr: String;
PhraseFound, SubStringCollecting: Boolean;
FileLine: textFile;
begin
with hauptform do begin
if FirstCommand = '<TELNET>' then begin
// telnet.Disconnect;
if not Analyze then begin
ResyncGrid(True);
telnet.Disconnect;
telnet.Clear;
telnet.HostName := host;
if RecoveryInProgress then
ConnectionSettings('', False);
// else
// ConnectionSettings('bla', False);
if telnet.IsSSHSet then
telnet.TnConn.SetSSHUserPass(SSHUserName, SSHPw);
telnet.Connect;
if Delay(300) then // Geraät braucht zum aktivieren
if not telnet.IsConnected then begin
EventLogger('Failed to connect to '+host, False);
BreakCycle := True;
exit;
end;
ConnectionType := 'TELNET';
end
else begin
AnList('<telnet> #Connect telnet to '+host,True);
end;
end;
if FirstCommand = '</TELNET>' then begin
if (not Analyze) and (not BreakCycle) then begin
// Delay(1000); // Warten, damit alles in Log geschrieben wird
// if telnet.IsSSH then
// telnet.IsSSH := False;
telnet.Disconnect;
Delay(300);
ConnectionType := '';
ResyncGrid(True);
end
else if not BreakCycle then begin
AnList('</telnet> #Disconnect telnet session', True);
end;
end;
if FirstCommand = '<COMPORT>' then begin
if not Analyze then begin
ResyncGrid(True);
telnet.Clear;
telnet.WriteStr('Connecting through serial interface... ');
if RecoveryInProgress then
ConnectionSettings('', True);
if not ComPort.Connected then
if not BreakCycle then try
ComPort.Open;
Delay(200); // Geraät braucht zum aktivieren
except
EventLogger('Unable to open com port!', False);
telnet.WriteStr('Unable to open com port! Cancelling current device...
');
BreakCycle := True;
exit;
end;
ConnectionType := 'TERMINAL';
end
else begin
AnList('<comport> #Connect with com port',True);
end;
end;
if FirstCommand = '<NTINIT>' then begin
if not Analyze then begin
ResyncGrid(True);
telnet.WriteStr('Please wait for Windows to reinitilaize your NIC. This
may take a minute or so...'+#13#10);
hauptform.NetWorkVarInit;
if localhost = '0.0.0.0' then
repeat
NetworkVarInit;
Sleep(100);
Delay(1000);
until
localhost <> '0.0.0.0';
Sleep(2000);
hauptform.NetWorkVarInit;
end
else begin
AnList('<ntinit> #Reinitialize Windows NT/2000/XP Network. This takes
1-2 minute(s)!',True);
end;
end;
if FirstCommand = '</COMPORT>' then begin
if not Analyze then begin
ResyncGrid(True);
if ComPort.Connected then
ComPort.Close;
ConnectionType := '';
end
else begin
AnList('</comport> #Disconnect com port',True);
end;
end;
if FirstCommand = '<LINESTOFILE' then begin
Str := ScriptLine;
CmdLength := Pos('>', Str);
Delete(Str, CmdLength, Length(Str)-1);
SubStringCollecting := False;
s := ''; // string für dateinamen
tempstr := ''; //string für dateiname etc
Delete(Str,1, Pos('=', Str));
x := 0;
for i := 0 to CmdLength -1 do begin
if Str[i] = '"' then begin
inc(x);
if x mod 2 = 0 then // alle 2. " ergeben ein teilstring
SubStringCollecting := False
else
SubStringCollecting := True;
end;
if SubStringCollecting then begin
if Str[i] <> '"' then
s := s + Str[i];
end
else begin
tempstr := tempstr + Str[i];
if Pos('hostname', tempstr) > 0 then begin
s := s + host;
tempstr := '';
end;
if Pos('date', tempstr) > 0 then begin
s := s + FormatDateTime('yy-mm-dd', Now);
tempstr := '';
end;
if Pos('time', tempstr) > 0 then begin
s := s + FormatDateTime('hh-mm-ss', Now);
tempstr := '';
end;
end;
end;
Str := s;
// showmessage('|'+s+'|');
if not Analyze then begin
ResyncGrid(True);
try
telnet.save2line := False;
telnet.Save2LineFileName := tftproot+'\'+Str;
if DirectoryExists(ExtractFilePath(tftproot+'\'+Str)) then
telnet.Save2Line := True;
except
end;
// Delay(200);
end
else begin
AnList('<linestofile="'+Str+'"> #Start saving telnet/terminal output
to '+tftproot+'\'+Str,True);
if not DirectoryExists(ExtractFilePath(tftproot+'\'+Str)) then
eventlogger('File '+tftproot+'\'+Str+' doesn''t exist!
<LINESTOFILE> failed!', False);
end;
end;
if FirstCommand = '<FILETOLINE' then begin
Str := ScriptLine;
i := Pos('"', Str);
Delete(Str,1,i); // erstes " löschen
i := Pos('"', Str);
Delete(Str,i,Length(Str)-1); // ab zweites " bis ende des Strings
löschen
if not Analyze then begin
if FileExists(tftproot+'\'+Str) then begin
AssignFile(FileLine, tftproot+'\'+Str);
reset(FileLine);
While not EOF(FileLine) or BreakCycle do begin
inc(RowCounter);
ResyncGrid(False);
Str := '';
readln(FileLine,Str);
if Pos('!', Str) <> 1 then begin
BufferIsFree := False;
Timer3.Enabled := False; // auf 500 msec zurücksetzen
Timer3.Enabled := True;
if not BreakCycle then
SendToTelnetOrTerminal(Str+RetSeq)
else
exit;
end;
end;
if IOResult <> 0 then
CloseFile(FileLine);
end
else eventlogger('File '+tftproot+'\'+Str+' doesn''t exist!
<FILETOLINE> failed!', False);
end
else begin // ANalyze Teil
AnList('<filetoline"'+Str+'"> #Send text from file '+tftproot+'\'+Str
+' to telnet/terminal',True);
if FileExists(tftproot+'\'+Str) then begin
AssignFile(FileLine, tftproot+'\'+Str);
reset(FileLine);
While not EOF(FileLine) or BreakCycle do begin
// debug
inc(RowCounter);
Str := '';
readln(FileLine,Str);
if Pos('!', Str) <> 1 then begin
BufferIsFree := False;
Timer3.Enabled := False; // auf 500 msec zurücksetzen
Timer3.Enabled := True;
if not BreakCycle then
Anlist(Str, True)
else
exit;
end;
end;
if IOResult <> 0 then
CloseFile(FileLine);
end
else if not RecoveryInProgress then
eventlogger('File '+tftproot+'\'+Str+' doesn''t exist!
<FILETOLINE> failed!', False);
end;
end;
if FirstCommand = '</LINESTOFILE>' then begin
if not Analyze then begin
try
ResyncGrid(True);
// Delay(200);
telnet.Save2Line := False;
telnet.WriteStr(RetSeq);
except
end;
end
else begin
AnList('</linestofile> #Stop saving telnet/terminal to file',True);
end;
end;
if FirstCommand = '<LOGINPW>' then begin
if not Analyze then begin
ResyncGrid(True);
PhraseFound := False;
Sleep(100);
for x:=0 to 1 do begin
instance := x;
for i:=0 to telnet.Rows do begin
Str:=telnet.Screen.Lines[i].Txt;
if (Pos('assword',Str) > 0) and (Pos('assword',Str) < 5) then
PhraseFound := True;
end;
if not PhraseFound then begin
if LocateLoginPw then
Delay(200);
if not BreakCycle then begin
If LocateLoginPw then begin
SendToTelnetOrTerminal(RetSeq);
Delay(500);
end;
end
else
exit;
end; // i
end; // x
if (instance = 1) or PhraseFound then
if not BreakCycle then
SendToTelnetOrTerminal(LoginPw+RetSeq);
end
else begin
AnList('<loginpw> #Send Login password',True);
end;
end;
if FirstCommand = '<ENABLEPW>' then begin
if not Analyze then begin
ResyncGrid(True);
if not BreakCycle then
SendToTelnetOrTerminal(EnablePw+RetSeq);
end
else begin
AnList('<enablepw> #Send Enable password', True);
end;
end;
if FirstCommand = '<USERNAME>' then begin
if not Analyze then begin
ResyncGrid(True);
if not BreakCycle then
SendToTelnetOrTerminal(TELNETUSERNAME+RetSeq);
end
else begin
AnList(TelnetUserName+' #Send Username', True);
end;
end;
if FirstCommand = '<WAIT>' then begin
if not Analyze then begin
ResyncGrid(True);
if AnalyzerForm.StringGrid1.Row <
AnalyzerForm.StringGrid1.RowCount-1 then
AnalyzerForm.StringGrid1.Row := AnalyzerForm.StringGrid1.Row+1;
CheckForData := true;
HaveData := True;
Timer1.Enabled := True;
repeat
Sleep(100);
Delay(500);
until
(not CheckForData) or BreakCycle;
end
else begin // nocht hier
resyncen !!!!
AnList('<wait> #Wait until device doesn''t send + 15 seconds', True);
end;
end;
if FirstCommand = '<CALCIP>' then begin
if not Analyze then begin
if not BreakCycle then
SendToTelnetOrTerminal(RecoveryHost);
end
else
AnList(RecoveryHost, False);
end;
if FirstCommand = '<LOCALSUBNET>' then begin
if not Analyze then begin
if not BreakCycle then
SendToTelnetOrTerminal(Subnet);
end
else
AnList(Subnet,False);
end;
if FirstCommand = '<DATE>' then begin
if not Analyze then begin
if (Pos(UpperCase('\<DATE>'), UpperCase(scriptline)) > 0) or
(Pos(UpperCase('/<DATE>'), UpperCase(scriptline)) > 0) then
if not DirectoryExists(tftproot+'\'+verzzeit) then begin
createdir(tftproot+'\'+verzzeit);
end;
if not BreakCycle then
SendToTelnetOrTerminal(verzzeit); // Verzeichniss bei InitTheShit
erstellt
end
else
AnList(verzzeit, False);
end;
if FirstCommand = '<DATETIME>' then begin
if not Analyze then begin
if not BreakCycle then
SendToTelnetOrTerminal(FormatDateTime('yy-mm-dd-hh-mm-ss-', Now));
end
else begin
Str := FormatDateTime('yy-mm-dd-hh-mm-ss-', Now);
AnList(Str, False);
end;
end;
if FirstCommand = '<FILENAME>' then begin
if not Analyze then begin
if not BreakCycle then
SendToTelnetOrTerminal(LocalCfgFileName);
end
else
AnList(LocalCfgFileName, False);
end;
if FirstCommand = '<PORT>' then begin
if not Analyze then begin
if not BreakCycle then
SendToTelnetOrTerminal(port); //Leerzeichen weil alle vorangehenden
Zeichen der Zeile bearbeitet (Delete...)
end
else
AnList(port, False);
end;
if FirstCommand = '<LOCALIP>' then begin
if not Analyze then begin
if not BreakCycle then
SendToTelnetOrTerminal(localhost);
end
else
AnList(localhost, False);
end;
if FirstCommand = '<GOTOTOP>' then begin
if not Analyze then begin
ResyncGrid(True);
for i:=0 to 5 do
if not BreakCycle then
SendToTelnetOrTerminal(#26); // # 11 = Strg
end
else begin
AnList('<gototop> #Send Strg+Z 6 times',True);
end;
end;
if FirstCommand = '<RECOVERY>' then begin
if not Analyze then begin
ResyncGrid(True);
if FileExists(PCHar(tftproot+'\recovery.dat')) then begin // Sciher
stellen, dass nicht schreibgeschützt, ansonsten Attriubute zurücksetzen zum
löschen
// Attributes := FileGetAttr(PCHar(tftproot+'\recovery.dat'));
// if (Attributes AND faReadOnly) = faReadOnly then
FileSetAttr(tftproot+'\recovery.dat', 0);// alle attribute
zurücksetzen//Attributes and not faReadOnly);
end;
// CloseFile(tftproot+'\recovery.dat');
DeleteFile(tftproot+'\recovery.dat');
// showmessage('');
CopyFile(PChar(ConfigFile),PCHar(tftproot+'\recovery.dat'),False);
if not FileExists(PCHar(tftproot+'\recovery.dat')) then
eventlogger('Can''t find file "recovery.dat"', False);
end
else begin
AnList('<recovery> #Copy selected config file to
'+tftproot+'\recovery.dat',True);
end;
end;
end;
end;
Artem Antonov wrote:
> Hello!
>
> The question is: how I can send username and pasword on connection
> with Telnet server without printing them on console, i.e. somethink
> like script?
>
> Thanks.
>
> Best regards,
> Artem Antonov.
> --
> To unsubscribe or change your settings for TWSocket mailing list
> please goto http://www.elists.org/mailman/listinfo/twsocket
> Visit our website at http://www.overbyte.be
--
To unsubscribe or change your settings for TWSocket mailing list
please goto http://www.elists.org/mailman/listinfo/twsocket
Visit our website at http://www.overbyte.be