Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

PowerShell SSH Verbindung - Output exportieren

Frage Entwicklung Batch & Shell

Mitglied: derhoeppi

derhoeppi (Level 2) - Jetzt verbinden

10.04.2014 um 10:34 Uhr, 2374 Aufrufe, 16 Kommentare

Hallo Leute,

ich möchte ein kleines Skript erstellen, dass mir Werte über eine SSH Verbindung ausliest. Um mit der PowerShell eine SSH Verbindung aufzubauen, benutze ich die SSH.Net Libary von CodeComplex. Damit schaffe ich es eine Verbindung zu meinem Target aufzubauen und das entsprechende Kommando abzusetzen. Nun möchte ich aber die Ausgabe des Kommandos in eine Variable schreiben, die ich anschließend als CSV ausgeben kann. Genau an diesem Punkt scheitere ich, weil er mir nicht den Variableninhalt in die CSV schreibt, sondern Tags wie TypeInformation und Lenght. Wie komme ich aber an den eigentlichen Inhalt?

Gruß
derhoeppi
Mitglied: colinardo
10.04.2014, aktualisiert um 11:34 Uhr
Hallo derhoeppi,
damit du Werte vernünftig in eine CSV-Datei exportieren kannst sollte das was du exportieren willst ein PS-Objekt sein, und zusätzlich musst du im Export-CSV Befehl den Parameter -NoTypeInformation angeben. Du solltest also aus der Befehls-Ausgabe Objekte erstellen, an ein Array anhängen und dann das ganze an Export-csv übergeben. Alternativ schreibe das ganze via Out-File direkt in eine Datei wenn die Ursprungsausgabe schon das richtige CSV-Format hat.

Grüße Uwe
Bitte warten ..
Mitglied: derhoeppi
10.04.2014 um 12:51 Uhr
Hallo Uwe,

bisher habe ich folgende Zeilen erstellt:

$Array_return = @()
New-SshSession $SshUser $SshHost
Invoke-sshcommand -computername $SshHost -command 'lsvdisk'
$Response = New-Object PSObject
Add-Member -InputObject $Response -MemberType NoteProperty -Name "id" -Value $id
Add-Member -InputObject $Response -MemberType NoteProperty -Name "name" -Value $name
Add-Member -InputObject $Response -MemberType NoteProperty -Name "pool" -Value $pool
$Array_return += $Response
$Array_return | Export-CSV -path c:\temp\export.csv

Wenn ich dies ausführe, erhalte ich zwar in der Shell die entsprechende Ausgabe des Invoke-sshcommand's, aber in der CSV landet letztlich nur die Spaltenüberschrift, die ich via Add-Member vorgeben habe.

Gruß
derhoeppi
Bitte warten ..
Mitglied: colinardo
LÖSUNG 10.04.2014, aktualisiert 13.05.2014
du musst ja Objekte mit entsprechendem Inhalt erzeugen ... du hast ja nur die Überschriften(Member) erstellt.
hier ein Beispiel (ich verwende hier die kompilierte DLL von SSH.Net) / Kommentare im Code
01.
# Dll einbinden 
02.
Add-Type -Path "D:\Renci.SshNet.dll" 
03.
$connInfo = new-Object Renci.SshNet.PasswordConnectionInfo("SSH-SERVER","Username","Password") 
04.
$ssh = new-object Renci.SshNet.SshClient($connInfo) 
05.
# Verbinden 
06.
$ssh.connect() 
07.
# Command ausführen 
08.
$result = $ssh.RunCommand("lsvdisk") 
09.
#Verbindung trennen 
10.
$ssh.Disconnect() 
11.
 
12.
$Array_return = @() 
13.
# Ausgabe des Befehls anhand der Zeilenumbrüche splitten 
14.
$lines = $result.Result.Split("`n") 
15.
# für jede Zeile in der Ausgabe 
16.
foreach($line in $lines){ 
17.
        # splitte die Zeile als Beispiel anhand des Semikolons für die Spalten 
18.
        $cols = $line.Split(";") 
19.
        # erstelle ein Objekt mit den Spalten und den Werten der jeweiligen Zeile und hänge es an das Array an 
20.
        $Array_return += New-Object PSObject -Property @{"id"=$cols[0];"name"=$cols[1];"pool"=$cols[2]} 
21.
22.
# Exportiere das Objekt als CSV 
23.
$Array_return |export-csv "C:\temp\testexport.csv" -NoTypeInformation
Grüße Uwe
Bitte warten ..
Mitglied: derhoeppi
29.04.2014 um 11:30 Uhr
Hallo Uwe,

entschuldige bitte die urlaubsbedingte Reaktion auf deine Antwort. Ich versuche das ganze bei uns in der Umgebung anzupassen.
Die Renci.SshNet.dll habe ich bei mir in die Powershell über Import-Module geladen. Im Gegensatz zu meinen Versuchen arbeitet dein Skript super schnell, so dass man sich fragt, ob überhaupt etwas passiert ist.

Ich melde mich sobald es weitere Fragen gibt.

Gruß
derhoeppi
Bitte warten ..
Mitglied: derhoeppi
29.04.2014 um 13:46 Uhr
Hallo Uwe,

nun gibt es bereits die erste Frag an der ich scheitere. Du hast als Trennzeichen in einer Zeile das Semikolon ($cols = $line.Split(";")) definiert. In meiner Ausgabe ist es jedoch ein Leerzeichen, so dass der Befehl nach meinem Verständnis - so $cols = $line.Split(" ") oder so $cols = $line.Split() aussehen müsste.
Leider macht er das nicht, so dass ich jede eine Vielzahl von Kommazeichen angezeigt wird.

Gruß
derhoeppi
Bitte warten ..
Mitglied: colinardo
29.04.2014, aktualisiert um 14:12 Uhr
ich kann leider nicht hellsehen wie deine Original Beispielausgabe deine Befehls aussieht... poste mir doch bitte einen Auszug aus der Originalausgabe (aber bitte in Code-Tags). Merci.
Bitte warten ..
Mitglied: derhoeppi
30.04.2014 um 11:44 Uhr
Hallo Uwe,

natürlich kann ich die Ausgabe hier posten.

01.
 id name                                     IO_group_id IO_group_name status mdisk_grp_id mdisk_grp_name      capacity type    FC_id FC_name RC_id RC_name vdisk_UID                        fc_map_count copy_count fast_write_state se_copy_count RC_change compressed_copy_count  
02.
0  stg_a_2_lun200_infra                   0           io_grp0       online 0            atc-stg Pool1 2.00TB   striped 0     fcmap1                6005076802818FF69000000000000000 1            1          not_empty        1             no        0                     
Das ist genau die Ausgabe die mir Putty über eine SSH Verbindung liefert.

Gruß
derhoeppi
Bitte warten ..
Mitglied: colinardo
30.04.2014, aktualisiert um 12:03 Uhr
dann ist mir alles klar, da wird ja nicht nur "ein" Leerzeichen zwischen den Spalten genutzt sondern mehrere !!
Das ist ja ein heilloses Durcheinander ....
melde mich gleich nochmal ...
Bitte warten ..
Mitglied: colinardo
LÖSUNG 30.04.2014, aktualisiert 13.05.2014
Hier musst du mit einem Regex die Spalten voneinander trennen:
$cols = $line.Trim() -split "\s+"
Grüße Uwe
Bitte warten ..
Mitglied: derhoeppi
07.05.2014 um 14:29 Uhr
Hallo Uwe,

ohne deine Hilfe wäre ich sicherlich schon untergegangen. Zwei Themen habe ich nun noch, bei denen ich einen Ansatz suche. Wir haben über
01.
 $Array_return += New-Object PSObject -Property @{"id"=$cols[0];"name"=$cols[1];"pool"=$cols[2]} 
den Header der CSV Datei bestimmt. Nun gibt mein SSH Output selbigen mit, den ich aber nicht verhindern kann. Wenn ich -Property entferne, erhalte ich eine leere CSV. Wie kann ich die Situation lösen?
Punkt zwei, den ich eigentlich über den CSV-Export erledigen möchte ist in der Ausgabe eine Spalte zu durchsuchen. Dabei geht es um die Spalte ID, die in der Regel fortlaufend sein sollte. Ich möchte gerne die Spalte ID durchgehen und die nächste freie Zahl finden.

Wenn ich den Inhalt mit VOL.id extrahiere und daraus eine Addition mit +1 durchführen möchte, wird die 1 nur angehängt. Sprich habe ich ein Volume mit der ID 24 erhalte ich als Ergebnis 241.

Hast du dafür auch einen Tipp?

Gruß
derhoeppi
Bitte warten ..
Mitglied: colinardo
LÖSUNG 07.05.2014, aktualisiert 13.05.2014
Hallo hoeppi,
auch kein Beinbruch in diesem Fall ändern wird die Schleife etwas ab (überspringen einfach die erste Zeile):
01.
for ($i=1;$i -lt $lines.Count;$i++){ 
02.
        $cols = $lines[$i].Trim() -split "\s+" 
03.
        $Array_return += New-Object PSObject -Property @{"id"=$cols[0];"name"=$cols[1];"pool"=$cols[2]} 
04.
}
Alternativ wenn du bei der alten Schleifenvariante bleiben willst, kannst du die erste Zeile einfach so nach der Schleife ausfiltern:
 $Array_return = $Array_return | select -Skip 1
Dann zur nächsten Frage: Um die nächste ID-Nummer aud dem Array zu ermitteln kannst du dies so machen:
$nextID = ($Array_Return.id | measure -Maximum).Maximum + 1
oder alternativ so
$nextID = [int]($Array_Return.id | sort -Descending | select -First 1) + 1
In der Variablen $nextID ist dann die nächste freie Nummer enthalten
Sprich habe ich ein Volume mit der ID 24 erhalte ich als Ergebnis 241
das kommt deswegen weil du zu einem String hinzuaddierst, und bei String bedeutet + einfach den String hinten anhängen. Um das zu verhindern musst du der Variablen zu der du addieren willst noch ein [int] voranstellen, so dass sie zu einem Integer umgewandelt wird.

Grüße Uwe
Falls der Beitrag gefällt, seid so nett und unterstützt mich durch eine kleine Spende / If you like my contribution please support me and donate
Bitte warten ..
Mitglied: derhoeppi
08.05.2014, aktualisiert um 08:50 Uhr
Hallo Uwe,

vielen Dank. Mit der nextID habe ich jedoch ein Problem. Er liest nicht die $Array_Return.id 's aus, so dass ich als Ergebnis immer nur einen Wert von 1 - also den Additionswert erhalte. Ich habe das ganze dann einmal mit einem eigenen Array ausprobiert. Sofern er Werte auslesen kann, funktioniert es. Was mich jedoch daran "stört" ist folgendes:

01.
$a=1,5,6 
02.
$nextID = ($a | measure - Maximum).Maximum + 1 
Wenn ich das ausführe, erhalte ich immer 7 als Ergebnis der $nextID. Wenn $a die Werte mit 1-6 belegt hätte, wäre ich glücklich, aber die Kollegen löschen auch mal ein Volume und dann soll die nächste freie Volume ID gewählt werden. Als Ergebnis in diesem Bespiel hätte ich also den Wert 2 erwartet. Wenn in diesem Fall $a den Wert 1-6 hätte, sollte mir die 7 ausgegeben werden. Muss ich an dieser Stelle mit einem Inhaltsvergleich arbeiten oder gibt es einen eleganteren Weg? Als Werte für einen Inhaltsvergleich kann ich sowohl den Maximum-Wert nutzen als auch den Count des Arrays, wobei der Maximum-Wert größer sein könnte als der Count.

Gruß
derhoeppi
Bitte warten ..
Mitglied: colinardo
LÖSUNG 08.05.2014, aktualisiert 13.05.2014
Zitat von derhoeppi:

Hallo Uwe,

vielen Dank. Mit der nextID habe ich jedoch ein Problem. Er liest nicht die $Array_Return.id 's aus, so dass ich als Ergebnis immer nur einen Wert von 1 - also den Additionswert erhalte.
Dann machst du noch irgendetwas falsch, hier geht das einwandfrei...eventuell hast du eine ältere Powershell-Version als 3.0.

Wenn ich das ausführe, erhalte ich immer 7 als Ergebnis der $nextID. Wenn $a die Werte mit 1-6 belegt hätte, wäre
ich glücklich, aber die Kollegen löschen auch mal ein Volume und dann soll die nächste freie Volume ID gewählt
werden. Als Ergebnis in diesem Bespiel hätte ich also den Wert 2 erwartet. Wenn in diesem Fall $a den Wert 1-6 hätte,
sollte mir die 7 ausgegeben werden. Muss ich an dieser Stelle mit einem Inhaltsvergleich arbeiten oder gibt es einen eleganteren Weg?
Beispiel: (Ergebnis: 2)
01.
$arr = @(1,5,3,4,6) 
02.
$ids = $arr | sort 
03.
for($i=0;$i -lt $ids.count;$i++){ 
04.
    if ([int]$ids[$i] -ne [int]($ids[$i+1]-1)){ 
05.
        $nextID = [int]$ids[$i] + 1 
06.
        break 
07.
08.
09.
$nextID
Grüße Uwe
Bitte warten ..
Mitglied: derhoeppi
08.05.2014, aktualisiert um 11:54 Uhr
Hallo Uwe,

ich habe eben mal nach meiner PSVersion gesehen und nun Version 3 und 4 nachinstalliert. Bisher habe ich auf meinem Rechner nur Version 2 gehabt. Nun habe ich es noch einmal mit
01.
 $nextID = ($Array_Return.id | measure -Maximum).Maximum + 1 
versucht. Leider erhalte ich nur id1 als Ergebnis. Wenn ich mir nur $Array_Return.id ausgeben lasse, sieht es so aus:
01.
id 0 1 2 3 4 5
Gruß
derhoeppi

EDIT: Ich habe das Problem gefunden. Ich habe die foreach-Schleife nicht durch die for-Schleife ersetzt. Nachdem ich das getan habe, konnte ich
01.
 $nextID = ($Array_Return.id | measure -Maximum).Maximum + 1 
fehlerfrei und korrekt ausführen. Bei der anderen Alternative mit dem vorausgehenden sortieren, erhalte ich falsche Werte zurück.
Bitte warten ..
Mitglied: derhoeppi
09.05.2014 um 07:34 Uhr
Hallo Uwe,

folgende Schleife liefert einen Fehler:

<Quote>
for($i=0;$i -lt $ids.count;$i++){
if ([int]$ids[$i] -ne [int]($ids[$i+1]-1)){
$nextID = [int]$ids[$i] + 1
break
}
}
</Quote>

Wenn in der Schleife :
<Quote>
for ($i=1;$i -lt $lines.Count;$i++){
$cols = $lines[$i].Trim() -split "\s+"
$Array_return += New-Object PSObject -Property @{"id"=$cols[0];"name"=$cols[1];"pool"=$cols[2]}
}
</Quote>

i=0 als Anfangswert gesetzt wird. Da ich jedoch im Array_Return einen Rückgabewert mit der ID=0 erhalte, muss ich entsprechend i anpassen. Mir ist dennoch nicht bewusst warum es zu der Fehlermeldung kommt. Als Meldung erhalte ich den Hinweis das er den Wert der id nicht nach int32 konvertieren kann, obwohl 0 ein Integer-Wert ist.

Gruß
derhoeppi
Bitte warten ..
Mitglied: colinardo
09.05.2014, aktualisiert um 08:36 Uhr
wenn du zwei Schleifen verschachtelst solltest du nie die Schleifenvariable $i doppelt verwenden, benutze also eine andere z.B. $z

mir fehlt jetzt inzwischen deine Logik bzw. dein bisheriger Code um hier noch weiter zu kommen, wenn bei mir das alles so geht wie es soll, sorry...
da liegt bei dir noch irgendeine "Variable" die ich mit meiner Glaskugel nicht sehen kann.
Bitte warten ..
Ähnliche Inhalte
Windows Tools
Powershell output auf neue Linie
gelöst Frage von adminstWindows Tools1 Kommentar

Hallo zusammen Ich möchte gerne meine Clients auf die Spectre/Meltdown lücken testen mit dem Skript von MS. Die Hosts ...

Linux Tools
Verbindung per SSH klappt nicht
gelöst Frage von coltseaversLinux Tools3 Kommentare

Hallo zusammen, ich habe einen neuen Kunden bekommen, der einen eigene Mailserver im Büro stehen hat. Nun soll ich ...

Batch & Shell
Powershell Function als String in Textdatei exportieren
gelöst Frage von MarabuntaBatch & Shell3 Kommentare

hi, ich möchte eine ganze funktion innerhalb eines skripts in eine neue datei exportieren. etwa so: function blubb{ $a="1" ...

Server
SSH-Verbindung zum Server ohne Port-Forwarding
Frage von FeveniusServer14 Kommentare

Hallo! Ich bin momentan in folgender Situation: Rechner A befindet sich in einem Netzwerk, bei dem ich kein Port-Forwarding ...

Neue Wissensbeiträge
Microsoft Office

Office 2010 Starter erneut auf einer frischen Windows-Version installieren

Tipp von Lochkartenstanzer vor 14 StundenMicrosoft Office2 Kommentare

Moin, vor ein paar Tagen schlug bei mir ein Kunde auf, der sein Widnows 7 geschrottet und es inklusive ...

Datenbanken

Upgrade MongoDB 3.4 auf 3.6

Erfahrungsbericht von Frank vor 16 StundenDatenbanken

Seit kurzem gibt es das 3.6 Update für die MongoDB: Sicherheit, das Sortieren, Aggregation und auch die Performance wurde ...

SAN, NAS, DAS

Backdoor Zugang und Upload-Bug in vielen Western Digital MyCloud Geräten

Information von Frank vor 17 StundenSAN, NAS, DAS2 Kommentare

James Bercegay von der Firma Gulftech hat die Fehler an Western Digital gemeldet und das Unternehmen stellt bereits ein ...

Microsoft Office

Outlook 2016 - Beim Weiterleiten keine PDF Anhänge mehr - KB4011626 entfernen

Erfahrungsbericht von Deepsys vor 20 StundenMicrosoft Office1 Kommentar

Wenn ihr feststellt das ihr beim Weiterleiten von E-Mails keine PDF Anhänge mehr versendent, dann dankt Microsoft. Diese tolle ...

Heiß diskutierte Inhalte
Windows Netzwerk
Drucker isolieren in Windows Domäne
gelöst Frage von lcer00Windows Netzwerk14 Kommentare

Hallo zusammen, habe eine Windows-AD (2012R2) in der es einen Druckerserver gibt. Mittlerweile verliere ich das Vertrauen in die ...

Server-Hardware
Veeam Backup Server stürzt alle paar Tage ab
Frage von Leo-leServer-Hardware12 Kommentare

Hallo Forum, ich habe momentan folgendes Problem. Veeam Backup and Replication 9.5 u2 auf voll gepatchten DL 380 G7 ...

Windows 10
Win10 Laptop findet keine Netzwerkgeräte und Freigaben mehr
Frage von CoolzeroWindows 1010 Kommentare

Hi, seit ein paar Tagen habe ich das Problem das mein Windows 10 Laptop keine Geräte mehr in der ...

Batch & Shell
Dateien verschieben mit batch
gelöst Frage von michi-ffmBatch & Shell10 Kommentare

Hallo Zusammen hat jemand evtl eine Idee? Zunächst hier das Skript: Leider werden keine UNC-Pfade unterstüzt, kann mir jemand ...