Letztes Jahr hat Microsoft angekündigt, SSH Unterstützung für die PowerShell zu implementieren [1].
Das Vorhaben hat bis Ende letzten Jahres zwar einige Fortschritte gemacht, allerdings ist es um das Projekt seitdem etwas stiller geworden. Das Ziel alle genannten Milestones [2] der Roadmap bis zum Ende der ersten Jahreshälfte 2016 zu erreichen wurde verfehlt. Zum aktuellen Zeitpunkt ist nicht absehbar, wie lange es noch dauern wird. Bis es soweit ist, zeige ich in diesem Blogbeitrag wie man mithilfe von PoSh-SSH eine SSH Verbindung über die PowerShell aufbauen kann. Dabei interessiert mich insbesondere der Dateitransfer über SSH.

Installation:
Um die Installation auszuführen ist Windows 10 oder das Windows Management Framework 5.0 [3] erforderlich. Außerdem wird NuGet benötigt um PoSh-SSH zu finden. Wenn NuGet noch nicht installiert ist, muss dieses zuerst installiert werden.



Wenn NuGet installiert ist, kann man das Modul über die PowerShell finden oder sofort installieren.Die Installation kann über folgenden Befehl ausgeführt werden:
Install-Module PoSh-SSH
Nach der Installation stehen alle neuen Befehle des Moduls zu Verfügung. Wie gewohnt kann man sich die Befehle durch Get-Command –Module PoSh-SSH anzeigen lassen.

Verwendung:
Jetzt, da das Modul installiert ist, kann mithilfe des New-SSHSession cmdlets, eine SSH Verbindung aufgebaut werden.
New-SSHSession –ComputerName „<Name>“ –Credential (Get-Credential)
Durch Get-Credential öffnet sich ein Eingabefenster, in dem die Zugangsdaten eines Accounts auf dem Linux-System eingegeben werden können.



Nach Eingabe der Credentials steht die Verbindung und der Index der Sitzung wird in der PowerShell ausgegeben. Nun können Befehle ausgeführt werden und Daten über SCP und SFTP kopiert werden.



SSH Befehle können über Invoke-SSHCommand ausgeführt werden.
Wie erwähnt interessiert mich vor allem der Datentransfer von einem Linux System. Daher stelle ich zunächst eine SFTP Verbindung mit dem Linux System her.
New-SFTPSession -ComputerName <Zielsystem> -Credential (Get-Credential)


Interessant ist dabei die SessionID. Diese wird bei nachfolgenden Befehlen benötigt, um zu übergeben in welcher Sitzung der Befehl ausgeführt werden soll.
Über den Befehl
Get-SFTPLocation –Index 0
kann ich mir nun das aktuelle Verzeichnis anzeigen lassen.



Über
Set-SFTPLocation <Ort> -index 0
kann ich das aktuelle Verzeichnis ändern. Dabei muss das Verzeichnis nicht jedes Mal erneut geändert werden, sondern dieses bleibt gleich, solange die Sitzung aktiv ist. Mithilfe des Befehls
Get-SFTPChildItem –Index 0
 kann ich mir den Inhalt des aktuellen Verzeichnisses anzeigen lassen.



Und mithilfe des Befehls
Get-SFTPFile -SessionId 0 -RemoteFile <remoteDatei> -LocalPath <lokalerPfad>
Kann ich die Datei test.txt kopieren und in dem unter –LocalPath angegebenen Verzeichnis ablegen.



PoSH-SSH kann hier [4] auf GitHub gefunden werden.
Zur regelmäßigen Nutzung ist die Bedienung über die PowerShell, zumindest mir, etwas zu umständlich, aber zur Verwendung in einem Skript, dass über einen Scheduled Task ausgeführt wird ist es hervorragend geeignet.

[1] https://blogs.msdn.microsoft.com/powershell/2015/06/03/looking-forward-microsoft-support-for-secure-shell-ssh/
[2] https://blogs.msdn.microsoft.com/powershell/2015/10/19/openssh-for-windows-update/
[3] https://www.microsoft.com/en-us/download/details.aspx?id=50395&751be11f-ede8-5a0c-058c-2ee190a24fa6=True
[
4] https://github.com/darkoperator/Posh-SSH