SFTP (SSH File Transfer Protocol) is a secure file transfer protocol. It runs over the SSH protocol. It supports the full security and authentication functionality of SSH.

SFTP has pretty much replaced legacy FTP as a file transfer protocol, and is quickly replacing FTP/S. It provides all the functionality offered by these protocols, but more securely and more reliably, with easier configuration. There is basically no reason to use the legacy protocols any more.

SFTP also protects against password sniffing and man-in-the-middle attacks. It protects the integrity of the data using encryption and cryptographic hash functions, and autenticates both the server and the user.

Login SFTP with pass phrase

  • Install expect

    # Ubuntu
    sudo apt install expect 
    # RH/CentOS
    sudo yum install expect
  • Set passphrase to global variable

    export PASSPHRASE=Your_Secret_Pass
  • Create a script - sftp.sh

    expect -c "
    spawn sftp  -oPORT=9022 -oIdentityFile=~/.ssh/Your_SSH_Private_Key  -oPasswordAuthentication=no USER_ID@your.sftp.server.com
    expect \"*\"
    expect \"*\"
    expect \"*\"
    expect -nocase \"*passphrase*\" { send \"$PASSPHRASE\r\"; interact }


GnuPG is a complete and free implementation of the OpenPGP standard as defined by RFC4880 (also known as PGP). GnuPG allows you to encrypt and sign your data and communications; it features a versatile key management system, along with access modules for all kinds of public key directories. GnuPG, also known as GPG, is a command line tool with features for easy integration with other applications. A wealth of frontend applications and libraries are available. GnuPG also provides support for S/MIME and Secure Shell (ssh).

Generate GPG key pair

  • Generate key pair

    # Open terminal & run command below
    gpg --gen-key
    # Select RSA from options
    Please select what kind of key you want:
    (1) RSA and RSA (default)
    (2) DSA and Elgamal
    (3) DSA (sign only)
    (4) RSA (sign only)
    # Use 4096
    RSA keys may be between 1024 and 4096 bits long.
    What keysize do you want? (2048) 4096
    # Pick option 0  
    Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
    # Enter user id, email and comment
    GnuPG needs to construct a user ID to identify your key.
    Real name: [Your_User_ID]
    Email address: [Your_email@email.com]
    Comment: {Your_comment]
    # Enter passphase & confirm it
    You need a passphase to protect your secret key
    Enter passphase: [your_passphase]
    Repeat passphase: [your_passphase]

Export public key

  • The third party requires your public key to decrypt your message, so you need to export public key.

    gpg --armor --output [export_file_name]  --export [your_user_id]
    ## get finger print 
    ggp --fingerprint
  • Pass your public key and fingerprint to the third party

Import public key

  • Import public key file

    gpg --import [public_key_file]
  • Sign the public key with your priviate key

    ## Get user id of public key
    gpg --list-keys
    gpg --sign-key [public_key_user_id]
    ## Confirm to sign
    Really sgin? (Y/N) Y
    ## Enter passphase 
    Enter passphase: [your_pass_phase]
  • Update the trust level

    gpg --edit-key [public_key_user_id]
    ## Enter trust after the command prompt
    Command> trust
    ## Choose option 5 
    Please decide how far you trust this user to correctly
    verify other users' keys (by looking at passports,
    checking fingerprints from different sources...)?
    1 = I don't know or won't say
    2 = I do NOT trust
    3 = I trust marginally
    4 = I trust fully
    s = I trust ultimately
    m = back to the main menu
    Your decision? 5
    # Enter q to quit
    Command> q

PGP Encryption

  • Encrypt a file

    gpg --armor --encrypt \
    --recipient [public_key_user_id] --sign --local-user [your_user_id] \
    --output [encrypted_filename]
    ## Enter passphase
    Enter passphase: [your_passphase]

PGP Decryption

  • Decrypt a file

    gpg --armor [decrpyted_filename] --decrypt [encrypted_filename]
    ## Enter passphase
    Enter passphase: [your_passphase]