Spis treści:

Kategoria:PowerShell


SFTP w PowerShell

Automatyzacja PowerShell i SFTP

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

, 2018-12-21

Brak komentarzy - bądź pierwszy

Dodaj komentarz
Wyślij
Ostatnie komentarze
Dzieki za te informacje. były kluczowe
Dobrze wyjaśnione, dzięki !
a z innej strony - co gdybym ciąg znaków chciał mieć rozbity nie na wiersze a na kolumny? Czyli ciąg ABCD: 1. kolumna: A, 2. kolumna: B, 3. kolumna: C, 4 kolumna: D?