SFTP w PowerShell
O SFTP słów kilka
SFTP, rozwijany jako SSHSSH, Secure Shell, protokół zapewniający bezpieczną komunikację na niezabezpieczonej sieci. Zwykle sprowadza się to do zdalnej konsoli pozwalającej na wykonywanie poleceń. File Transfer Protocol, Secure File Transfer Protocol lub, popularnie, bezpieczny FTP. Tak jak FTP, tak i SFTP służy do zarządzania plikami. Z tą różnicą, że SFTP zapewnia bezpieczny kryptograficznie transfer.
Aplikacje klienckie
Do zarządzania zasobami poprzez SFTP w środowisku Windows można stosować wiele narzędzi. Jest FileZilla, graficzne narzędzie dostępne na wielu platformach (Windows, Linux). Jest PuTTY, szerzej znany jako klient SSH, ale dostępny także dla SFTP pod nazwą PSFTP (psftp.exe). Jest w końcu, moim zdaniem najpopularniejszy i najwygodniejszy w obsłudze, WinSCP. Najwygodniejszy, bo posiada graficzny interfejs użytkownika. Elastyczny, bo umożliwia wykonywanie zadań z linii poleceń. Co więcej, biblioteka, dostępna dla środowiska .NET, może być dołączana do własnych aplikacji i, co najbardziej teraz istotne, ładnie integrująca się z PowerShell.
Wymagania wstepne
Aby ustanowić połączenie SFTP musimy pobrać biliotekę WinSCPnet.dll. Jeżeli mamy już zainstalowaną plikację WinSCP, możemy ją znaleźć w katalogu instalacyjnym. W moim przypadku jest to:
C:\Program Files (x86)\WinSCP\WinSCPnet.dll
Jeżeli nie mamy WinSCP, można tę bibliotekę pobrać z Internetu, najlepiej bezpośrednio ze strony WinSCP. W momencie pisania tego akapitu była to podstrona Downloading and Installing WinSCP .NET Assembly.
Ostatni etap to pobranie parametrów połączenia:
- Adresu serwera z plikami
- Nazwy użytkownika
- Hasła użytkownika
- Skrótu klucza hosta
Adres, login i hasło nie wymagają wyjaśnień i powinniśmy je dostać od administratora. Ta ostatnia wartość może być zakakująca, ale i tę wartość powinien nam dać administrator. Więcej informacji można znaleźć na stronie WinSCP. Poniżej zamieszczam tylko krótki wycinak:
You should get an SSH host key fingerprint along with your credentials from a server administrator. Knowing the host key fingerprint and thus being able to verify it is an integral part of securing an SSH connection. It prevents man-in-the-middle attacks.
Wartość ta jest pochodną publicznego klucza serwera SFPT i jest taka sama dla wszystkich użytkowników. Jeżeli administrator tej wartości nie poda, można ją skopiować od innych użytkowników - będzie zawsze taka sama.
PowerShell
Po uzyskaniu wszystkich parametrów, samo połączenie jest już proste:
Add-Type -Path 'WinSCPnet.dll' $sessionOptions = New-Object WinSCP.SessionOptions -Property @{ Protocol = [WinSCP.Protocol]::Sftp HostName = "myserver.com" UserName = "MyLogin" Password = "MyP@ssłorD" SshHostKeyFingerprint = "ecdsa-sha2-nistp256 256 23:22:6f:dd:23:de:12:90:ff:ab:09:18:28:11:90:0e" } $session = New-Object WinSCP.Session try { $session.Open($sessionOptions) $session.ListDirectory("/subfolder").Files | ft } finally { $session.Dispose() }
W wyniku wykonania tego skryptu, oczywiście w zależności od zawartości systemu plików, możemy otrzymać mniej więcej taką odpowiedź:
Name FullName FileType Length Length32 LastWriteTime FilePermissions Owner Group IsDirectory ---- -------- -------- ------ -------- ------------- --------------- ----- ----- ----------- Plik1.txt /subfolder/Plik1.txt - 1315 1315 2018-06-21 09:22:21 rw-rw-r-- 1017 100 False FOLDER1 /subfolder/FOLDER1 d 0 0 2018-06-26 10:16:24 rwxr-xr-x 1017 100 True FOLDER2 /subfolder/FOLDER2 d 0 0 2016-09-28 16:53:55 rwxr-xr-x 1017 100 True (kolejne pozycje)
W pokazanym przykładzie użyta została metoda ListDirectory. Po otwarciu sesji i przed jej zamknięciem do naszej dyspozycji pozostaje znacznie więcej metod: GetFiles, PutFiles, RemoveFiles czy CreateDirectory. Dzięki mechanizmowi podpowiadania składni wystarczy wpisać $session, potem kropkę i uzyskać całą listę możliwości. Wszystko opisane jest w dokumentacji, ale w większości przypadków same nazwy dość jasno określają przeznaczenie metod.
Kategoria:PowerShell
Brak komentarzy - bądź pierwszy