Cara Mengunggah File Melalui FTP Dengan PowerShell

  • Post author:
  • Post category:Tutorial

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 berguna untuk mempercepat proses ini.

Cara Menggunakan FTP di 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 library standar .NET dengan New-Object. Dengan ini, Anda dapat membuat WebClient baru, mengatur kredensialnya, dan mengunggah 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 dapat menangani TLS/ Permintaan terenkripsi SSL, atau melakukan transfer FTP “aktif”. Menggunakan FtpWebRequest, yang dibahas di bawah, akan menyelesaikan masalah ini. Namun, bukan praktik terbaik untuk menyimpan nama pengguna dan kata sandi Anda dalam skrip, terutama jika skrip tersebut dikomit ke repositori Git bersama. Anda dapat menyetel variabel lingkungan seperti FtpUsername dan mengaksesnya di script.

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"

 

Membuat ini menjadi sebuah fungsi juga akan memudahkan Anda melakukan beberapa transfer dengan memanggil fungsi tersebut dengan parameter yang berbeda.

Transfer FTP Lanjutan dengan PowerShell

Jika Anda memerlukan kontrol lebih, 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 dengan Posh-SSH

SFTP adalah FTP alternatif protokol yang beroperasi melalui SSH. Ini sedikit lebih rumit untuk digunakan daripada FTP biasa, karena Anda tidak bisa hanya mengirim nama pengguna dan sandi, dan itu tidak didukung oleh PowerShell.

asliAnda harus menginstal paket Posh-SSH untuk berkomunikasi melalui SFTP:

Install-Module -Name Posh-SSH

Kemudian Anda akan dapat memulai sesi baru, menggunakan objek kredensial baru. Ini bekerja dengan cara yang sama seperti transfer permintaan web, kecuali 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 Bilah Kemajuan di PowerShell

Menggunakan CopyTo aliran file itu sederhana, tetapi untuk transfer yang lama, Anda mungkin memerlukan semacam pemantauan kemajuan. Ini sedikit rumit untuk ditambahkan, karena Anda harus menyalin aliran 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()

 

Itulah berita seputar Cara Mengunggah File Melalui FTP Dengan PowerShell, semoga bermanfaat. Disadur dari HowToGeek.com.