Cách xây dựng các công cụ PowerShell để thiết lập SFTP

Khi bạn sử dụng nhiều máy tính chạy Windows, bạn có thể cần truy cập các tài nguyên được chia sẻ thông qua các giao thức khác nhau. Khi một thư mục chia sẻ được tạo trên máy tính Windows, giao thức SMB thường được sử dụng. Tuy nhiên, các tệp tin có thể được chia sẻ trên các máy tính không chạy Windows bằng cách sử dụng NFS, FTP, SFTP, FTPS, SCP và các giao thức khác. Ví dụ, nếu bạn chỉ sử dụng PowerShell trên Windows Server mà không có giao diện đồ họa, việc kết nối với thư mục chia sẻ SFTP lần đầu tiên có thể gặp khó khăn. Bài viết này sẽ hướng dẫn cách sử dụng SFTP trên Windows thông qua PowerShell.

NAKIVO cho sao lưu Windows

NAKIVO cho sao lưu Windows

Sao lưu nhanh các máy chủ và máy trạm Windows vào các vị trí tại chỗ, ngoài văn phòng và trên đám mây. Phục hồi toàn bộ hệ thống và các đối tượng chỉ trong vài phút, giúp giảm thiểu thời gian khôi phục (RTO) và tối đa hóa thời gian hoạt động.

SFTP là gì?

SFTP là viết tắt của SSH File Transfer Protocol (Giao thức truyền tệp qua SSH) hoặc Secure File Transfer Protocol (Giao thức truyền tệp an toàn). SFTP là giải pháp thay thế an toàn cho Giao thức truyền tệp truyền thống (FTP) với chức năng tương tự. SFTP hoạt động ở lớp ứng dụng của mô hình OSI (lớp 7), sử dụng kết nối SSH và đặc biệt phổ biến trên các máy Linux, vốn thường được tích hợp sẵn trình khách SFTP dòng lệnh. Nếu bạn sử dụng Windows, hãy cài đặt một trình khách SSH miễn phí như WinSCP, có giao diện đồ họa (GUI) và hỗ trợ nhiều giao thức ngoài SFTP, hoặc cấu hình các công cụ PowerShell nếu bạn cần sử dụng dòng lệnh. Windows và PowerShell không hỗ trợ SFTP theo mặc định, do đó cần cài đặt thêm các thành phần bổ sung.

Khi sử dụng kết nối SSH, dữ liệu truyền qua mạng được mã hóa và kết nối được bảo mật, khác với giao thức FTP truyền thống không được mã hóa, nơi dữ liệu có thể bị kẻ tấn công chặn lại. SSH được sử dụng để xác thực, và nếu bạn có thông tin đăng nhập người dùng Linux, bạn có thể truy cập các tệp trên máy Linux đích sau khi vượt qua quá trình xác thực từ trình khách SFTP dòng lệnh hoặc trình khách GUI của mình. Nó cũng cho phép bạn sao chép tệp từ/đến một máy Linux từ xa sang máy Linux hoặc Windows cục bộ của bạn. Việc cấu hình máy chủ SFTP trên Linux không khó – bạn chỉ cần cài đặt máy chủ SSH, tạo người dùng và cấp các quyền cần thiết cho người dùng cũng như tệp/thư mục.

Đừng nhầm lẫn giữa SFTP và FTPS. Hai giao thức này được sử dụng cho các mục đích tương tự. Tuy nhiên, SFTP sử dụng một số cổng duy nhất cho kết nối, trong khi FTPS sử dụng nhiều số cổng cho các kênh điều khiển và dữ liệu (điều này có thể phức tạp hơn khi cấu hình từ góc độ bảo mật, bao gồm cả tường lửa). FTPS là FTP được mã hóa bằng SSL (Secure Socket Layer). Bài viết này không đi sâu vào cách thiết lập máy chủ SFTP. Hãy tham khảo hướng dẫn cài đặt và cấu hình Linux (bao gồm máy chủ SSH) trên Hyper-V tại tại đây.

Cài đặt mô-đun Posh-SSH

Để thực hiện các thao tác với tệp (sao chép, xóa tệp) trên các máy từ xa bằng SFTP và SCP trong PowerShell, bạn cần cài đặt mô-đun Posh-SSH trong PowerShell. Việc cài đặt mô-đun này cũng cho phép bạn chạy các lệnh từ xa trên máy tính từ xa thông qua phiên SSH. PowerShell 3.0 và .NET Framework 4.0 là yêu cầu bắt buộc để cài đặt và sử dụng Posh-SSH. Do đó, bạn có thể cài đặt mô-đun này trên Windows 8 hoặc các phiên bản Windows mới hơn. Bạn cũng có thể cập nhật PowerShell và .NET Framework theo cách thủ công trên Windows 7 SP1. Chạy lệnh này để cài đặt mô-đun SFTP của PowerShell (Posh-SSH): install-module posh-ssh

Posh PowerShell – installing the PowerShell SFTP module

Ngoài ra, bạn có thể sử dụng lệnh này để cài đặt mô-đun Posh-SSH cho PowerShell:

iex (New-Object Net.WebClient).DownloadString("https://gist.github.com/darkoperator/6152630/raw/c67de4f7cd780ba367cccbc2593f38d18ce6df89/instposhsshdev")

Cần có kết nối Internet để cài đặt Posh-SSH bằng các lệnh trên. Trong trường hợp của tôi, tôi đã cài đặt mô-đun Posh-SSH trong PowerShell và có thể chuyển sang các bước cấu hình tiếp theo.

Kết nối với máy chủ từ xa trong PowerShell

Trong bài viết blog này, tôi đang sử dụng một môi trường gồm một máy tính Windows cục bộ và một máy tính Linux từ xa, cả hai đều được kết nối vào cùng một mạng:

  • 192.168.101.210 là máy tính Windows cục bộ cài đặt Windows 10 phiên bản 20H2
  • 192.168.101.209 là máy tính Linux từ xa đang chạy máy chủ SSH (SFTP)
  • user1 là tên người dùng Linux

Các địa chỉ IP này được sử dụng trong các ví dụ của tôi. Nhập địa chỉ IP và thông tin đăng nhập của bạn vào các lệnh và tệp cấu hình thích hợp.

Hãy kiểm tra thư mục chia sẻ SFTP của chúng ta bằng cách kết nối với máy chủ Linux qua SFTP bằng WinSCP, phần mềm khách SFTP miễn phí dành cho Windows. Việc kết nối với máy chủ SFTP rất đơn giản. Nhập địa chỉ IP của máy chủ đích, số cổng (TCP 22 là cổng mặc định nhưng bạn có thể cấu hình máy chủ SSH để sử dụng số cổng tùy chỉnh), tên người dùng và mật khẩu để kết nối. Đừng quên chọn giao thức SFTP.

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

Kết nối SFTP hoạt động trong trường hợp của tôi. Chúng tôi đã sao chép hai tệp vào thư mục chia sẻ (vị trí của các tệp là /home/user1/shared/ trên máy Linux từ xa). Hãy cùng xem cách kết nối với thư mục chia sẻ từ Windows và cách sử dụng SFTP với Posh-SSH trong PowerShell.

How to use SFTP in Windows

Để làm việc với các tệp qua SFTP, trước tiên bạn cần thiết lập một phiên kết nối. Để thực hiện điều này, hãy chạy lệnh sau trong PowerShell:

New-SFTPSession -Computername 192.168.101.209

Cửa sổ xác thực sẽ hiển thị sau khi chạy lệnh. Nhập tên người dùng và mật khẩu để truy cập máy Linux từ xa chứa các tệp bạn cần truy cập qua SFTP. Nếu bạn đã nhập thông tin đăng nhập chính xác, bạn sẽ thấy kết quả PowerShell hiển thị thông tin về số phiên SFTP, địa chỉ IP của máy chủ từ xa và trạng thái kết nối. Khi phiên được tạo, một số chỉ mục sẽ được gán cho phiên đó.

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

Bạn luôn có thể nhập lệnh help kèm theo các đối số thích hợp để hiển thị thông tin trợ giúp ngắn gọn về cú pháp sử dụng các lệnh PowerShell:

help New-SFTPSession

Liệt kê tất cả các lệnh PowerShell posh có sẵn: Get-Command -Module Posh-SSH

hoặc

Get-command -Name * -module *posh-ssh

Dưới đây là phương pháp tạo phiên SSH cho phép bạn chạy lệnh trên máy chủ từ xa, ví dụ như liệt kê các tệp trong thư mục:

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

Tạo tập lệnh PowerShell

Hãy tạo một tập lệnh thử nghiệm để khám phá các thao tác cơ bản mà bạn có thể thực hiện trong PowerShell khi làm việc với các tài nguyên SFTP. Đây không phải là tập lệnh SFTP, mà là tập lệnh PowerShell để làm việc với SFTP. Tập lệnh thử nghiệm này sẽ sao chép tệp cài đặt .NET Framework từ một máy Linux từ xa sang một máy Windows cục bộ.

Tạo tệp tập lệnh test-PS.ps1 với nội dung được hiển thị bên dưới.

#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

Mở PowerShell trên máy Windows, chuyển đến thư mục chứa tập lệnh thử nghiệm này và chạy tập lệnh

.test-PS.ps1

Tệp NetFrameworkNDP462.exe sẽ được sao chép từ /home/user1/shared/ (trên máy Linux từ xa) sang C:tempps (trên máy Windows cục bộ). Như bạn có thể thấy trên ảnh chụp màn hình bên dưới, trong trường hợp của tôi, tệp đã được sao chép thành công.

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

Để liệt kê các tệp trong một thư mục trong tài nguyên SFTP, bạn có thể tạo một tập lệnh PowerShell với nội dung sau:

$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

Trong đó:

Your_Password000 là mật khẩu của tài khoản người dùng được sử dụng để kết nối qua SSH với thư mục chia sẻ SFTP;

user1 là tên người dùng;

192.168.101.209 là địa chỉ IP của máy chủ từ xa mà chúng ta kết nối để truy cập tệp qua SFTP.

Lưu tập lệnh dưới tên list-files.ps1 và chạy tập lệnh này trong PowerShell trên máy cục bộ của bạn từ thư mục chứa tập lệnh này.

.list-files.ps1

Hãy chú ý đến tham số -Recursive được định nghĩa trong tập lệnh thử nghiệm. Trên ảnh chụp màn hình bên dưới, bạn có thể thấy kết quả khi sử dụng tham số -Recursive và khi không sử dụng tham số này.

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

Một trong những nhược điểm của việc chạy các tập lệnh như những ví dụ trên là thông tin đăng nhập được lưu trữ dưới dạng văn bản thuần túy trong tập lệnh, điều này không an toàn. Người dùng có thể mở tập lệnh (ngay cả khi chỉ có quyền đọc) sẽ nhìn thấy mật khẩu và sử dụng mật khẩu này để truy cập trái phép.

Có một phương pháp để nâng cao mức độ bảo mật và lưu trữ mật khẩu dưới dạng mã hóa trong tệp. Giao diện lập trình ứng dụng Bảo vệ Dữ liệu Windows (Windows Data Protection API) được sử dụng để mã hóa mật khẩu, và tệp mật khẩu này chỉ có thể được truy cập từ tài khoản người dùng và máy tính đã được sử dụng để tạo tệp mật khẩu này. (get-credential).password | ConvertFrom-SecureString | set-content "C:temppassword.txt"

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

Sau đó, mật khẩu sẽ được lưu dưới dạng mã hóa trong tệp văn bản. Nếu ai đó xem nội dung của tệp này, mật khẩu sẽ không hiển thị dưới dạng văn bản thuần túy.

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

Khi cần nhập mật khẩu, hãy chỉ định tệp chứa mật khẩu đã được mã hóa ( C:temppassword.txt trong trường hợp của chúng ta).

$password = Get-Content "C:temppassword.txt" | ConvertTo-SecureString

$credential = New-Object System.Management.Automation.PsCredential("user1",$password)

Phương pháp thiết lập mật khẩu này an toàn hơn. Bạn có thể chỉnh sửa tập lệnh mà bạn đã định nghĩa mật khẩu trong đó. Thay vì mở tập lệnh trong trình soạn thảo văn bản, bạn có thể nhấp chuột phải vào tệp ps1 và trong menu ngữ cảnh, nhấp vào Edit.

PowerShell SFTP automation – editing a script file

Windows PowerShell ISE sẽ được mở. Đây là công cụ gốc của Windows, tô màu cú pháp để thuận tiện hơn và hiển thị các lệnh PowerShell có sẵn ở khung bên phải.

SFTP script editing for running in PowerShell

Các lệnh trong tập lệnh thử nghiệm hiện như sau:

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

Bạn có thể sửa đổi tập lệnh của mình một lần nữa và thiết lập để nó thực thi tệp cài đặt đã tải xuống trên máy tính Windows. Lệnh để cài đặt .NET Framework ở chế độ im lặng (từ thư mục chứa tệp cài đặt) là:

.NetFrameworkNDP462.exe /q /norestart

Nhập tên tệp cài đặt của bạn nếu tên khác với tên trên.

Thêm dòng sau vào cuối tập lệnh:

Start-process "C:temppsNetFrameworkNDP462.exe" -argumentlist /q /norestart

Nếu bạn muốn xóa tệp cài đặt sau khi quá trình cài đặt hoàn tất, hãy cân nhắc thêm dòng này vào cuối tập lệnh:

remove-item -path "C:temppsNetFrameworkNDP462.exe" -recurse -force

Sử dụng PowerShell và Posh-SSH cho phép bạn tự động hóa các thao tác trong PowerShell bằng giao thức SFTP để sao chép tệp giữa các máy chủ trong mạng. Bạn có thể tạo một tập lệnh để tải xuống các tệp và thực thi chúng nhằm tiết kiệm thời gian khi cần cài đặt phần mềm hàng loạt trên một số lượng lớn máy tính.

Kết luận

Giờ đây, bạn có thể sao chép tệp đến/từ các máy Linux qua SFTP nếu máy chủ SSH đã được cấu hình trên các máy Linux. Posh-SSH là một mô-đun PowerShell cần thiết để sử dụng SFTP trên các máy Windows mà từ đó bạn muốn truy cập các máy chủ SFTP từ xa và thực hiện các tác vụ tự động hóa SFTP. PowerShell và SFTP có thể được các nhà cung cấp dịch vụ quản lý và quản trị viên hệ thống trong các tổ chức sử dụng.

PowerShell thường được sử dụng để quản lý các máy ảo Hyper-V và máy ảo VMware (tại PowerCLI). Hãy nhớ sao lưu các máy ảo Hyper-V. Giống như cách PowerShell được sử dụng để tự động hóa việc chạy các lệnh, NAKIVO Backup & Replication tự động hóa việc sao lưu máy ảo và cung cấp nhiều tính năng bảo vệ dữ liệu bổ sung. Hơn nữa, sản phẩm này hỗ trợ cài đặt ở chế độ đa người dùng, điều này đặc biệt hữu ích cho các nhà cung cấp dịch vụ quản lý. Tải xuống phiên bản miễn phí của NAKIVO Backup & Replication và bắt đầu bảo vệ các máy ảo và máy vật lý của bạn ngay hôm nay.

Dùng thử NAKIVO Backup & Replication

Dùng thử NAKIVO Backup & Replication

Đăng ký dùng thử miễn phí để khám phá toàn bộ các tính năng bảo vệ dữ liệu của giải pháp này. 15 ngày miễn phí. Không có bất kỳ giới hạn nào về tính năng hay dung lượng. Không cần thẻ tín dụng.

Có thể bạn cũng quan tâm