Upload file to SFTP using PowerShell

前端 未结 4 1223
心在旅途
心在旅途 2020-12-12 20:48

We were asked to set up an automated upload from one of our servers to an SFTP site. There will be a file that is exported from a database to a filer every Monday morning an

相关标签:
4条回答
  • 2020-12-12 21:24

    I am able to sftp using PowerShell as below:

    PS C:\Users\user\Desktop> sftp user@aa.bb.cc.dd                                                     
    user@aa.bb.cc.dd's password:
    Connected to user@aa.bb.cc.dd.
    sftp> ls
    testFolder
    sftp> cd testFolder
    sftp> ls
    taj_mahal.jpeg
    sftp> put taj_mahal_1.jpeg
    Uploading taj_mahal_1.jpeg to /home/user/testFolder/taj_mahal_1.jpeg
    taj_mahal_1.jpeg                                                                      100%   11KB  35.6KB/s   00:00
    sftp> ls
    taj_mahal.jpeg      taj_mahal_1.jpeg
    sftp>
    

    I do not have installed Posh-SSH or anything like that. I am using Windows 10 Pro PowerShell. No additional modules installed.

    0 讨论(0)
  • 2020-12-12 21:26

    There isn't currently a built-in PowerShell method for doing the SFTP part. You'll have to use something like psftp.exe or a PowerShell module like Posh-SSH.

    Here is an example using Posh-SSH:

    # Set the credentials
    $Password = ConvertTo-SecureString 'Password1' -AsPlainText -Force
    $Credential = New-Object System.Management.Automation.PSCredential ('root', $Password)
    
    # Set local file path, SFTP path, and the backup location path which I assume is an SMB path
    $FilePath = "C:\FileDump\test.txt"
    $SftpPath = '/Outbox'
    $SmbPath = '\\filer01\Backup'
    
    # Set the IP of the SFTP server
    $SftpIp = '10.209.26.105'
    
    # Load the Posh-SSH module
    Import-Module C:\Temp\Posh-SSH
    
    # Establish the SFTP connection
    $ThisSession = New-SFTPSession -ComputerName $SftpIp -Credential $Credential
    
    # Upload the file to the SFTP path
    Set-SFTPFile -SessionId ($ThisSession).SessionId -LocalFile $FilePath -RemotePath $SftpPath
    
    #Disconnect all SFTP Sessions
    Get-SFTPSession | % { Remove-SFTPSession -SessionId ($_.SessionId) }
    
    # Copy the file to the SMB location
    Copy-Item -Path $FilePath -Destination $SmbPath
    

    Some additional notes:

    • You'll have to download the Posh-SSH module which you can install to your user module directory (e.g. C:\Users\jon_dechiro\Documents\WindowsPowerShell\Modules) and just load using the name or put it anywhere and load it like I have in the code above.
    • If having the credentials in the script is not acceptable you'll have to use a credential file. If you need help with that I can update with some details or point you to some links.
    • Change the paths, IPs, etc. as needed.

    That should give you a decent starting point.

    0 讨论(0)
  • 2020-12-12 21:41

    Using PuTTY's pscp.exe (which I have in an $env:path directory):

    pscp -sftp -pw passwd c:\filedump\* user@host:/Outbox/
    mv c:\filedump\* c:\backup\*
    
    0 讨论(0)
  • 2020-12-12 21:44

    You didn't tell us what particular problem do you have with the WinSCP, so I can really only repeat what's in WinSCP documentation.

    • Download WinSCP .NET assembly.
      The latest package as of now is WinSCP-5.17.9-Automation.zip;

    • Extract the .zip archive along your script;

    • Use a code like this (based on the official PowerShell upload example):

        # Load WinSCP .NET assembly
        Add-Type -Path "WinSCPnet.dll"
      
        # Setup session options
        $sessionOptions = New-Object WinSCP.SessionOptions -Property @{
            Protocol = [WinSCP.Protocol]::Sftp
            HostName = "example.com"
            UserName = "user"
            Password = "mypassword"
            SshHostKeyFingerprint = "ssh-rsa 2048 xxxxxxxxxxx...="
        }
      
        $session = New-Object WinSCP.Session
      
        try
        {
            # Connect
            $session.Open($sessionOptions)
      
            # Upload
            $session.PutFiles("C:\FileDump\export.txt", "/Outbox/").Check()
        }
        finally
        {
            # Disconnect, clean up
            $session.Dispose()
        }
      

    You can have WinSCP generate the PowerShell script for the upload for you:

    • Login to your server with WinSCP GUI;
    • Navigate to the target directory in the remote file panel;
    • Select the file for upload in the local file panel;
    • Invoke the Upload command;
    • On the Transfer options dialog, go to Transfer Settings > Generate Code;
    • On the Generate transfer code dialog, select the .NET assembly code tab;
    • Choose PowerShell language.

    You will get a code like above with all session and transfer settings filled in.

    (I'm the author of WinSCP)

    0 讨论(0)
提交回复
热议问题