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.
SFTP là gì?
SFTP viết tắt của SSH File Transfer Protocol hoặc Secure File Transfer Protocol. SFTP là giải pháp thay thế an toàn cho Giao thức Truyền tệp (FTP) truyền thống với chức năng tương tự. SFTP hoạt động trên lớp ứng dụng của mô hình OSI (lớp 7) và sử dụng kết nối SSH, đặc biệt phổ biến trên máy tính Linux có sẵn khách hàng dòng lệnh SFTP. Nếu bạn sử dụng Windows, hãy cài đặt một khách hàng SSH miễn phí như WinSCP, chứa GUI và hỗ trợ nhiều 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 gốc, vì vậy cần phải cài đặt các thành phần bổ sung.
Khi sử dụng kết nối SSH, dữ liệu chuyển qua mạng được mã hóa và kết nối an toàn, không giống như giao thức FTP không mã hóa truyền thống, nơi dữ liệu có thể bị tấn công. SSH được sử dụng để xác thực, nếu bạn có thông tin xác thực người dùng Linux, bạn có thể truy cập các tệp trên máy đích Linux sau khi xác thực từ khách hàng dòng lệnh SFTP của bạn hoặc một khách hàng GUI. Nó cũng cho phép bạn sao chép các tệp từ/đến một máy Linux từ xa từ 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 và tệp/thư mục.
Đừng nhầm lẫn 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 cho một kết nối và FTPS sử dụng nhiều số cổng cho các kênh điều khiển và dữ liệu (có thể khó cấu hình hơn từ góc độ bảo mật bao gồm cả tường lửa). FTPS là FTP với SSL (Secure Socket Layer). Tôi không đi vào cách thiết lập máy chủ SFTP trong bài đăng blog nà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 trong tại đây.
Cài đặt Mô-đun Posh-SSH
Để thực hiện các thao tác với các tệp (sao chép tệp, xóa tệp) trên các máy từ xa bằng cách sử dụng SFTP và SCP trong PowerShell, bạn phải cài đặt mô-đun Posh-SSH trong PowerShell. 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ột máy tính từ xa bằng cách sử dụng phiên SSH. PowerShell 3.0 và .NET Framework 4.0 được yêu cầu để 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 thủ công PowerShell và .NET Framework trên Windows 7 SP1. Chạy lệnh này để cài đặt mô-đun SFTP PowerShell (Posh-SSH): install-module posh-ssh
Là một lựa chọn thay thế, 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")
Kết nối internet là cần thiết để cài đặt Posh-SSH với 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 đến Máy chủ Vật lý Từ xa trong PowerShell
Trong bài đăng blog này, tôi đang sử dụng môi trường với một máy Windows cục bộ và một máy Linux từ xa, kết nối với cùng một mạng:
- 192.168.101.210 là một máy Windows cục bộ chạy phiên bản Windows 10 20H2
- 192.168.101.209 là một máy Linux từ xa mà máy chủ SSH (SFTP) đang chạy
- user1 là tên của 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 xác thực của bạn vào các lệnh và tập tin cấu hình phù 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 thông qua SFTP bằng WinSCP, ứng dụng khách SFTP miễn phí cho Windows. Kết nối với máy chủ SFTP là trực tiếp. Nhập địa chỉ IP của máy chủ vật lý mục tiêu, số cổng (TCP 22 là số 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.
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 tin vào thư mục chia sẻ (vị trí của các tập tin 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.
Để làm việc với các tập tin qua SFTP, bạn nên thiết lập một phiên đầu tiên. Để làm điều này, hãy chạy lệnh này 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 với các tập tin bạn cần truy cập qua SFTP. Nếu bạn đã nhập đúng thông tin xác thực, bạn sẽ thấy đầu ra của PowerShell với thông tin về số phiên SFTP, địa chỉ IP của máy chủ vật lý từ xa và trạng thái kết nối. Khi một phiên được tạo, một số chỉ mục sẽ được gán cho phiên đó.
Bạn luôn có thể nhập lệnh trợ giúp với các đối số phù hợp để hiển thị thông tin trợ giúp ngắ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 sẵn có: 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"
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.
Để 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.
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"
Sau đó, mật khẩu được lưu trữ dưới dạng mã hóa trong tập tin văn bản. Nếu ai đó xem nội dung của tập tin này, mật khẩu sẽ không được hiển thị dưới dạng văn bản thuần túy.
Khi bạn cần nhập mật khẩu, hãy xác định tập tin đã lưu mật khẩu mã hóa ( C:temppassword.txt trong trường hợp của chúng tôi).
$password = Get-Content "C:temppassword.txt" | ConvertTo-SecureString
$credential = New-Object System.Management.Automation.PsCredential("user1",$password)
Phương pháp xác định mật khẩu này an toàn hơn. Bạn có thể sửa đổi kịch bản của mình trong đó bạn đã xác định mật khẩu. Thay thế cho việc mở kịch bản 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 tin ps1 và trong menu ngữ cảnh bấm Edit.
Windows PowerShell ISE được mở. Đây là công cụ gốc Windows làm nổi bật cú pháp để thuận tiện hơn và hiển thị các lệnh PowerShell có sẵn trong pane bên phải.
Các lệnh trong kịch bản kiểm tra bây giờ là:
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 kịch bản của mình lần nữa và thiết lập để thực thi tập tin cài đặt tải về trên máy Windows. Lệnh để cài đặt .NET Framework trong chế độ im lặng (từ thư mục nơi tập tin cài đặt được lưu) là:
.NetFrameworkNDP462.exe /q /norestart
Nhập tên tập tin cài đặt của bạn nếu tên khác nhau.
Thêm dòng kết thúc trong kịch bản:
Start-process "C:temppsNetFrameworkNDP462.exe" -argumentlist /q /norestart
Nếu bạn muốn xóa tập tin cài đặt sau khi cài đặt hoàn tất, hãy xem xét 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 hoạt động trong PowerShell bằng cách sử dụng giao thức SFTP để sao chép tập tin giữa các máy chủ trong mạng. Bạn có thể tạo kịch bản để tải tập tin xuống và thực thi chúng để tiết kiệm thời gian khi cần thực hiệ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
Bây giờ bạn có thể sao chép tập tin tới/từ máy Linux qua SFTP nếu máy chủ SSH được cài đặt trên các máy Linux. Posh-SSH là một module PowerShell cần thiết để sử dụng SFTP trên máy Windows từ nơi bạn muốn truy cập máy chủ SFTP từ xa và thực hiện các công việc tự động hóa SFTP. PowerShell và SFTP có thể được sử dụng bởi 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). Nhớ sao lưu các máy ảo Hyper-V. Cũng như PowerShell được sử dụng để tự động hóa việc chạy lệnh, NAKIVO Backup & Replication tự động hóa sao lưu VM 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 với chế độ multi-tenant, đặc biệt hữu ích cho 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.










