PowerShell: SFTP Script to Upload Files to an SFTP Server
This script uses the Posh-SSH module to complete the upload task.
Currently this module does not support folders.
This script will connect to and upload files from a source directory to a SFTP server, then move those files to another directory and email you along the way, start and finish.
Currently configured to use Private/Public key pairs but can be easily converted to use a regular username/password if so desired. I used PuTTYgen to make the keys, but you can use anything that tickles your fancy.
Note: Places that need/can be modified are headed by “#Change Variables Here!!”. Hope that’s self explanatory enough.
I’m sure it can be tweaked some more, even have a few ideas I want to try when I have time, but it served the purpose I had at the time.
Will update it if the need arises again, but… don’t hold your breath.
1) Install the Posh-SSH module, then save it to a folder of your choice. Instructions found at this link.
2) Modify the script (line 36) to point to the root folder containing your newly saved Posh-SSH module folder, or comment it out if you intend to install the module everywhere you intend to use the script.
<# .SYNOPSIS Uploads files to an SFTP server. Folders are not supported. Uses Private/Public key file to logon to SFTP server. Can be easily converted to use a simple username/password. .DESCRIPTION Uploads all files in the source folder to a destination SFTP server. Areas that can be modified are headed by "#Change Variables Here!!" .NOTES Author: Derek Bannard Filename: SFTP_Upload_Posh-SSH.ps1 Version: 1.00 Date: 2018/01/03 .PARAMETER None. This script requires direct modification to set paths and variables. .EXAMPLE .\SFTP_Upload_Posh-SSH.ps1 #> #Change Variables Here!! #Global variables $sftpServer = "IP Address or Hostname of SFTP Server" $sftpDestPort = "22" $sftpRemotePath = "/" $sftpUsername = "sftp_user" $srcFolder = "C:\SFTP\Incoming" # Folder containing the files you want to upload. $dstFolder = "C:\SFTP\Outgoing" # Folder that the script will move the files to after uploading. #Change Variables Here!! #Import the SFTP Module & CmdLets in per session mode. $env:PSModulePath = $env:PSModulePath + ";C:\SFTP\Modules" Import-Module Posh-SSH #Change Variables Here!! #Define the Private Key file path $pKeyFile = "C:\SFTP\KEY\private.KEY" # Generate key using program like PuTTYgen $nopasswd = new-object System.Security.SecureString #Set Credetials to connect to server $CredDest = New-Object System.Management.Automation.PSCredential($sftpUsername, $nopasswd) #Get todays date $todayDate = Get-Date -Format "yyyy-MM-dd HHmm" $folderDate = Get-Date -Format "yyyyMMdd" #Remove any open sessions Get-SFTPsession | Remove-SFTPSession | Out-Null #Create SFTP Session $Session = New-SFTPSession -ComputerName $sftpServer -Credential $CredDest -KeyFile $pKeyFile -Port $sftpDestPort #Change Variables Here!! #Send an email when process has started #Email the list $Body = "SFTP Script Started`r`n`nHost: $($Session.Host)" $Subject = "$todayDate - SFTP Upload Started" $SMTP = "smtp-server.domain.com" $To = "Notification Email List <notifications@domain.com>" $From = "SFTP Notifications <sftpnotifications@domain.com>" Send-MailMessage -To $To -From $From -SmtpServer $SMTP -Body $Body -Subject $Subject #Specify the local files Set-Location $srcFolder $LocalFiles = Get-ChildItem $srcFolder #Now copy the files up ForEach ($LocalFile in $LocalFiles) { Set-SFTPFile -SessionId $Session.SessionId -LocalFile "$LocalFile" -RemotePath "$sftpRemotePath" -Overwrite } #Create a list of uploaded files $Files = (Get-SFTPChildItem -SessionId $Session.SessionId -Path "$sftpRemotePath") | Select Name,FullName,Length | Sort-Object FullName #$msgFiles = $Files | where-object {$_.FullName -ne "/." -and $_.FullName -ne "/.."} $msgFiles = $Files | where-object {$_.Length -ne "0"} #Send an email when process has ended #Email the list $Body = "SFTP Script Ended `r`n`nFiles moved from $srcFolder to $dstFolder`r`n`nHost: $($Session.Host)`r`n`nFiles Names:`r`n" $msgFiles | ForEach {$Body += " $($_.Name)`n"} $Subject = "$todayDate - SFTP Upload Completion Report" Send-MailMessage -To $To -From $From -SmtpServer $SMTP -Body $Body -Subject $Subject #Remove the session Get-SFTPsession | Remove-SFTPSession #Move the local files after processing $LocalFiles | Move-Item -Destination $dstFolder -Force