Although native support for Secure File Transfer Protocol (SFTP) is not in PowerShell, by using a free module, we can retrieve, delete and add new files.
PS C:> Get-Command -Module posh-ssh -Noun *SFTP*
CommandType Name Version Source
----------- ---- ------- ------
Function Get-SFTPChildItem 2.0.1 posh-ssh
Function Get-SFTPContent 2.0.1 posh-ssh
Function Get-SFTPLocation 2.0.1 posh-ssh
Function Get-SFTPPathAttribute 2.0.1 posh-ssh
Function Get-SFTPSession 2.0.1 posh-ssh
Function New-SFTPFileStream 2.0.1 posh-ssh
Function New-SFTPItem 2.0.1 posh-ssh
Function New-SFTPSymlink 2.0.1 posh-ssh
Function Remove-SFTPItem 2.0.1 posh-ssh
Function Remove-SFTPSession 2.0.1 posh-ssh
Function Rename-SFTPFile 2.0.1 posh-ssh
Function Set-SFTPContent 2.0.1 posh-ssh
Function Set-SFTPLocation 2.0.1 posh-ssh
Function Set-SFTPPathAttribute 2.0.1 posh-ssh
Function Test-SFTPPath 2.0.1 posh-ssh
Cmdlet Get-SFTPFile 2.0.1 posh-ssh
Cmdlet New-SFTPSession 2.0.1 posh-ssh
Cmdlet Set-SFTPFile 2.0.1 posh-ssh
Right away, it looks like can do a lot with this module. Let's dig into some of the SFTP commands and see how they can be used.
Options for the model
To transfer files over SFTP, we need to establish a session to the SFTP server. We'll only have to do this once. We could create a separate session each time we need to perform some task over SFTP, but that wouldn't be too efficient.
Instead, let's create a single SFTP session using the New-SFTPSession command. We're going to take the easy route and not mess with certificates so we can use a username and password to authenticate to the SFTP server. The New-SFTPSession has a Credential parameter that accepts a PSCredential object. We'll use the Get-Credential command to prompt the user for a username and password.
$credential = Get-Credential
Once we've got the username and password capture, we can then pass that to the New-SFTPSession command along with the AcceptKey parameter. The AcceptKey parameter will automatically accept the key that's returned from the SFTP server rather than prompting you to do so.
$session = New-SFTPSession -ComputerName 'MYSFTPSERVER' -Credential $Credential -AcceptKey
If all goes well, you'll be returned back to the console. If so, we can now use this session with a number of commands. For example, if I need to download a file from the SFTP server to my local computer, I can use the Get-SFTPFile function.
$getParams = @{
SessionId = $session.SessionId
LocalPath = 'C:localfile.txt'
RemoteFile = 'C:localfile.txt'
}
Get-SFTPFile @getParams
Perhaps we need to remove a file on the SFTP server. We can use the Remove-SFTPItem function for that just about as easily as we use the Get-SFTPFile function.
Get-SFTPFile -SessionId $session.SessionId -Path 'C:localfile.txt'
Once we've done whatever we need to do on the SFTP server, we should then disconnect and remove the session. We could just call Remove-SFTPSession and provide the session but it's always better to check ahead of time just to be sure the session is still there. We can check to see if the session is still created by using the Get-SFTPSession.
Summary
You can see below that I'm first checking to see if our session exists. If so, I'm then disconnecting it and completely removing it from our session.
if ($session = Get-SFTPSession -SessionId $session.SessionId) {
$session.Disconnect()
}
$null = Remove-SftpSession -SftpSession $session
The next time you need to perform any kind of SFTP task, have a look at the Posh-SSH PowerShell module.