spelli
Goto Top

Abfrage per Batch um eine spezielle Zeile Zelle aus einer csv auszulesen IP Adresse und Passwort und als Variable weiterzuverwenden

Hallo,

ich möchte per pLink bzw. SSH einen Befehl auf einem entfernten SSH-Server ausgeben. Es gibt aber eine sehr große Anzahl an SSH-Servern. Hierzu existiert eine Tabelle bzw. CSV-Datei mit einem Namen, IP-Adresse und am wichtigsten, dem zugehörigen Passwort. Per Batch-Datei soll also eine IP/-Passwort Liste ausgelsen werden, automatisch eine SSH-Verbindung aufgebaut werden und ein vordefinierter Befehl ausgeführt werden.

Bsp.:
SPALTE3 SPALTE4 SPALTE5
ZEILE1: DS-001-1 -> Name des Servers 172.21.1.62 -> IP des Servers 123456 -> Passwort


Ich möchte nun eine Batch erstellen, die unter Verwendung [plink.exe -v -pw 123456 root@172.21.1.62] eine SSH Verbindung mit den entsprechenden Paramtern aufbaut. Zuvor soll per Eingabe des Namens "DS-001-1" oder der IP "172.21.1.62" eben die restlichen zwei Paramter aus der Tabelle entnommen werden.

Kann eigentlich die SSH-Key Abfrage automatisch beantwortet werden?

Danke und Gruß
christoph

Content-ID: 253103

Url: https://administrator.de/contentid/253103

Ausgedruckt am: 23.11.2024 um 02:11 Uhr

rubberman
rubberman 26.10.2014 um 21:26:17 Uhr
Goto Top
Hallo spelli,

Batch ist ungeeignet um CSV Daten sicher zu parsen. Um die Chancen abzuwägen:
  • Kann es passieren dass innerhalb der ersten 5 Spalten auch mal kein Wert steht?
  • In welchem Zeichensatz ist die Datei gespeichert?
  • Können Werte (insbesondere Passwörter) Zeichen enthalten, die nicht im Standard-ASCII-Range liegen (z.B. Umlaute und ß)?
  • Welches ist das Trennzeichen (Komma, Semikolon, ...)?
  • Sind Werte in Anführungszeichen eingeschlossen?
  • Gibt es Zeilenumbrüche innerhalb eines Wertes?


Grüße
rubberman
spelli
spelli 27.10.2014 um 10:58:25 Uhr
Goto Top
Hallo,

- in den ersten Spalten steht immer etwas, es gibt keine leere Spalte
- Zeichensatz etc. ist frei definierbar, da Grundlage eine EXCEL-Tabelle ist, muss nur entsprechend konvertiert/exportiert werden
von mir erstellte csv ist "Westeuropa (Windows-1252/WinLatin 1)" - richtigerweise muss ich vob OpenOffice und nicht EXCEL sprechen
- Namensspalte enthält keine Umalute oder Sonderzeichen etc., Passwörter sehr wohl und ausserhalb ASCII
- Trennzeichen ist ; - kann aber auch jedes andere sein
- Die Frage bzgl. der Anführungszeichen habe ich nicht ganz verstanden. Also Anführungszeichen kommen bei mir nur ggf. im Bereich der Passwörter zum Tragen
- es gibt keine Zeilenumbrüche!

Danke!
rubberman
rubberman 27.10.2014 um 12:00:33 Uhr
Goto Top
Hallo spelli,

ich werde mir das zu Hause genauer ansehen. Sinnvoll ist aber bestimmt einen Zeichensatz zu wählen, mit dem die Kommandozeile auch arbeitet (im Zweifelsfall CP850).
- Die Frage bzgl. der Anführungszeichen habe ich nicht ganz verstanden. Also Anführungszeichen kommen bei mir nur ggf. im Bereich der Passwörter zum Tragen
Beim Exportieren kann es sein dass Werte die in Excel nicht in Anführungszeichen stehen, in der CSV in Anführungszeichen eingeschlossen werden (faktisch als Text markiert). Anführungszeichen, die vorher schon im Wert vorgekommen sind, werden dann verdoppelt ... Das ganze siehst du, wenn du die Datei mal in einem Texteditor öffnest.

Wie gesagt, grundsätzlich wird sowas vermutlich fehlerbehaftet bleiben. Direkt Excel zu automatisieren ist keine Alternative für dich?

Grüße
rubberman
spelli
spelli 27.10.2014 um 15:29:48 Uhr
Goto Top
Hallo rubberman!

Danke für deine Hilfe.

Also wie genau die Ziellösung aussieht ist mir eigentlich egal. Ich habe hier bis zu ca. 8 Befehle, die per SSH auf entfernten Telemetrie-Geräten ausgeführt werden müssen. Leider handelt es sich um knapp 100 Geräte mit unterschiedlichen IPs und Passwörtern.

Hier habe ich zunächst eine OpenOffice-Liste, aus der ich mir zum entsprechenden Namen das Passwort hole. Das tippe ich ein, logge mich ein und setzte händishc den Befehl per Konsole.

Wunschgedanke ist, eine "Batch" oder etwas andere zu erstellen, die mich fragt:
Welchen Befehl ich auswählen will? -> Auswahl Befehl der später per SSH übergeben wird
Welches Gerät oder IP? - Ich tippe Namen oder IP ein
--> Nach Enter loggt sich das Skript unter Zuhilfename des zugehörigen Passwortes aus einer Liste auf dem entsprechenden Gerät ein und führt den zuvor ausgewählten Befehl aus. Vielleicht gibts noch als 1 mit * eine Rückmeldung, bzw. Ausgabe...

Ich gebe nichts vor, hab halt nur eine Liste in OpenOffice/EXCEL, in der sich NAME, IP, Passwort befinden...

Danke und Gruß
rubberman
rubberman 27.10.2014 um 16:17:52 Uhr
Goto Top
Hallo spelli.

Ich kann nur dazu raten, die CSV Datei nicht direkt mit Batch zu parsen und statt dessen auf die Originaldatei zuzugreifen.
Ich habe hier bis zu ca. 8 Befehle, die per SSH auf entfernten Telemetrie-Geräten ausgeführt werden müssen.
Von so etwas habe ich nicht den geringsten Schimmer, aber du hast ja schon eine Kommandozeile gepostet und weißt offensichtlich wie das funktioniert.
hab halt nur eine Liste in OpenOffice/EXCEL
OpenOffice oder MS Excel fernzubedienen macht einen enormen Unterschied (völlig anderer Code). Welches von beiden? (Excel wäre einfacher für mich, OO bekomme ich zur Not vermutlich auch hin ...).

Grüße
rubberman
spelli
spelli 27.10.2014 um 20:03:08 Uhr
Goto Top
Dann ruhig Excel! - Sofern der Kopiervorgang von OpenOffice nach Excel problemlos abläuft face-wink
rubberman
Lösung rubberman 27.10.2014, aktualisiert am 31.10.2014 um 19:31:06 Uhr
Goto Top
OK, dann versuchen wir's mal mit einem Hybrid-Script aus Batch und JScript. Voraussetzung ist für die Verwendung von Excel selbstverständlich dass Excel auch installiert ist ...

Speichere den gesamten Code als Batchscript (*.bat):
@if (@X)==(@Y) @end /* Valide Zeile in Batch und JScript

:: Batch Part:
@echo off &setlocal
set "workbook=C:\irgendwo\test.xls" 
set "worksheet=Tabelle1" 

:inputloop
set "findwhat=" 
set /p "findwhat=Suche nach: " 
if not defined findwhat goto inputloop

for /f "tokens=2 delims=:" %%i in ('chcp') do set /a oemcp = %%~ni 
set "cmdline=" 
>nul chcp 1252
for /f "delims=" %%i in ('cscript //nologo //e:jscript "%~fs0"') do ( 
  set "cmdline=%%i" 
)
>nul chcp %oemcp%

if defined cmdline (
  setlocal EnableDelayedExpansion
  ECHO !cmdline!
  endlocal
)

pause
exit /b


:: JScript Part: */
var env=WScript.CreateObject("WScript.Shell").Environment("Process");  
var workbook = env("workbook");  
var worksheet = env("worksheet");  
var findwhat = env("findwhat");  
var xlValues = -4163, xlWhole = 1;

try {
  var objExcelApp = WScript.CreateObject("Excel.Application");  
  objExcelApp.Visible = false;
  var objWorkbook = objExcelApp.Workbooks.Open(workbook, 0, true);
  var objWorksheet = objWorkbook.Worksheets(worksheet);
  var objUsedRange = objWorksheet.UsedRange;
  var objCell = objUsedRange.Find(findwhat, objUsedRange.Cells(1, 1), xlValues, xlWhole);
  var pass = objWorksheet.Cells(objCell.Row, 5);
  var ip = objWorksheet.Cells(objCell.Row, 4)
  WScript.StdOut.WriteLine("plink.exe -v -pw " + pass + " root@" + ip);  
  objWorkbook.Close(false);
  objExcelApp.Quit();
}
catch (e) {
  WScript.StdErr.WriteLine(e.name + ": " + e.message);  
  if (objExcelApp != null)
  {
    objExcelApp.Quit();
  }
}
In Zeile 5 den gesamten Pfad zur Exceldatei angeben.
In Zeile 6 den Name der Tabelle, so wie er in Excel unten als Tab angezeigt wird.

In Zeile 23 wird die kombinierte Kommandozeile zunächst nur angezeigt. Wenn du willst, dass sie ausgeführt wird, einfach das ECHO entfernen ...

Grüße
rubberman
spelli
spelli 28.10.2014 um 08:53:38 Uhr
Goto Top
Hallo! Danke für deine Hilfe und Mühe.

Oh! Du schreibst Excel muss installiert sein... Mist! Das ist bzw. Wird nicht der Fall sein...

Geht es doch mit OpenOffice? Danke und sorry...
rubberman
rubberman 28.10.2014 um 09:47:13 Uhr
Goto Top
Hallo spelli.

OpenOffice oder MS Excel fernzubedienen macht einen enormen Unterschied (völlig anderer Code). Welches von beiden?
Dann ruhig Excel!

LOL Was glaubst du warum ich gefragt habe?
Kann ich nur heute Abend zu Hause zusammenschroten. Ich mache nichts mit OO, außer Fragen in Foren zu beantworten face-wink

Grüße
rubberman
rubberman
rubberman 28.10.2014, aktualisiert am 29.10.2014 um 23:39:39 Uhr
Goto Top
Nach ein bisschen Testen, sollte es so funktionieren:
@if (@X)==(@Y) @end /* Valide Zeile in Batch und JScript

:: Batch Part:
@echo off &setlocal
set "workbook=C:\irgendwo\test.ods" 
set "worksheet=Tabelle1" 

:inputloop
set "findwhat=" 
set /p "findwhat=Suche nach: " 
if not defined findwhat goto inputloop

for /f "tokens=2 delims=:" %%i in ('chcp') do set /a oemcp = %%~ni 
set "cmdline=" 
>nul chcp 1252
for /f "delims=" %%i in ('cscript //nologo //e:jscript "%~fs0"') do ( 
  set "cmdline=%%i" 
)
>nul chcp %oemcp%

if defined cmdline (
  setlocal EnableDelayedExpansion
  ECHO !cmdline!
  endlocal
)

pause
exit /b


:: JScript Part: */
var env=WScript.CreateObject("WScript.Shell").Environment("Process");  
var workbook = "file:///" + WScript.CreateObject("Scripting.FileSystemObject").GetAbsolutePathName(env("workbook"));  
var worksheet = env("worksheet");  
var findwhat = env("findwhat");  
var aOOArgs = ;
var aChars = ["\\\\", "/", "%", "%25", " ", "%20"];  
var i = 0;

for (i = 0; i < 6; i += 2) {
  workbook = workbook.replace(new RegExp(aChars[i], 'g'), aChars[i + 1]);  
}

try {
  var objOOSvcMan = WScript.CreateObject("com.sun.star.ServiceManager");  
  for (i = 0; i < 2; ++i) {
    aOOArgs[i] = objOOSvcMan.Bridge_GetStruct("com.sun.star.beans.PropertyValue");  
  }
  aOOArgs.Name = "Hidden";  
  aOOArgs.Value = true;
  aOOArgs[1].Name = "ReadOnly";  
  aOOArgs[1].Value = true;
  var objOODsktp = objOOSvcMan.createInstance("com.sun.star.frame.Desktop");    
  var objDoc = objOODsktp.LoadComponentFromURL(workbook, "_blank", 0, aOOArgs);  
  var objSheet = objDoc.Sheets.getByName(worksheet);
  var objSearchDescr = objSheet.createSearchDescriptor();
  objSearchDescr.setSearchString(findwhat);
  objSearchDescr.SearchWords = true;
  var objAddress = objSheet.findFirst(objSearchDescr).getCellAddress();
  var pass = objSheet.getCellByPosition(4, objAddress.Row).getString();
  var ip = objSheet.getCellByPosition(3, objAddress.Row).getString();
  objOODsktp.Terminate();
  WScript.StdOut.WriteLine("plink.exe -v -pw " + pass + " root@" + ip);  
}
catch (e) {
  WScript.StdErr.WriteLine(e.name + ": " + e.message);  
  if (objOODsktp != null)
  {
    objOODsktp.Terminate();
  }
}
Für die Zeilen 5, 6 und 23 gilt, was ich oben bereits geschrieben habe.

Grüße
rubberman
spelli
spelli 29.10.2014 um 20:45:56 Uhr
Goto Top
Hallo!

Danke für deine Mühe!

Nachdem ich einen "Suchbegriff" eingebe und Enter drücke kommt folgende Meldung:

"SyntaxError: com.sun.star.lang.IllegalArgumentException: URL seems to be an unsupported one."

Danach kann ich nur eine Taste drücken und das Fenster schliesst sich...

Danke!
rubberman
rubberman 29.10.2014 um 20:59:52 Uhr
Goto Top
Dann stimmt der Pfad oder der Dateiname nicht. Wie sieht die geänderte Zeile 5 bei dir aus?

Grüße
rubberman
spelli
spelli 29.10.2014 um 22:22:26 Uhr
Goto Top
Oh das war mein Fehler. Es läuft! Super

Tippe ich jetzt einen Namen ein sucht mir das Skript entsprechend IP und Passwort raus! Perfekt!

Dann wird per SSH Client eine Verbindung dahin aufgebaut... Jetzt müsste ich es nur noch so hinbekommen,
dass ein Befehl automatisch durch dieses Skript ausgegeben wird..., Das erste war nur der Login...

Aber da stehe ich nun vor dem nächsten Problem! - Wie bekomme ich nun aus dem Skript einen weiteren Befehl
in die SSH-Kommandozeile?

Danke danke!
rubberman
Lösung rubberman 29.10.2014, aktualisiert am 31.10.2014 um 19:31:19 Uhr
Goto Top
Wie schon oben angemerkt, habe ich von diesem Thema nicht die geringste Ahnung.
Wie würdest du das denn händisch tun?

Grüße
rubberman

EDIT: Hab gerade mal nach der Kommandozeilenreferenz von plink gesucht. Dort steht was von Option -m bei der man eine Datei mit den Befehlszeilen angeben kann.
Schreib mal so eine Datei und gib den Pfad in Zeile 7 an.
@if (@X)==(@Y) @end /* Valide Zeile in Batch und JScript

:: Batch Part:
@echo off &setlocal
set "workbook=C:\irgendwo\test.ods" 
set "worksheet=Tabelle1" 
set "commandfile=C:\irgendwo\commands.txt" 
:inputloop
set "findwhat=" 
set /p "findwhat=Suche nach: " 
if not defined findwhat goto inputloop

for /f "tokens=2 delims=:" %%i in ('chcp') do set /a oemcp = %%~ni 
set "cmdline=" 
>nul chcp 1252
for /f "delims=" %%i in ('cscript //nologo //e:jscript "%~fs0"') do ( 
  set "cmdline=%%i" 
)
>nul chcp %oemcp%

if defined cmdline (
  setlocal EnableDelayedExpansion
  ECHO !cmdline!
  endlocal
)

pause
exit /b


:: JScript Part: */
var env=WScript.CreateObject("WScript.Shell").Environment("Process");  
var workbook = "file:///" + WScript.CreateObject("Scripting.FileSystemObject").GetAbsolutePathName(env("workbook"));  
var worksheet = env("worksheet");  
var findwhat = env("findwhat");  
var commandfile = env("commandfile");  
var aOOArgs = ;
var aChars = ["\\\\", "/", "%", "%25", " ", "%20"];  
var i = 0;

for (i = 0; i < 6; i += 2) {
  workbook = workbook.replace(new RegExp(aChars[i], 'g'), aChars[i + 1]);  
}

try {
  var objOOSvcMan = WScript.CreateObject("com.sun.star.ServiceManager");  
  for (i = 0; i < 2; ++i) {
    aOOArgs[i] = objOOSvcMan.Bridge_GetStruct("com.sun.star.beans.PropertyValue");  
  }
  aOOArgs.Name = "Hidden";  
  aOOArgs.Value = true;
  aOOArgs[1].Name = "ReadOnly";  
  aOOArgs[1].Value = true;
  var objOODsktp = objOOSvcMan.createInstance("com.sun.star.frame.Desktop");    
  var objDoc = objOODsktp.LoadComponentFromURL(workbook, "_blank", 0, aOOArgs);  
  var objSheet = objDoc.Sheets.getByName(worksheet);
  var objSearchDescr = objSheet.createSearchDescriptor();
  objSearchDescr.setSearchString(findwhat);
  objSearchDescr.SearchWords = true;
  var objAddress = objSheet.findFirst(objSearchDescr).getCellAddress();
  var pass = objSheet.getCellByPosition(4, objAddress.Row).getString();
  var ip = objSheet.getCellByPosition(3, objAddress.Row).getString();
  objOODsktp.Terminate();
  WScript.StdOut.WriteLine("plink.exe -v -pw " + pass + " root@" + ip + " -m \"" + commandfile + "\"");  
}
catch (e) {
  WScript.StdErr.WriteLine(e.name + ": " + e.message);  
  if (objOODsktp != null)
  {
    objOODsktp.Terminate();
  }
}
spelli
spelli 30.10.2014 um 21:33:21 Uhr
Goto Top
Hallo!

Ich glaube die \ sind zuviel. Ich habe einfach ... -m command.txt .... angegeben... So funktioniert es!!

Ich habe noch etwas Probleme mit dem Syntax bei mehreren Befehlen, aber so ist es echt top!

Danke für die Hilfe!
rubberman
rubberman 30.10.2014 um 21:47:58 Uhr
Goto Top
Ich glaube die \ sind zuviel.
Ich kann dir nicht folgen. Falls du dich auf Zeile 64 beziehst, dann sind es nur Escapezeichen um den Pfad zur Datei in Anführungszeichen zu setzen (falls er Leerzeichen enthalten sollte ist das sicher unerlässlich).

Wie auch immer. Wenn's klappt, dann setze das Thema auf gelöst damit Leute mit einem ähnlichen Problem wissen, dass sie hier einen funktionierenden Ansatz finden.

Grüße
rubberman
spelli
spelli 19.11.2014 um 22:03:25 Uhr
Goto Top
Hallo rubberman,

freundlicherweise konntest du mir mit o. g. Script weiterhelfen. Leider scheitere ich immer noch daran mittels diesen Scriptes mehr als nur einen SSH-Befehl abzusetzen.

Gibt es die Möglichkeit diesen Befehl

WScript.StdOut.WriteLine("plink.exe -v -pw " + pass + " root@" + ip + " -m \"" + commandfile + "\"");

abszusetzen und danach -im angemeldeten Zustand am Server- einfach einen nächsten Befehl anzufügen.

Sinngemäß:

Enter Menü [Return]
Liste Menü auf [Return]

Danke!
rubberman
rubberman 20.11.2014 um 00:00:57 Uhr
Goto Top
Sorry, aber wie schon gesagt - keine Ahnung vom eigentlichen Thema. Ich weiß nicht ob plink dich angemeldet lassen kann oder nicht. Ich weiß auch nicht ob du irgendwelche Tastatureingaben emulieren kannst. Schau doch einfach mal in die Manpage zu diesem Programm, vielleicht findest du was.

Grüße
rubberman
spelli
spelli 27.11.2014 um 11:04:53 Uhr
Goto Top
Hallo rubberman!

Herzlichen Dank nochmal! Ich konnte durch tüfteln und in-den-Syntax-einlesen eine Lösung schaffen!!!

Leider klappt es akt. nur mit der EIngabe der IP, nicht aber mit dem Namen... Als Fehler wird:

*
TypeError: 'objSheet.findFirst<...>' ist Null oder kein Objekt
*

ausgeworfen...

Dürfte ich dich nocheinmal um deine Hilfe bitten!

Danke!
rubberman
rubberman 29.11.2014 um 14:17:42 Uhr
Goto Top
Der Fehler deutet darauf hin, dass die Suchzeichenfolge nicht gefunden wird. Bei mir im Test funktioniert das aber weiterhin. Ohne weitere Informationen kann ich dir leider nicht helfen. Aber suche doch mal händisch (Strg + F) in der entsprechenden Tabelle.

Grüße
rubberman
spelli
spelli 29.11.2014 um 19:38:56 Uhr
Goto Top
Hallo,

es ist etwas komisch. "Auf einmal" funktionierte die Abfrage nach Namen nicht mehr. Nach IPs funktioniert wie gehabt.

In der Liste sind in Spalte 3 die entsprechenden Namen zu sehen. Eine Suche im OpenOffice Dokument danach findet aber nichts bzw. sagt
kein Eintrag gefunden?????
spelli
spelli 29.11.2014 um 19:40:40 Uhr
Goto Top
Bei einem Backup des Ordners von Ende Oktober da gleiche??? Hmm irgendwas wohl mit OpenOffice!?
spelli
spelli 29.11.2014 um 19:55:01 Uhr
Goto Top
erledigt, die Liste war zerschossen