Jak tworzyć narzędzia PowerShell do konfiguracji SFTP

W przypadku korzystania z wielu komputerów z systemem Windows może zaistnieć potrzeba uzyskania dostępu do współdzielonych zasobów 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 na przykład korzystasz wyłącznie z programu PowerShell na serwerze z systemem 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ą programu PowerShell.

NAKIVO – wykonanie kopii zapasowej w systemie Windows

NAKIVO – wykonanie kopii zapasowej w systemie Windows

Szybkie wykonanie kopii zapasowej serwerów i stacji roboczych z systemem Windows na miejscu, poza siedzibą firmy oraz w chmurze. Odzyskiwanie całych maszyn i obiektów w ciągu kilku minut, co zapewnia krótki czas przywrócenia (RTO) i maksymalny czas sprawności.

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 graficzny interfejs użytkownika (GUI) i obsługuje nie tylko protokół SFTP, lub skonfiguruj narzędzia PowerShell, jeśli musisz korzystać z wiersza poleceń. System Windows i PowerShell nie obsługują protokołu SFTP natywnie, więc konieczne będzie zainstalowanie dodatkowych komponentów.

W przypadku korzystania z połączenia SSH transfer danych przez sieć 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. Protokół 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 pomyślnym uwierzytelnieniu za pomocą klienta SFTP działającego w wierszu 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 oraz 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 wykorzystuje jeden numer portu do połączenia, a FTPS używa wielu numerów portów dla kanałów sterujących i danych (co może być trudniejsze do skonfigurowania z punktu widzenia bezpieczeństwa, w tym w przypadku zapór sieciowych). FTPS to FTP z protokołem SSL (Secure Socket Layer). W tym wpisie na blogu nie omawiam sposobu konfiguracji serwera SFTP. Przeczytaj o instalacji i konfiguracji systemu Linux (w tym serwera SSH) na Hyper-V pod adresem 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 PowerShellu, należy zainstalować moduł Posh-SSH w PowerShellu. Zainstalowanie tego modułu pozwala również na uruchamianie poleceń zdalnych na komputerze zdalnym za pomocą sesji SSH. Do zainstalowania i korzystania z modułu Posh-SSH wymagane są PowerShell 3.0 oraz .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ć PowerShell i .NET Framework. Aby zainstalować moduł SFTP dla PowerShell (Posh-SSH), należy uruchomić następujące polecenie: install-module posh-ssh

Posh PowerShell – installing the PowerShell SFTP module

Alternatywnie możesz użyć poniższego 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 PowerShellu i mogę przejść do kolejnych kroków konfiguracji.

Łączenie się ze zdalnym hostem w PowerShellu

W tym wpisie na blogu korzystam ze środowiska składającego się z lokalnego komputera z systemem Windows oraz zdalnego komputera 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 z systemem Linux za pośrednictwem protokołu 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 serwer SSH można skonfigurować tak, aby korzystał z niestandardowego numeru portu), nazwę użytkownika i hasło, aby nawiązać połączenie. Nie zapomnij wybrać protokołu SFTP.

How to use SFTP – connecting to a remote machine in WinSCP

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 PowerShellu.

How to use SFTP in Windows

Aby pracować z plikami za pośrednictwem SFTP, należy najpierw nawiązać sesję. W tym celu uruchom w PowerShellu 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 chcesz uzyskać dostęp za pośrednictwem SFTP. Jeśli wprowadziłeś prawidłowe dane uwierzytelniające, w PowerShellu powinny pojawić się informacje o numerze sesji SFTP, adresie IP zdalnego hosta oraz stanie połączenia. Po utworzeniu sesji przypisywany jest jej numer indeksowy.

How to use SFTP in PowerShell – connecting to a server and creating a new session

Zawsze możesz wpisać polecenie pomocy z odpowiednimi argumentami, aby wyświetlić skróconą informację o składni poleceń PowerShell:

help New-SFTPSession

Wyświetl listę wszystkich dostępnych poleceń 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"

PowerShell SFTP – listing files in a directory of an SFTP server

Tworzenie skryptu PowerShell

Stwórzmy skrypt testowy, aby zapoznać się z podstawowymi operacjami, jakie można wykonać w PowerShell podczas pracy z zasobami SFTP. Nie jest to skrypt SFTP, lecz skrypt PowerShell służący do pracy z SFTP. Ten skrypt testowy powinien skopiować plik instalatora platformy .NET Framework ze zdalnej maszyny z systemem Linux na lokalną maszynę z systemem Windows.

Utwórz test-PS.ps1 plik skryptu 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 go

.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ł pomyślnie skopiowany.

PowerShell SFTP – copying a file from an SFTP server in PowerShell

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 PowerShellu 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 uzyskane przy użyciu parametru -Recursive oraz bez tego parametru.

How to use SFTP in PowerShell – checking contents of a directory on a remote server

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 wykorzystać je do nieautoryzowanego dostępu.

Istnieje sposób na zwiększenie poziomu bezpieczeństwa i zapisanie hasła w postaci zaszyfrowanej w pliku. Do szyfrowania hasła wykorzystywany jest interfejs API ochrony danych systemu Windows, dzięki czemu dostęp do niego mają wyłącznie konto użytkownika i komputer, na którym utworzono ten plik z hasłami. (get-credential).password | ConvertFrom-SecureString | set-content "C:temppassword.txt"

How to use SFTP in PowerShell – saving an encrypted password to a file

Wówczas hasło jest zapisywane w postaci zaszyfrowanej w pliku tekstowym. Jeśli ktoś zajrzy do zawartości tego pliku, hasło nie zostanie wyświetlone jako zwykły tekst.

A password for an SFTP user account is encrypted and saved in the text file

Gdy trzeba wprowadzić hasło, należy wskazać plik z zapisanym zaszyfrowanym hasłem ( C:temppassword.txt – w naszym przypadku).

$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. Jako alternatywę dla otwierania skryptu w edytorze tekstowym możesz kliknąć prawym przyciskiem myszy plik ps1 i w menu kontekstowym wybrać opcję Edit.

PowerShell SFTP automation – editing a script file

Otworzy się Windows PowerShell ISE. Jest to natywne narzędzie systemu Windows, które dla większej wygody podświetla składnię kolorami i wyświetla dostępne polecenia PowerShell w prawym panelu.

SFTP script editing for running in PowerShell

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żesz ponownie zmodyfikować swój skrypt i skonfigurować go tak, aby uruchamiał pobrany plik instalatora na komputerze z systemem Windows. Polecenie służące do zainstalowania platformy .NET Framework w trybie cichym (z katalogu, w którym znajduje się plik instalatora) brzmi:

.NetFrameworkNDP462.exe /q /norestart

Wpisz nazwę swojego pliku instalacyjnego, jeśli jest ona inna.

Dodaj następujący wiersz na końcu skryptu:

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 uruchamiania, aby zaoszczędzić czas, gdy musisz przeprowadzić masową instalację oprogramowania na dużej liczbie komputerów.

Wnioski

Teraz możesz kopiować pliki do/z maszyn z systemem Linux za pośrednictwem SFTP, jeśli na tych maszynach skonfigurowano serwer SSH. Posh-SSH to moduł PowerShell niezbędny do korzystania z protokołu SFTP na komputerach 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.

Wypróbuj NAKIVO Backup & Replication

Wypróbuj NAKIVO Backup & Replication

Skorzystaj z bezpłatnej wersji próbnej, aby zapoznać się ze wszystkimi funkcjami rozwiązania w zakresie ochrony danych. 15 dni za darmo. Bez żadnych ograniczeń dotyczących funkcji ani pojemności. Nie jest wymagana karta kredytowa.

People also read