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.
Co to jest SFTP?
SFTP to skrót od SSH File Transfer Protocol lub Secure File Transfer Protocol. SFTP jest bezpieczną alternatywą dla tradycyjnego protokołu przesyłania plików (FTP) z podobną funkcją. SFTP działa na warstwie aplikacji modelu OSI (warstwa 7), wykorzystuje połączenie SSH i jest szczególnie popularny na maszynach Linux, które zazwyczaj mają wbudowanego klienta SFTP z wiersza poleceń. Jeśli używasz Windows, zainstaluj bezpłatny klient SSH, taki jak WinSCP, który ma GUI i obsługuje więcej niż tylko SFTP, lub skonfiguruj narzędzia PowerShell, jeśli potrzebujesz używać wiersza poleceń. Windows i PowerShell nie obsługują natywnie SFTP, więc konieczne będzie zainstalowanie dodatkowych komponentów.
Podczas korzystania z połączenia SSH, transfery danych przez sieć są szyfrowane, 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 masz poświadczenia użytkownika Linux, możesz uzyskać dostęp do plików na docelowej maszynie Linux po uwierzytelnieniu z klienta SFTP wiersza poleceń lub klienta GUI. Pozwala to również na kopiowanie plików z/do zdalnej maszyny Linux na lokalną maszynę Linux lub Windows. Konfiguracja serwera SFTP na Linux nie jest trudna – instalujesz serwer SSH, tworzysz użytkowników i nadajesz im potrzebne uprawnienia do plików i katalogów.
Nie myl SFTP i FTPS. Te dwa protokoły są używane do podobnych celów. Jednak SFTP używa jednego numeru portu dla połączenia, a FTPS używa kilku numerów portów dla kanałów kontrolnych i danych (co może być trudniejsze do skonfigurowania z perspektywy bezpieczeństwa, w tym zapór). FTPS to FTP z SSL (Secure Socket Layer). Nie omawiam tutaj, jak skonfigurować serwer SFTP. Przeczytaj o instalacji i konfiguracji Linux (w tym serwera SSH) na Hyper-V w tutaj.
Instalowanie modułu Posh-SSH
Aby przeprowadzać operacje na plikach (kopiowanie plików, usuwanie plików) na zdalnych maszynach, używając SFTP i SCP w PowerShell, musisz zainstalować moduł Posh-SSH w PowerShell. Instalacja tego modułu pozwala również uruchamiać zdalnie komendy na zdalnym komputerze za pomocą sesji SSH. PowerShell 3.0 i .NET Framework 4.0 są wymagane do zainstalowania i używania Posh-SSH. Dlatego można zainstalować ten moduł w systemie Windows 8 lub nowszym. Możesz także ręcznie zaktualizować PowerShell i .NET Framework w Windows 7 SP1. Uruchom tę komendę, aby zainstalować moduł PowerShell SFTP (Posh-SSH): install-module posh-ssh
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.
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.
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.
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 metoda tworzenia sesji SSH, która umożliwia uruchomienie polecenia na zdalnym hostcie, na przykład, aby wymienić pliki 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
Utwórzmy skrypt testowy, aby zbadać podstawowe operacje, które można wykonywać w PowerShell podczas pracy z zasobami SFTP. To nie jest skrypt SFTP, to jest skrypt PowerShell do pracy z SFTP. Ten skrypt testowy powinien skopiować plik instalatora .NET Framework z zdalnej maszyny Linux na lokalną maszynę z Windows.
Utwórz plik skryptu test-PS.ps1 zawierający 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 maszynie z Windows, przejdź do folderu, w którym przechowywany jest ten skrypt testowy, i uruchom skrypt
.test-PS.ps1
Plik NetFrameworkNDP462.exe powinien zostać skopiowany z /home/user1/shared/ (na zdalnej maszynie Linux) do C:tempps (na lokalnej maszynie z Windows). Jak widać na zrzucie ekranu poniżej, plik został pomyślnie skopiowany w moim przypadku.
Aby wymienić pliki w katalogu w zasobie SFTP, można utworzyć skrypt PowerShell z następującą zawartoś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 jest hasłem dla konta użytkownika używanym do połączenia przez SSH z udostępnianiem SFTP;
user1 jest nazwą użytkownika;
192.168.101.209 jest adresem IP zdalnego hosta, do którego podłączamy się, aby uzyskać dostęp do plików przez SFTP.
Zapisz skrypt jako list-files.ps1 i uruchom ten skrypt w PowerShell na lokalnej maszynie z folderu, w którym przechowywany jest ten plik skryptu.
.list-files.ps1
Zwróć uwagę na -Recursive parametr zdefiniowany w skrypcie testowym. Na zrzucie ekranu poniżej można zobaczyć wyniki stosowania 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 czystym tekście skryptu, 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ć tego hasła do nieautoryzowanego dostępu.
Istnieje metoda zwiększenia poziomu bezpieczeństwa i przechowywania hasła w zaszyfrowanym widoku w pliku. Windows Data Protection API służy do zaszyfrowania hasła, które można uzyskać tylko z konta użytkownika i komputera używanego do utworzenia tego pliku hasła. (get-credential).password | ConvertFrom-SecureString | set-content "C:temppassword.txt"
Hasło zostaje zapisane w zaszyfrowanej formie w pliku tekstowym. Jeśli ktoś zobaczy zawartość tego pliku, hasło nie jest wyświetlane jako tekst jawny.
Kiedy potrzebujesz wprowadzić hasło, zdefiniuj 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 definicji hasła jest bardziej bezpieczna. Możesz zmodyfikować swój skrypt, w którym zdefiniowałeś hasło. Zamiast otwierania skryptu w edytorze tekstu, możesz kliknąć prawym przyciskiem myszy na plik ps1 i w menu kontekstowym wybrać Edit.
Otwiera się Windows PowerShell ISE. To natywne narzędzie systemu Windows, które koloruje składnię dla większej wygody i wyświetla dostępne komendy PowerShell w prawym panelu.
Komendy w teście skryptu są teraz następujące:
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 ustawić go do wykonania pliku instalatora pobranego na komputerze z systemem Windows. Komenda do instalacji .NET Framework w trybie cichym (z katalogu, w którym znajduje się plik instalatora) to:
.NetFrameworkNDP462.exe /q /norestart
Wpisz nazwę swojego pliku instalacyjnego, jeśli nazwa jest inna.
Dodaj linię na końcu skryptu:
Start-process "C:temppsNetFrameworkNDP462.exe" -argumentlist /q /norestart
Jeśli chcesz usunąć plik instalacyjny po zakończeniu instalacji, rozważ dodanie tej linii na końcu skryptu:
remove-item -path "C:temppsNetFrameworkNDP462.exe" -recurse -force
Użycie PowerShell i Posh-SSH pozwala na automatyzację operacji w PowerShell z wykorzystaniem protokołu SFTP do kopiowania plików pomiędzy hostami w sieci. Możesz stworzyć skrypt do pobierania plików i ich wykonywania, aby zaoszczędzić czas, gdy musisz przeprowadzić masową instalację oprogramowania na dużej liczbie komputerów.
Podsumowanie
Teraz możesz kopiować pliki do/ze maszyn Linux przez SFTP, jeśli serwer SSH jest skonfigurowany na maszynach Linux. Posh-SSH to moduł PowerShell, który jest wymagany do korzystania z SFTP na komputerach z Windows, z których chcesz uzyskać dostęp do zdalnych serwerów SFTP i wykonywać zadania automatyzacji SFTP. PowerShell i SFTP mogą być używane przez dostawców usług zarządzanych oraz administratorów systemów w organizacjach.
PowerShell jest często używany do zarządzania maszynami wirtualnymi Hyper-V oraz maszynami wirtualnymi VMware (w PowerCLI). Pamiętaj, aby wykonać kopię zapasową maszyn wirtualnych Hyper-V. Tak samo jak PowerShell jest używany do automatyzacji uruchamiania komend, NAKIVO Backup & Replication automatyzuje wykonywanie kopii zapasowych maszyn wirtualnych i zapewnia wiele dodatkowych funkcji ochrony danych. Co więcej, produkt wspiera instalację w Trybie 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.










