So erstellen Sie PowerShell-Tools zum Einrichten von SFTP
Wenn Sie mehrere Computer mit Windows verwenden, müssen Sie möglicherweise über verschiedene Protokolle auf freigegebene Ressourcen zugreifen. Wenn eine Dateifreigabe auf einem Windows-Computer erstellt wird, wird in der Regel das SMB-Protokoll verwendet. Dateien können jedoch auch auf Nicht-Windows-Computern von NFS, FTP, SFTP, FTPS, SCP und anderen Protokollen geteilt werden. Wenn Sie beispielsweise nur PowerShell auf Windows Server ohne grafische Benutzeroberfläche verwenden, kann die erstmalige Verbindung mit der SFTP-Dateifreigabe schwierig erscheinen. In diesem Blogbeitrag wird erläutert, wie Sie SFTP in Windows mit PowerShell verwenden.
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 beliebt auf Linux-Rechnern, die in der Regel über einen integrierten SFTP-Client in der 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, wenn Sie die Befehlszeile verwenden müssen. Windows und PowerShell unterstützen SFTP nicht nativ, daher müssen zusätzliche Komponenten installiert werden.
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 für die Authentifizierung verwendet. Wenn Sie über Linux-Anmeldeinformationen verfügen, können Sie nach erfolgreicher Authentifizierung über Ihren SFTP-Befehlszeilen-Client oder einen GUI-Client auf Dateien auf einem Linux-Zielrechner zugreifen. Außerdem können Sie Dateien von/auf einen Remote-Linux-Rechner auf Ihren lokalen Linux- oder Windows-Rechner kopieren. Die Konfiguration des SFTP-Servers unter Linux ist nicht schwierig: Sie installieren den SSH-Server, erstellen Benutzer und erteilen die erforderlichen Berechtigungen für Benutzer und Dateien/Verzeichnisse.
Verwechseln Sie SFTP und FTPS nicht. Diese beiden Protokolle werden für ähnliche Zwecke verwendet. SFTP verwendet jedoch eine Portnummer für eine Verbindung, während FTPS mehrere Portnummern für Steuerungs- und Datenkanäle verwendet (was aus Gründen 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 Operationen mit Dateien (Kopieren, Löschen) auf Remote-Computern durchzuführen, müssen Sie das Posh-SSH-Modul in PowerShell installieren. Durch die Installation dieses Moduls können Sie auch Remote-Befehle auf einem Remote-Computer über die SSH-Sitzung ausführen. Für die Installation und Verwendung von Posh-SSH sind PowerShell 3.0 und .NET Framework 4.0 erforderlich. Sie können dieses Modul also unter Windows 8 oder neueren Windows-Versionen installieren. Sie können PowerShell und .NET Framework auch manuell unter Windows 7 SP1 aktualisieren. Führen Sie diesen Befehl aus, um das PowerShell-SFTP-Modul (Posh-SSH) zu installieren:
install-module posh-ssh
Alternativ können Sie dieses Modul mit dem folgenden Befehl 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 Fall habe ich das Posh-SSH-Modul in PowerShell installiert und kann mit den weiteren Konfigurationsschritten fortfahren.
Verbinden mit einem Remote-Host in PowerShell
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 mit Windows 10 Version 20H2
- 192.168.101.209 ist ein Remote-Linux-Rechner, auf dem der SSH-Server (SFTP) 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.
Überprüfen wir unsere SFTP-Freigabe, indem wir uns mit WinSCP, dem kostenlosen SFTP-Client für Windows, über SFTP mit dem Linux-Server verbinden. Die Verbindung zu einem SFTP-Server ist ganz einfach. Geben Sie die IP-Adresse des Zielhosts, die Portnummer (TCP 22 ist die Standard-Portnummer, Sie können einen SSH-Server jedoch so konfigurieren, dass er eine benutzerdefinierte Portnummer verwendet), den Benutzernamen und das Passwort für die Verbindung ein. 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 Standort der Dateien ist /home/user1/shared/ auf dem entfernten Linux-Rechner). Sehen wir uns nun an, wie Sie von Windows aus eine Verbindung zum freigegebenen Ordner herstellen und wie Sie SFTP mit Posh-SSH in PowerShell verwenden.
Um mit Dateien über SFTP zu arbeiten, müssen Sie zunächst eine Sitzung einrichten. 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-Computer mit den Dateien zuzugreifen, auf die Sie über SFTP zugreifen müssen. Wenn Sie die richtigen Anmeldeinformationen eingegeben haben, sollte die PowerShell-Ausgabe mit den Informationen zur SFTP-Sitzungsnummer, zur IP-Adresse des Remote-Hosts und zum 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 eine kurze Anzeige zur Syntax der PowerShell-Befehle zu erhalten:
help New-SFTPSession
Alle verfügbaren Posh-PowerShell-Befehle auflisten:
Get-Command -Module Posh-SSH
oder
Get-command -Name * -module *posh-ssh
Hier ist die Methode zum Erstellen einer SSH-Sitzung, mit der Sie einen Befehl auf einem Remote-Host ausführen können, z. B. 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 .NET Framework-Installationsdatei von einem Remote-Linux-Computer auf einen lokalen Windows-Computer 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, gehen Sie zu dem 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). Wie Sie auf dem Screenshot unten sehen können, wurde die Datei in meinem Fall erfolgreich kopiert.
Um Dateien in einem Verzeichnis in 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 zum Verbinden über SSH mit der 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 Computer aus einem Ordner aus, in dem diese Skriptdatei gespeichert ist.
.list-files.ps1
Achten Sie auf den -Recursive Parameter, der im Testskript definiert ist. Auf dem folgenden Screenshot sehen Sie die Ergebnisse für die Verwendung des Parameters -Recursive und ohne diesen Parameter.
Einer der Nachteile der Ausführung von Skripten, wie sie in den obigen Beispielen gezeigt werden, besteht darin, dass Anmeldeinformationen im Klartext eines Skripts gespeichert werden, was keine Sicherheit bietet. Ein Benutzer, der ein Skript öffnen kann (auch mit Lesezugriffsrechten), kann ein Passwort sehen und dieses Passwort für einen unbefugten Zugriff verwenden.
Es gibt eine Methode, um die Sicherheit zu verbessern und ein Passwort in verschlüsselter Form in einer Datei zu speichern. Die Windows Datensicherheit API wird verwendet, um ein Passwort zu verschlüsseln, auf das nur von dem Benutzerkonto und dem Computer zugegriffen werden kann, mit denen diese Passwortdatei erstellt wurde.
(get-credential).password | ConvertFrom-SecureString | set-content "C:temppassword.txt"
Anschließend wird das Passwort in verschlüsselter Form in der Textdatei gespeichert. Wenn jemand den Inhalt dieser Datei sieht, wird das Passwort nicht als Klartext angezeigt.
Wenn Sie das Passwort eingeben müssen, definieren Sie die Datei mit einem gespeicherten verschlüsselten Passwort (C:temppassword.txt in unserem Fall).
$password = Get-Content "C:temppassword.txt" | ConvertTo-SecureString
$credential = New-Object System.Management.Automation.PsCredential("user1",$password)
Diese Methode zur Definition eines Passworts bietet mehr Sicherheit. Sie können Ihr Skript, in dem Sie das Passwort definiert haben, ändern. Anstatt das Skript in einem Texteditor zu öffnen, können Sie mit der rechten Maustaste auf die Datei „ <“ >ps1 klicken und im Kontextmenü auf „ <“ >Bearbeitenklicken.
Windows PowerShell ISE wird geöffnet. Dies ist ein natives Windows-Tool, das die Syntax zur besseren Übersichtlichkeit farblich hervorhebt und die verfügbaren PowerShell-Befehle in der rechten Fensteranzeige 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 die heruntergeladene Installationsdatei auf dem Windows-Rechner ausgeführt wird. Der Befehl zum Installieren von .NET Framework im Hintergrundmodus (von dem Verzeichnis, in dem sich die Installationsdatei befindet) lautet:
.NetFrameworkNDP462.exe /q /norestart
Geben Sie den Namen Ihrer Installationsdatei ein, wenn dieser abweicht.
Fügen Sie die folgende Zeile am Ende des Skripts hinzu:
Start-process "C:temppsNetFrameworkNDP462.exe" -argumentlist /q /norestart
Wenn Sie die Installationsdatei nach Fertigstellen 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, indem Sie das SFTP-Protokoll zum Kopieren von Dateien zwischen Hosts im Netzwerk verwenden. 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/von Linux-Rechnern kopieren, wenn auf den Linux-Rechnern ein SSH-Server konfiguriert ist. Posh-SSH ist ein PowerShell-Modul, das erforderlich ist, um SFTP auf Windows-Rechnern zu verwenden, von denen aus Sie auf Remote-SFTP-Server zugreifen und SFTP-Automatisierungsaufgaben ausführen möchten. PowerShell und SFTP können von Managed Services Providern und Systemadministratoren in Unternehmen verwendet werden.
PowerShell wird häufig zur Verwaltung von Hyper-V-Virtuellen Maschinen und VMware-Virtuellen Maschinen verwendet (in PowerCLI). Denken Sie daran, Hyper-V-Virtual-Maschinen zu sichern. So wie PowerShell zur Automatisierung der Ausführung von Befehlen verwendet wird, automatisiert NAKIVO Backup & Replication die Sicherung von Virtual-Maschinen und bietet viele zusätzliche Funktionen zur Datensicherheit. Darüber hinaus unterstützt das Produkt den Multi-Mandanten-Modus, was besonders für Managed Service Provider nützlich ist. Herunterladen Sie die kostenlose Ausgabe von NAKIVO Backup & Replication und beginnen Sie noch heute mit dem Schutz Ihrer virtuellen und physischen Maschinen.










