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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 253103
Url: https://administrator.de/contentid/253103
Ausgedruckt am: 23.11.2024 um 02:11 Uhr
23 Kommentare
Neuester Kommentar
Hallo spelli,
Batch ist ungeeignet um CSV Daten sicher zu parsen. Um die Chancen abzuwägen:
Grüße
rubberman
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
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).
Wie gesagt, grundsätzlich wird sowas vermutlich fehlerbehaftet bleiben. Direkt Excel zu automatisieren ist keine Alternative für dich?
Grüße
rubberman
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
Hallo spelli.
Ich kann nur dazu raten, die CSV Datei nicht direkt mit Batch zu parsen und statt dessen auf die Originaldatei zuzugreifen.
Grüße
rubberman
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
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):
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
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 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
Hallo spelli.
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
Grüße
rubberman
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
Grüße
rubberman
Nach ein bisschen Testen, sollte es so funktionieren:
Für die Zeilen 5, 6 und 23 gilt, was ich oben bereits geschrieben habe.
Grüße
rubberman
@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();
}
}
Grüße
rubberman
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.
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();
}
}
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
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
Grüße
rubberman