How to run the sftp command with a password from B

2019-01-01 05:36发布

问题:

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.

回答1:

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
!


回答2:

Another way would be to use lftp:

lftp sftp://user:password@host  -e \"put local-file.name; bye\"

The disadvantage of this method is that other users on the computer can read the password from tools like ps and that the password can become part of your shell history.

A more secure alternative which is available since LFTP 4.5.0 is setting the LFTP_PASSWORDenvironment variable and executing lftp with --env-password. Here\'s a full example:

LFTP_PASSWORD=\"just_an_example\"
lftp --env-password sftp://user@host  -e \"put local-file.name; bye\"

LFTP also includes a cool mirroring feature (can include delete after confirmed transfer \'--Remove-source-files\'):

lftp -e \'mirror -R /local/log/path/ /remote/path/\' --env-password -u user sftp.foo.com


回答3:

Expect is a great program to use.

On Ubuntu install it with:

sudo apt-get install expect

On a CentOS Machine install it with:

yum install expect

Lets say you want to make a connection to a sftp server and then upload a local file from your local machine to the remote sftp server

#!/usr/bin/expect

spawn sftp username@hostname.com
expect \"password:\"
send \"yourpasswordhere\\n\"
expect \"sftp>\"
send \"cd logdirectory\\n\"
expect \"sftp>\"
send \"put /var/log/file.log\\n\"
expect \"sftp>\"
send \"exit\\n\"
interact

This opens a sftp connection with your password to the server.

Then it goes to the directory where you want to upload your file, in this case \"logdirectory\"

This uploads a log file from the local directory found at /var/log/ with the files name being file.log to the \"logdirectory\" on the remote server



回答4:

You can use lftp interactively in a shell script so the password not saved in .bash_history or similar by doing the following:

vi test_script.sh

Add the following to your file:

#!/bin/sh
HOST=<yourhostname>
USER=<someusername>
PASSWD=<yourpasswd>

cd <base directory for your put file>

lftp<<END_SCRIPT
open sftp://$HOST
user $USER $PASSWD
put local-file.name
bye
END_SCRIPT

And write/quit the vi editor after you edit the host, user, pass, and directory for your put file typing :wq .Then make your script executable chmod +x test_script.sh and execute it ./test_script.sh.



回答5:

You can override by enabling Password less authentication. But you should install keys (pub, priv) before going for that.

Execute the following commands at local server.

Local $> ssh-keygen -t rsa 

Press ENTER for all options prompted. No values need to be typed.

Local $> cd .ssh
Local $> scp .ssh/id_rsa.pub user@targetmachine:
Prompts for pwd$>  ENTERPASSWORD

Connect to remote server using the following command

Local $> ssh user@targetmachine
Prompts for pwd$> ENTERPASSWORD

Execute the following commands at remote server

Remote $> mkdir .ssh
Remote $> chmod 700 .ssh
Remote $> cat id_rsa.pub >> .ssh/authorized_keys
Remote $> chmod 600 .ssh/authorized_keys
Remote $> exit

Execute the following command at local server to test password-less authentication. It should be connected without password.

$> ssh user@targetmachine


回答6:

I was recently asked to switch over from ftp to sftp, in order to secure the file transmission between servers. We are using Tectia SSH package, which has an option --password to pass the password on the command line.

example : sftp --password=\"password\" \"userid\"@\"servername\"

Batch example :

(
  echo \"
  ascii
  cd pub
  lcd dir_name
  put filename
  close
  quit
    \"
) | sftp --password=\"password\" \"userid\"@\"servername\"

I thought I should share this information, since I was looking at various websites, before running the help command (sftp -h), and was i surprised to see the password option.



回答7:

Combine sshpass with a locked-down credentials file and, in practice, it\'s as secure as anything - if you\'ve got root on the box to read the credentials file, all bets are off anyway.



回答8:

You can use sshpass for it. Below are the steps

  1. Install sshpass For Ubuntu - sudo apt-get install sshpass
  2. Add the Remote IP to your known-host file if it is first time For Ubuntu -> ssh user@IP -> enter \'yes\'
  3. give a combined command of scp and sshpass for it. Below is a sample code for war coping to remote tomcat sshpass -p \'#Password_For_remote_machine\' scp /home/ubuntu/latest_build/abc.war #user@#RemoteIP:/var/lib/tomcat7/webapps


回答9:

Bash program to wait for sftp to ask for a password then send it along:

#!/bin/bash
expect -c \"
spawn sftp username@your_host
expect \\\"Password\\\"
send \\\"your_password_here\\r\\\"
interact \"

You may need to install expect, change the wording of \'Password\' to lowercase \'p\' to match what your prompt receives. The problems here is that it exposes your password in plain text in the file as well as in the command history. Which nearly defeats the purpose of having a password in the first place.



回答10:

For searchers that don\'t care that the password can be seen in the command-line command:

sftp userid:password@remoteHost is how to include the password in the sftp connect command.