So erstellen Sie PowerShell-Tools zum Einrichten von SFTP
Wenn Sie mehrere Windows-Computer verwenden, müssen Sie möglicherweise über verschiedene Protokolle auf freigegebene Ressourcen zugreifen. Wenn auf einem Windows-Computer eine Dateifreigabe erstellt wird, wird in der Regel das SMB-Protokoll verwendet. Auf Nicht-Windows-Computern können Dateien jedoch von NFS, FTP, SFTP, FTPS, SCP und anderen Protokollen geteilt werden. Wenn Sie beispielsweise ausschließlich PowerShell auf einem Windows Server ohne grafische Benutzeroberfläche verwenden, kann das Verbinden mit der SFTP-Freigabe der ersten Verbindung schwierig erscheinen. In diesem Blogbeitrag wird erläutert, wie Sie SFTP unter Windows mit PowerShell nutzen können.
Was ist SFTP?
SFTP steht für „SSH File Transfer Protocol“ oder „Secure File Transfer Protocol“. SFTP ist die sichere Alternative zum herkömmlichen File Transfer Protocol (FTP) mit ähnlicher Funktionalität. SFTP arbeitet auf der Anwendungsschicht des OSI-Modells (Schicht 7), nutzt die SSH-Verbindung und ist besonders auf Linux-Rechnern beliebt, die in der Regel über einen integrierten SFTP-Client für die Befehlszeile verfügen. Wenn Sie Windows verwenden, installieren Sie einen kostenlosen SSH-Client wie WinSCP, der über eine grafische Benutzeroberfläche verfügt und mehr als nur SFTP unterstützt, oder konfigurieren Sie PowerShell-Tools, falls Sie die Befehlszeile nutzen müssen. Windows und PowerShell unterstützen SFTP nicht von Haus aus, sodass zusätzliche Komponenten installiert werden müssen.
Bei Verwendung einer SSH-Verbindung werden Datenübertragungen über das Netzwerk verschlüsselt und die Verbindung ist sicher – im Gegensatz zum herkömmlichen, unverschlüsselten FTP-Protokoll, bei dem Daten von Angreifern abgefangen werden können. SSH wird zur Authentifizierung verwendet, und wenn Sie über Linux-Anmeldeinformationen verfügen, können Sie nach erfolgreicher Authentifizierung über Ihren SFTP-Befehlszeilen- oder GUI-Client auf Dateien auf einem Ziel-Linux-Rechner zugreifen. Außerdem können Sie damit Dateien von einem entfernten Linux-Rechner auf Ihren lokalen Linux- oder Windows-Rechner kopieren oder umgekehrt. Die Konfiguration des SFTP-Servers unter Linux ist nicht schwierig – Sie installieren den SSH-Server, legen Benutzer an und erteilen den Benutzern sowie den Dateien und Verzeichnissen die erforderlichen Berechtigungen.
Verwechseln Sie SFTP nicht mit FTPS. Diese beiden Protokolle werden für ähnliche Zwecke verwendet. SFTP nutzt jedoch eine Portnummer für die Verbindung, während FTPS mehrere Portnummern für Steuer- und Datenkanäle verwendet (was aus Sicht der Sicherheit, einschließlich Firewalls, schwieriger zu konfigurieren sein kann). FTPS ist FTP mit SSL (Secure Socket Layer). In diesem Blogbeitrag gehe ich nicht darauf ein, wie man einen SFTP-Server einrichtet. Informationen zur Installation und Konfiguration von Linux (einschließlich des SSH-Servers) auf Hyper-V finden Sie unter hier.
Installation des Posh-SSH-Moduls
Um mit SFTP und SCP in PowerShell Dateioperationen (Kopieren, Löschen) auf Remote-Computern durchführen zu können, müssen Sie das Posh-SSH-Modul in PowerShell installieren. Durch die Installation dieses Moduls können Sie außerdem über die SSH-Sitzung Remote-Befehle auf einem Remote-Computer ausführen. Für die Installation und Nutzung von Posh-SSH sind PowerShell 3.0 und .NET Framework 4.0 erforderlich. Daher können Sie dieses Modul unter Windows 8 oder neueren Windows-Versionen installieren. Unter Windows 7 SP1 können Sie PowerShell und .NET Framework auch manuell aktualisieren. Führen Sie diesen Befehl aus, um das PowerShell-SFTP-Modul (Posh-SSH) zu installieren: install-module posh-ssh
Alternativ können Sie diesen Befehl verwenden, um das Posh-SSH-Modul für PowerShell zu installieren:
iex (New-Object Net.WebClient).DownloadString("https://gist.github.com/darkoperator/6152630/raw/c67de4f7cd780ba367cccbc2593f38d18ce6df89/instposhsshdev")
Für die Installation von Posh-SSH mit den oben genannten Befehlen ist eine Internetverbindung erforderlich. In meinem Verwendungsfall habe ich das Posh-SSH-Modul in PowerShell installiert und kann nun mit den weiteren Konfigurationsschritten fortfahren.
Verbindung zu einem Remote-Host in PowerShell herstellen
In diesem Blogbeitrag verwende ich eine Umgebung mit einem lokalen Windows-Rechner und einem Remote-Linux-Rechner, die mit demselben Netzwerk verbunden sind:
- 192.168.101.210 ist ein lokaler Windows-Rechner, auf dem Windows 10 Version 20H2 installiert ist
- 192.168.101.209 ist ein Remote-Linux-Rechner, auf dem der SSH- (SFTP-)Server läuft
- user1 ist der Name des Linux-Benutzers
Diese IP-Adressen werden in meinen Beispielen verwendet. Geben Sie Ihre IP-Adressen und Anmeldeinformationen in die entsprechenden Befehle und Konfigurationsdateien ein.
Lassen Sie uns unsere SFTP-Freigabe überprüfen, indem wir über SFTP eine Verbindung zum Linux-Server herstellen – mithilfe von WinSCP, dem kostenlosen SFTP-Client für Windows. Die Verbindung zu einem SFTP-Server ist unkompliziert. Geben Sie die IP-Adresse des Zielhosts, die Portnummer (TCP 22 ist die Standardportnummer, Sie können einen SSH-Server jedoch so konfigurieren, dass er eine benutzerdefinierte Portnummer verwendet), den Benutzernamen und das Passwort ein, um die Verbindung herzustellen. Vergessen Sie nicht, das SFTP-Protokoll auszuwählen.
In meinem Fall funktioniert die SFTP-Verbindung. Wir haben zwei Dateien in den freigegebenen Ordner kopiert (der Speicherort der Dateien lautet /home/user1/shared/ auf dem entfernten Linux-Rechner). Schauen wir uns an, wie man von Windows aus eine Verbindung zum freigegebenen Ordner herstellt und wie man SFTP mit Posh-SSH in PowerShell nutzt.
Um mit Dateien über SFTP zu arbeiten, sollten Sie zunächst eine Sitzung aufbauen. Führen Sie dazu diesen Befehl in PowerShell aus:
New-SFTPSession -Computername 192.168.101.209
Nach Ausführung des Befehls wird die Anzeige des Authentifizierungsfensters angezeigt. Geben Sie einen Benutzernamen und ein Passwort ein, um auf den Remote-Linux-Rechner mit den Dateien zuzugreifen, auf die Sie über SFTP zugreifen möchten. Wenn Sie die richtigen Anmeldeinformationen eingegeben haben, sollte die PowerShell-Ausgabe mit den Informationen zur SFTP-Sitzungsnummer, der IP-Adresse des Remote-Hosts und dem Status der Verbindung angezeigt werden. Sobald eine Sitzung erstellt wurde, wird ihr eine Indexnummer zugewiesen.
Sie können immer den Befehl „help“ mit den entsprechenden Argumenten eingeben, um die Kurzhilfe zur Syntax der PowerShell-Befehle anzuzeigen:
help New-SFTPSession
Alle verfügbaren POSH-PowerShell-Befehle auflisten: Get-Command -Module Posh-SSH
oder
Get-command -Name * -module *posh-ssh
Hier erfahren Sie, wie Sie eine SSH-Sitzung erstellen, mit der Sie einen Befehl auf einem Remote-Host ausführen können, beispielsweise um Dateien im Verzeichnis aufzulisten:
Import-Module Posh-SSH
$SSHSession = New-SSHSession -ComputerName 192.168.101.209 -Credential $(Get-Credential) -Verbose
$SSH = $SSHSession | New-SSHShellStream
Invoke-SSHCommand -Index 0 -Command "ls -l /home/user1/shared"
Erstellen eines PowerShell-Skripts
Erstellen wir ein Testskript, um die grundlegenden Vorgänge zu erkunden, die Sie in PowerShell bei der Arbeit mit SFTP-Ressourcen ausführen können. Dies ist kein SFTP-Skript, sondern ein PowerShell-Skript für die Arbeit mit SFTP. Dieses Testskript soll die Installationsdatei des .NET Framework von einem entfernten Linux-Rechner auf einen lokalen Windows-Rechner kopieren.
Erstellen Sie eine test-PS.ps1 Skriptdatei mit dem unten angezeigten Inhalt.
#Creating a folder to store files downloaded from the SFTP share
New-item -itemtype directory -force -path c:tempps
#Setting credentials for the user account
$password = ConvertTo-SecureString "My_Password000" -AsPlainText -Force
$creds = New-Object System.Management.Automation.PSCredential ("user1", $password)
#Establishing an SFTP session
$Session = New-SFTPSession -Computername 192.168.101.209 -credential $creds
#Downloading the .NET installer file by using the established SFTP session
Get-SFTPFile -SessionId $session.SessionID -RemoteFile /home/user1/shared/NetFrameworkNDP462.exe -LocalPath c:tempps
Öffnen Sie PowerShell auf einem Windows-Rechner, wechseln Sie in den Ordner, in dem dieses Testskript gespeichert ist, und führen Sie das Skript aus:
.test-PS.ps1
Die Datei NetFrameworkNDP462.exe sollte von /home/user1/shared/ (auf einem entfernten Linux-Rechner) nach C:tempps (auf einem lokalen Windows-Rechner) kopiert werden. Wie Sie auf dem folgenden Screenshot sehen können, wurde die Datei in meinem Fall erfolgreich kopiert.
Um Dateien in einem Verzeichnis der SFTP-Ressource aufzulisten, können Sie ein PowerShell-Skript mit folgendem Inhalt erstellen:
$passwordTest = "Your_Password000"
$securePasswordTest = ConvertTo-SecureString $passwordTest -AsPlainText -Force
$credentialsTest = New-Object System.Management.Automation.PSCredential ("user1", $securePasswordTest)
$sessionTest = New-SFTPSession -ComputerName 192.168.101.209 -Credential $credentialsTest -AcceptKey
$sourceTest = "/home/user1/shared/"
$destinationTest= "c:tempps"
Get-SFTPChildItem -Recursive $sessionTest -Path $sourceTest | ForEach-Object{
if ($_.Fullname -like '*.csv')
{
Get-SFTPFile $sessionTest -RemoteFile $_.FullName -LocalPath $destinationTest -Overwrite
}
write-output $_.FullName
}
Remove-SFTPSession $sessionTest -Verbose
Dabei gilt:
Your_Password000 ist das Passwort für das Benutzerkonto, das für die Verbindung per SSH zur SFTP-Freigabe verwendet wird;
user1 ist der Name des Benutzers;
192.168.101.209 ist die IP-Adresse des Remote-Hosts, mit dem wir uns verbinden, um über SFTP auf Dateien zuzugreifen.
Speichern Sie das Skript als list-files.ps1 und führen Sie dieses Skript in PowerShell auf Ihrem lokalen Rechner aus einem Ordner aus, in dem diese Skriptdatei gespeichert ist.
.list-files.ps1
Achten Sie auf den im Testskript definierten Parameter -Recursive . Auf dem folgenden Screenshot sehen Sie die Ergebnisse bei Verwendung des Parameters -Recursive sowie ohne diesen Parameter.
Einer der Nachteile beim Ausführen von Skripten, wie sie in den obigen Beispielen gezeigt werden, besteht darin, dass Anmeldeinformationen im Klartext im Skript gespeichert werden, was keine Sicherheit bietet. Ein Benutzer, der ein Skript öffnen kann (selbst mit Lesezugriff), kann ein Passwort einsehen und dieses Passwort für unbefugten Zugriff nutzen.
Es gibt eine Methode, um die Sicherheit zu erhöhen und ein Passwort in verschlüsselter Form in einer Datei zu speichern. Zur Verschlüsselung eines Passworts wird die Windows Datensicherheit API verwendet, sodass der Zugriff auf diese Passwortdatei nur über das Benutzerkonto und den Computer möglich ist, mit denen diese Passwortdatei erstellt wurde. (get-credential).password | ConvertFrom-SecureString | set-content "C:temppassword.txt"
Das Passwort wird dann in verschlüsselter Form in der Textdatei gespeichert. Wenn jemand den Inhalt dieser Datei einsehen kann, wird das Passwort nicht als Klartext angezeigt.
Wenn Sie das Passwort eingeben müssen, geben Sie die Datei mit dem gespeicherten, verschlüsselten Passwort an (in unserem Fall C:temppassword.txt ).
$password = Get-Content "C:temppassword.txt" | ConvertTo-SecureString
$credential = New-Object System.Management.Automation.PsCredential("user1",$password)
Diese Methode zur Festlegung eines Passworts ist sicherer. Sie können das Skript, in dem Sie das Passwort festgelegt haben, ändern. Als Alternative zum Öffnen eines Skripts in einem Texteditor können Sie mit der rechten Maustaste auf die Datei ps1 klicken und im Kontextmenü auf Editklicken.
Die Windows PowerShell ISE wird geöffnet. Dies ist ein natives Windows-Tool, das die Syntax zur besseren Übersicht farblich hervorhebt und die verfügbaren PowerShell-Befehle im rechten Fensterbereich anzeigt.
Die Befehle im Testskript lauten nun wie folgt:
New-item -itemtype directory -force -path c:tempps
$password = Get-Content "C:temppassword.txt" | ConvertTo-SecureString
$creds = $credential = New-Object System.Management.Automation.PsCredential("user1",$password)
$Session = New-SFTPSession -Computername 192.168.101.209 -credential $creds
Get-SFTPFile -SessionId $session.SessionID -RemoteFile /home/user1/shared/NetFrameworkNDP462.exe -LocalPath c:tempps
Sie können Ihr Skript erneut ändern und es so einstellen, dass es die heruntergeladene Installationsdatei auf dem Windows-Rechner ausführt. Der Befehl zur Installation des .NET Frameworks im stillen Modus (aus dem Verzeichnis, in dem sich die Installationsdatei befindet) lautet:
.NetFrameworkNDP462.exe /q /norestart
Geben Sie den Namen Ihrer Installationsdatei ein, falls dieser abweicht.
Fügen Sie am Ende des Skripts folgende Zeile hinzu:
Start-process "C:temppsNetFrameworkNDP462.exe" -argumentlist /q /norestart
Wenn Sie die Installationsdatei nach Fertigstellung der Installation löschen möchten, sollten Sie diese Zeile am Ende des Skripts hinzufügen:
remove-item -path "C:temppsNetFrameworkNDP462.exe" -recurse -force
Mit PowerShell und Posh-SSH können Sie Vorgänge in PowerShell automatisieren und dabei das SFTP-Protokoll nutzen, um Dateien zwischen Hosts im Netzwerk zu kopieren. Sie können ein Skript zum Herunterladen und Ausführen von Dateien erstellen, um Zeit zu sparen, wenn Sie eine Masseninstallation von Software auf einer großen Anzahl von Computern durchführen müssen.
Fazit
Jetzt können Sie Dateien über SFTP auf Linux-Rechner kopieren oder von diesen herunterladen, sofern auf den Linux-Rechnern ein SSH-Server konfiguriert ist. Posh-SSH ist ein PowerShell-Modul, das erforderlich ist, um SFTP auf Windows-Rechnern zu nutzen, von denen aus Sie auf entfernte SFTP-Server zugreifen und SFTP-Automatisierungsaufgaben ausführen möchten. PowerShell und SFTP können von Managed Services Providern und Systemadministratoren in Unternehmen genutzt werden.
PowerShell wird häufig zum Management von virtuellen Hyper-V- und VMware-Maschinen verwendet (unter PowerCLI). Denken Sie daran, Backups der virtuellen Hyper-V-Maschinen zu erstellen. So wie PowerShell zur Automatisierung von Befehlen dient, automatisiert NAKIVO Backup & Replication die Sicherung virtueller Maschinen und bietet zahlreiche zusätzliche Funktionen zur Datensicherheit. Darüber hinaus unterstützt das Produkt den Multi-Mandanten-Modus, was insbesondere für Managed Services Provider von Nutzen ist. Herunterladen der kostenlosen Ausgabe von NAKIVO Backup & Replication und beginnen Sie noch heute mit dem Schutz Ihrer virtuellen und physischen Maschinen.










