Close

# PowerShell – Using WinSCP to copy files to/from Linux machines

It is possible to copy files to/from a linux machine using Powershell. This can be done using a free tool called winscp.

### Announcement

I have released my new course on Udemy, Kubernetes By Example. Sign up now to get free lifetime access!

Winscp is actually a gui based tool, but you can use it from

# I created this script using the following as an inspiration:
# http://winscp.net/eng/docs/library_powershell#installing_the_assembly

# Setup session options
$sessionOptions = New-Object WinSCP.SessionOptions$sessionOptions.Protocol = [WinSCP.Protocol]::Sftp
$sessionOptions.HostName =$ServerName
$sessionOptions.UserName =$Username
$sessionOptions.Password =$password
#$sessionOptions.SshHostKeyFingerprint = “ssh-rsa 1024 xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx” # this feature is desabled in the next line. # Note I disabled the above line, and enabled the line below using instructions from: # http://winscp.net/eng/docs/library_sessionoptions$sessionOptions.GiveUpSecurityAndAcceptAnySshHostKey = $true$session = New-Object WinSCP.Session

# Connect
$session.Open($sessionOptions)

# Set transfer mode to binary
$transferOptions = New-Object WinSCP.TransferOptions$transferOptions.TransferMode = [WinSCP.TransferMode]::Binary

Now to send files to the linux machine, do:

$session.PutFiles("$SourcePath", "$DestinationPath",$False, $transferOptions)  And to retrieve files, do: $session.GetFiles("$SourcePath", "$DestinationPath", $False,$transferOptions)


Putting it altogether, we have:

[Reflection.Assembly]::LoadFrom(“C:\path\to\winscp-dll\WinSCPnet.dll”) | Out-Null

$sessionOptions = New-Object WinSCP.SessionOptions$sessionOptions.Protocol = [WinSCP.Protocol]::Sftp
$sessionOptions.HostName = "linuxservername"$sessionOptions.UserName = "username"
$sessionOptions.Password = "password"$sessionOptions.GiveUpSecurityAndAcceptAnySshHostKey = $true$session = New-Object WinSCP.Session

$session.Open($sessionOptions)

$transferOptions = New-Object WinSCP.TransferOptions$transferOptions.TransferMode = [WinSCP.TransferMode]::Binary

$SourcePath = "C:\Temp\testfile.txt"$DestinationPath = "/tmp/testfile.txt"

$session.PutFiles("$SourcePath", "$DestinationPath",$False, \$transferOptions)


The folder that contains your WinSCPnet.dll file will also need to contain the WinSCP.exe file as well. You can download my copy of both of these files.