Cara Mengunggah File ke FTP Menggunakan PowerShell

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 WebClientatur 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 FtpWebRequestdibahas 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

Leave a Comment

Your email address will not be published. Required fields are marked *