Cách tạo các công cụ PowerShell để thiết lập SFTP

Khi 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 tạo một thư mục chia sẻ trên máy tính Windows, giao thức SMB thường được sử dụng. Tuy nhiên, các tệp 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 giải thích 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 ngừng hoạt động (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 các 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ó sẵn trình khách SFTP dòng lệnh tích hợp sẵn. 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 hơn chỉ 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 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 giao diện đồ họa (GUI). 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. Cấu hình máy chủ SFTP trên Linux không khó – bạn cài đặt máy chủ SSH, tạo người dùng và cấp 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 cổng duy nhất cho kết nối, trong khi FTPS sử dụng nhiều 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 về mặt bảo mật, bao gồm cả tường lửa). FTPS là FTP kết hợp với SSL (Secure Socket Layer). Tôi không đi sâu vào cách thiết lập máy chủ SFTP trong bài viết này. Hãy đọc về việc 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 tệp, xóa tệp) trên các máy tính từ xa bằng SFTP và SCP trong PowerShell, bạn phải 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 PowerShell SFTP (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 với máy tính Windows cục bộ và máy tính Linux từ xa, cả hai đều được kết nối với 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 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, trình khách SFTP miễn phí 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 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 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 tệp qua SFTP, bạn cần thiết lập phiên làm việc trước tiên. Để 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ố thứ tự 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 tham số phù 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

Danh sách tất cả các lệnh PowerShell 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à kịch bản SFTP, mà là kịch bản PowerShell để làm việc với SFTP. Kịch bản 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 kịch bản 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 tin 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, tệp đã được sao chép thành công trong trường hợp của tôi.

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 cho tài khoản người dùng được sử dụng để kết nối qua SSH với 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 tính cục bộ của bạn từ thư mục chứa tệp 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ư trong các 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 đó. (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 định nghĩa 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. 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 giúp 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 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.

Thêm dòng sau vào cuối kịch bản:

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 kịch bản:

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 skript để tải xuống 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 nhiều máy tính.

Kết luận

Bây giờ bạn có thể sao chép tệp đến/từ các máy Linux qua SFTP nếu máy Linux đã được cấu hình máy chủ SSH. Posh-SSH là mô-đun PowerShell cần thiết để sử dụng SFTP trên các máy Windows 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 sử dụng bởi 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.

PowerShell thường được sử dụng để quản lý máy ảo Hyper-V và máy ảo VMware (trong PowerCLI). Hãy nhớ sao lưu các máy ảo Hyper-V. Giống như 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 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.

Hãy thử NAKIVO Backup & Replication

Hãy 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. Dùng thử miễn phí trong 15 ngày. 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.

People also read