File Transfer Protocol (FTP) adalah layanan umum yang digunakan untuk mentransfer file antara klien dan server. Seringkali berguna untuk mengotomatiskan transfer file ini, dan skrip PowerShell dapat digunakan untuk mempercepat proses ini.
Cara Menggunakan FTP dengan PowerShell
Ada beberapa cara berbeda untuk melakukan transfer FTP di PowerShell.
Yang paling sederhana adalah menggunakan WebClient.UploadFile
. PowerShell adalah bahasa skrip berorientasi objek, dan Anda memiliki akses penuh ke .NET
perpustakaan standar dengan New-Object
. Dengan ini, Anda dapat membuat yang baru WebClient
atur kredensial untuk itu, dan unggah file.
$client = New-Object System.Net.WebClient $client.Credentials = New-Object System.Net.NetworkCredential("username", "password") $client.UploadFile("ftp://example.com/path/archive.zip", "C:\archive.zip")
Ini akan berfungsi dengan baik, tetapi tidak akan menangani permintaan terenkripsi TLS/SSL, atau melakukan transfer FTP “aktif”. Menggunakan FtpWebRequest
dibahas di bawah ini, akan memecahkan masalah ini.
Namun, menyimpan nama pengguna dan kata sandi Anda dalam skrip bukanlah praktik terbaik, terutama jika skrip tersebut dikomit ke repositori Git bersama. Sebagai gantinya, Anda dapat mengatur variabel lingkungan seperti FtpUsername
dan mengaksesnya dalam skrip.
function uploadToFTPServer($remote, $local) { $client = New-Object System.Net.WebClient $client.Credentials = New-Object System.Net.NetworkCredential($Env:FtpUsername, $Env:FtpPassword) $client.UploadFile($remote, $local) } uploadToFTPServer "ftp://example.com/path/archive.zip", "C:\archive.zip"
Melakukan ini dalam suatu fungsi juga akan memungkinkan Anda untuk dengan mudah melakukan banyak transfer dengan memanggil fungsi dengan parameter yang berbeda.
Transfer FTP Lanjutan menggunakan PowerShell
Jika Anda membutuhkan lebih banyak kontrol, Anda harus menggunakan FtpWebRequest
. Ini akan mendukung transfer TLS, dan juga memungkinkan Anda untuk mematikan mode pasif. Cara termudah untuk menggunakannya adalah dengan membuka aliran file dan menyalinnya ke aliran FTP.
function uploadToFTPServer($remote, $local) { $request = [System.Net.FtpWebRequest]::Create($remote) $request.Credentials = New-Object System.Net.NetworkCredential($Env:FtpUsername, $Env:FtpPassword) $request.Method = [System.Net.WebRequestMethods+Ftp]::UploadFile $request.UsePassive = $true $fileStream = [System.IO.File]::OpenRead($local) $ftpStream = $request.GetRequestStream() $fileStream.CopyTo($ftpStream) $ftpStream.Dispose() $fileStream.Dispose() } uploadToFTPServer "ftp://example.com/archive.zip" "C:\archive.zip"
Karena menggunakan aliran file, dan tidak membaca semua byte, ini memiliki keuntungan bekerja lebih baik dengan transfer file besar.
Mengirim Transfer SFTP menggunakan Posh-SSH
SFTP adalah protokol FTP alternatif yang berjalan di atas SSH. Ini sedikit lebih rumit untuk digunakan daripada FTP biasa, karena Anda tidak bisa hanya mengirim nama pengguna dan kata sandi, dan PowerShell tidak mendukungnya secara asli.
Anda harus menginstal Posh-SSH
paket untuk berkomunikasi melalui SFTP:
Install-Module -Name Posh-SSH
Anda kemudian dapat memulai sesi baru, menggunakan objek kredensial baru. Ini bekerja dengan cara yang sama seperti transfer permintaan web, kecuali bahwa Anda juga harus menutup sesi di akhir.
Import-Module Posh-SSH $Password = ConvertTo-SecureString $Env:FtpPassword -AsPlainText -Force $Credential = New-Object System.Management.Automation.PSCredential ($Env:FtpUsername, $Password) $FilePath = "C:\archive.zip" $SftpPath="/folder" $ThisSession = New-SFTPSession -ComputerName '1.2.3.4' -Credential $Credential Set-SFTPFile -SessionId ($ThisSession).SessionId -LocalFile $FilePath -RemotePath $SftpPath Get-SFTPSession | % { Remove-SFTPSession -SessionId ($_.SessionId) }
Mengirim File Besar dengan Progress Bar di PowerShell
Menggunakan aliran file CopyTo
sederhana, tetapi untuk migrasi yang lama, Anda mungkin menginginkan semacam pelacakan kemajuan. Agak rumit untuk ditambahkan, karena Anda harus menyalin alirannya sendiri, tetapi berfungsi dengan baik dengan skrip berikut:
$request = [Net.WebRequest]::Create("ftp://example.com/path/archive.zip") $request.Credentials = New-Object System.Net.NetworkCredential($Env:FtpUsername, $Env:FtpPassword) $request.Method = [System.Net.WebRequestMethods+Ftp]::UploadFile $fileStream = [System.IO.File]::OpenRead("C:\archive.zip") $ftpStream = $request.GetRequestStream() $buffer = New-Object Byte[] 10240 while (($read = $fileStream.Read($buffer, 0, $buffer.Length)) -gt 0) { $ftpStream.Write($buffer, 0, $read) $pct = ($fileStream.Position / $fileStream.Length) Write-Progress ` -Activity "Uploading" -Status ("{0:P0} complete:" -f $pct) ` -PercentComplete ($pct * 100) } $ftpStream.Dispose() $fileStream.Dispose()
||
Dari postingan howtogeek.com