Jak tworzyć narzędzia PowerShell do konfiguracji SFTP
Jeśli korzystasz z wielu komputerów z systemem Windows, może zaistnieć potrzeba uzyskania dostępu do zasobów współdzielonych przy użyciu różnych protokołów. Po utworzeniu udziału plików na komputerze z systemem Windows zazwyczaj stosowany jest protokół SMB. Jednak pliki można udostępniać na komputerach z innymi systemami operacyjnymi, korzystając z protokołów NFS, FTP, SFTP, FTPS, SCP i innych. Jeśli korzystasz wyłącznie z PowerShell, na przykład w systemie Windows Server bez interfejsu graficznego, pierwsze połączenie z udziałem SFTP może wydawać się trudne. W tym wpisie na blogu wyjaśniono, jak korzystać z protokołu SFTP w systemie Windows za pomocą PowerShell.
Czym jest SFTP?
Skrót SFTP oznacza SSH File Transfer Protocol lub Secure File Transfer Protocol. SFTP stanowi bezpieczną alternatywę dla tradycyjnego protokołu FTP (File Transfer Protocol), oferując podobne funkcje. SFTP działa w warstwie aplikacji modelu OSI (warstwa 7), wykorzystuje połączenie SSH i jest szczególnie popularny na komputerach z systemem Linux, które zazwyczaj mają wbudowanego klienta SFTP obsługującego wiersz poleceń. Jeśli korzystasz z systemu Windows, zainstaluj darmowego klienta SSH, takiego jak WinSCP, który posiada interfejs graficzny i obsługuje nie tylko SFTP, lub skonfiguruj narzędzia PowerShell, jeśli chcesz korzystać z wiersza poleceń. System Windows i PowerShell nie obsługują SFTP natywnie, więc konieczne będzie zainstalowanie dodatkowych komponentów.
Podczas korzystania z połączenia SSH transfer danych w sieci jest szyfrowany, a połączenie jest bezpieczne, w przeciwieństwie do tradycyjnego, nieszyfrowanego protokołu FTP, w którym dane mogą zostać przechwycone przez atakujących. SSH służy do uwierzytelniania, a jeśli posiadasz dane logowania użytkownika systemu Linux, możesz uzyskać dostęp do plików na docelowym komputerze z systemem Linux po przejściu uwierzytelniania z poziomu klienta SFTP z wierszem poleceń lub klienta z interfejsem graficznym. Pozwala to również na kopiowanie plików z/na zdalny komputer z systemem Linux na lokalny komputer z systemem Linux lub Windows. Konfiguracja serwera SFTP w systemie Linux nie jest trudna – wystarczy zainstalować serwer SSH, utworzyć użytkowników i przyznać im niezbędne uprawnienia do plików i katalogów.
Nie należy mylić protokołów SFTP i FTPS. Oba te protokoły służą do podobnych celów. Jednak SFTP używa jednego numeru portu do połączenia, a FTPS używa wielu numerów portów dla kanałów sterowania i danych (co może być trudniejsze do skonfigurowania z punktu widzenia bezpieczeństwa, w tym zapór sieciowych). FTPS to FTP z SSL (Secure Socket Layer). W tym wpisie na blogu nie zagłębiam się w sposób konfiguracji serwera SFTP. Przeczytaj o instalacji i konfiguracji systemu Linux (w tym serwera SSH) na Hyper-V w tutaj.
Instalacja modułu Posh-SSH
Aby wykonywać operacje na plikach (kopiowanie, usuwanie) na komputerach zdalnych przy użyciu protokołów SFTP i SCP w PowerShell, należy zainstalować moduł Posh-SSH w PowerShell. Zainstalowanie tego modułu pozwala również na uruchamianie poleceń zdalnych na komputerze zdalnym przy użyciu sesji SSH. Do zainstalowania i używania modułu Posh-SSH wymagane są programy PowerShell 3.0 i .NET Framework 4.0. Moduł ten można zatem zainstalować w systemie Windows 8 lub nowszych wersjach systemu Windows. W systemie Windows 7 SP1 można również ręcznie zaktualizować programy PowerShell i .NET Framework. Aby zainstalować moduł SFTP programu PowerShell (Posh-SSH), należy uruchomić następujące polecenie: install-module posh-ssh
Alternatywnie możesz użyć tego polecenia, aby zainstalować moduł Posh-SSH dla PowerShell:
iex (New-Object Net.WebClient).DownloadString("https://gist.github.com/darkoperator/6152630/raw/c67de4f7cd780ba367cccbc2593f38d18ce6df89/instposhsshdev")
Do zainstalowania modułu Posh-SSH za pomocą powyższych poleceń wymagane jest połączenie z Internetem. W moim przypadku użyłem modułu Posh-SSH w PowerShell i mogę przejść do kolejnych kroków konfiguracji.
Łączenie się ze zdalnym hostem w PowerShell
W tym wpisie na blogu korzystam ze środowiska z lokalnym komputerem z systemem Windows i zdalnym komputerem z systemem Linux, które są podłączone do tej samej sieci:
- 192.168.101.210 to lokalny komputer z systemem Windows 10 w wersji 20H2
- 192.168.101.209 to zdalny komputer z systemem Linux, na którym działa serwer SSH (SFTP)
- user1 to nazwa użytkownika systemu Linux
Te adresy IP są używane w moich przykładach. Wprowadź swoje adresy IP i dane uwierzytelniające w odpowiednich poleceniach i plikach konfiguracyjnych.
Sprawdźmy nasz udział SFTP, łącząc się z serwerem Linux za pośrednictwem SFTP przy użyciu WinSCP, darmowego klienta SFTP dla systemu Windows. Łączenie się z serwerem SFTP jest proste. Wprowadź adres IP hosta docelowego, numer portu (domyślnym numerem portu jest TCP 22, ale można skonfigurować serwer SSH tak, aby używał niestandardowego numeru portu), nazwę użytkownika i hasło, aby się połączyć. Nie zapomnij wybrać protokołu SFTP.
W moim przypadku połączenie SFTP działa. Skopiowaliśmy dwa pliki do folderu współdzielonego (lokalizacja plików to /home/user1/shared/ na zdalnej maszynie z systemem Linux). Przyjrzyjmy się, jak połączyć się z folderem współdzielonym z systemu Windows oraz jak korzystać z SFTP za pomocą Posh-SSH w PowerShell.
Aby pracować z plikami przez SFTP, należy najpierw nawiązać sesję. W tym celu uruchom w PowerShell następujące polecenie:
New-SFTPSession -Computername 192.168.101.209
Po uruchomieniu polecenia wyświetli się okno uwierzytelniania. Wprowadź nazwę użytkownika i hasło, aby uzyskać dostęp do zdalnej maszyny z systemem Linux, na której znajdują się pliki, do których potrzebujesz dostępu przez SFTP. Jeśli wprowadziłeś prawidłowe dane uwierzytelniające, powinieneś zobaczyć wynik PowerShell z informacjami o numerze sesji SFTP, adresie IP zdalnego hosta i statusie połączenia. Po utworzeniu sesji przypisywany jest jej numer indeksowy.
Zawsze możesz wprowadzić polecenie pomocy z odpowiednimi argumentami, aby wyświetlić krótką informację o składni poleceń PowerShell:
help New-SFTPSession
Wyświetl listę wszystkich dostępnych poleceń posh PowerShell: Get-Command -Module Posh-SSH
lub
Get-command -Name * -module *posh-ssh
Oto sposób na utworzenie sesji SSH, która pozwala na uruchomienie polecenia na zdalnym hoście, na przykład w celu wyświetlenia listy plików w katalogu:
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"
Tworzenie skryptu PowerShell
Stwórzmy skrypt testowy, aby zapoznać się z podstawowymi operacjami, które można wykonać w PowerShell podczas pracy z zasobami SFTP. Nie jest to skrypt SFTP, lecz skrypt PowerShell do pracy z SFTP. Ten skrypt testowy powinien skopiować plik instalatora .NET Framework ze zdalnej maszyny z systemem Linux na lokalną maszynę z systemem Windows.
Utwórz plik skryptu test-PS.ps1 o treści przedstawionej poniżej.
#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
Otwórz PowerShell na komputerze z systemem Windows, przejdź do folderu, w którym znajduje się ten skrypt testowy, i uruchom skrypt
.test-PS.ps1
Plik NetFrameworkNDP462.exe powinien zostać skopiowany z /home/user1/shared/ (na zdalnym komputerze z systemem Linux) do C:tempps (na lokalnym komputerze z systemem Windows). Jak widać na poniższym zrzucie ekranu, w moim przypadku plik został skopiowany pomyślnie.
Aby wyświetlić listę plików w katalogu w zasobie SFTP, można utworzyć skrypt PowerShell o następującej treści:
$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
Gdzie:
Your_Password000 to hasło do konta użytkownika używanego do połączenia przez SSH z udziałem SFTP;
user1 to nazwa użytkownika;
192.168.101.209 to adres IP zdalnego hosta, z którym łączymy się w celu uzyskania dostępu do plików przez SFTP.
Zapisz skrypt jako list-files.ps1 i uruchom go w PowerShell na swoim komputerze lokalnym z folderu, w którym znajduje się ten plik skryptu.
.list-files.ps1
Zwróć uwagę na parametr -Recursive zdefiniowany w skrypcie testowym. Na poniższym zrzucie ekranu widać wyniki dla użycia parametru -Recursive oraz bez tego parametru.
Jedną z wad uruchamiania skryptów, takich jak te pokazane w powyższych przykładach, jest to, że poświadczenia są przechowywane w postaci zwykłego tekstu w skrypcie, co nie jest bezpieczne. Użytkownik, który może otworzyć skrypt (nawet z uprawnieniami tylko do odczytu), może zobaczyć hasło i użyć go do nieautoryzowanego dostępu.
Istnieje metoda pozwalająca podnieść poziom bezpieczeństwa i przechowywać hasło w postaci zaszyfrowanej w pliku. Do szyfrowania hasła wykorzystywany jest interfejs API ochrony danych systemu Windows, dzięki czemu dostęp do niego ma wyłącznie użytkownik korzystający z konta i komputera, na którym utworzono ten plik haseł. (get-credential).password | ConvertFrom-SecureString | set-content "C:temppassword.txt"
Wówczas hasło zostanie zapisane w postaci zaszyfrowanej w pliku tekstowym. Jeśli ktoś zajrzy do tego pliku, hasło nie będzie widoczne jako zwykły tekst.
Gdy trzeba będzie wprowadzić hasło, należy wskazać plik z zapisanym zaszyfrowanym hasłem (w naszym przypadku: C:temppassword.txt ).
$password = Get-Content "C:temppassword.txt" | ConvertTo-SecureString
$credential = New-Object System.Management.Automation.PsCredential("user1",$password)
Ta metoda definiowania hasła jest bezpieczniejsza. Można modyfikować skrypt, w którym zdefiniowano hasło. Zamiast otwierać skrypt w edytorze tekstowym, można kliknąć prawym przyciskiem myszy plik ps1 i w menu kontekstowym kliknąć Edit.
Otworzy się Windows PowerShell ISE. Jest to natywne narzędzie systemu Windows, które dla wygody użytkownika podświetla składnię kolorami i wyświetla dostępne polecenia PowerShell w prawym panelu.
Polecenia w skrypcie testowym wyglądają teraz następująco:
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
Można ponownie zmodyfikować skrypt i ustawić go tak, aby uruchamiał pobrany plik instalatora na komputerze z systemem Windows. Polecenie instalacji platformy .NET Framework w trybie cichym (z katalogu, w którym znajduje się plik instalatora) brzmi:
.NetFrameworkNDP462.exe /q /norestart
Wprowadź nazwę pliku instalacyjnego, jeśli jest ona inna.
Dodaj na końcu skryptu wiersz:
Start-process "C:temppsNetFrameworkNDP462.exe" -argumentlist /q /norestart
Jeśli chcesz usunąć plik instalacyjny po zakończeniu instalacji, rozważ dodanie tego wiersza na końcu skryptu:
remove-item -path "C:temppsNetFrameworkNDP462.exe" -recurse -force
Korzystanie z PowerShell i Posh-SSH pozwala zautomatyzować operacje w PowerShell przy użyciu protokołu SFTP do kopiowania plików między hostami w sieci. Możesz utworzyć skrypt do pobierania plików i ich wykonywania, aby zaoszczędzić czas, gdy musisz przeprowadzić masową instalację oprogramowania na dużej liczbie komputerów.
Wniosek
Teraz możesz kopiować pliki do/z maszyn z systemem Linux za pośrednictwem SFTP, jeśli na maszynach z systemem Linux skonfigurowano serwer SSH. Posh-SSH to moduł PowerShell wymagany do korzystania z SFTP na maszynach z systemem Windows, z których chcesz uzyskać dostęp do zdalnych serwerów SFTP i wykonywać zadania automatyzacji SFTP. Z PowerShell i SFTP mogą korzystać dostawcy usług zarządzanych oraz administratorzy systemów w organizacjach.
PowerShell jest często używany do zarządzania maszynami wirtualnymi Hyper-V i VMware (w PowerCLI). Pamiętaj o wykonywaniu kopii zapasowej maszyn wirtualnych Hyper-V. Tak jak PowerShell służy do automatyzacji uruchamiania poleceń, tak NAKIVO Backup & Replication automatyzuje tworzenie kopii zapasowych maszyn wirtualnych i zapewnia wiele dodatkowych funkcji ochrony danych. Ponadto produkt obsługuje tryb multi-tenant, co jest szczególnie przydatne dla dostawców usług zarządzanych. Pobierz bezpłatną edycję programu NAKIVO Backup & Replication i już dziś zacznij chronić swoje maszyny wirtualne i fizyczne.










