Search code examples
bashshellunixsshsftp

How to run the sftp command with a password from Bash script?


I need to transfer a log file to a remote host using sftp from a Linux host. I have been provided credentials for the same from my operations group. However, since I don't have control over other host, I cannot generate and share RSA keys with the other host.

So is there a way to run the sftp command (with the username/password provided) from inside the Bash script through a cron job?

I found a similar Stack Overflow question, Specify password to sftp in a Bash script, but there was no satisfactory answer to my problem.


Solution

  • You have a few options other than using public key authentication:

    1. Use keychain
    2. Use sshpass (less secured but probably that meets your requirement)
    3. Use expect (least secured and more coding needed)

    If you decide to give sshpass a chance here is a working script snippet to do so:

    export SSHPASS=your-password-here
    sshpass -e sftp -oBatchMode=no -b - sftp-user@remote-host << !
       cd incoming
       put your-log-file.log
       bye
    !
    

    Update: However do understand that using environment variables is also insecure as using command line option -p for passing password.

    It is better to store and read password from a file like this using -f option:

    echo 'your-password-here' > ~/.passwd
    chmod 0400 ~/.passwd
    
    sshpass -f ~/.passwd -e sftp -oBatchMode=no -b - sftp-user@remote-host << !
       cd incoming
       put your-log-file.log
       bye
    !