SFTP / SCP using password | Unix Linux Forums | Shell Programming and Scripting

  Go Back    


Shell Programming and Scripting Post questions about KSH, CSH, SH, BASH, PERL, PHP, SED, AWK and OTHER shell scripts and shell scripting languages here.

SFTP / SCP using password

Shell Programming and Scripting


Closed Thread    
 
Thread Tools Search this Thread Display Modes
    #1  
Old 08-24-2012
forums123456 forums123456 is offline
Registered User
 
Join Date: Feb 2011
Last Activity: 24 August 2012, 3:19 PM EDT
Posts: 32
Thanks: 0
Thanked 0 Times in 0 Posts
SFTP / SCP using password

Hi,

I was provided with sftp servername, user and password and the requirement is to connect to sftp server using credentials provided and drop the file.
Manually i am able to connect with commands like
sftp user@servername
and after clicking enter, i was asked for a password and entering the password i am able to get it the remote server.
How can i do the same using scripts i.e when i execute the script, it should connect to server using credentials ( without any manual interverntion )?

I used to do these sftp connections via key exchange ( public key deployed to remote server ) but not sure how to use passwords for sftp connection.

I appreciate your help.
Thanks
Sponsored Links
    #2  
Old 08-24-2012
hergp hergp is offline Forum Advisor  
Problem Eliminator
 
Join Date: Jan 2010
Last Activity: 18 December 2014, 2:47 PM EST
Location: Vienna, Austria
Posts: 806
Thanks: 19
Thanked 171 Times in 153 Posts
sftp works with key based login too. Just upload your public key to ~/.ssh/authorized_keys and make sure, the access mode of the .ssh directory is correct (700).
Sponsored Links
    #3  
Old 08-24-2012
forums123456 forums123456 is offline
Registered User
 
Join Date: Feb 2011
Last Activity: 24 August 2012, 3:19 PM EDT
Posts: 32
Thanks: 0
Thanked 0 Times in 0 Posts
No.

We are not allowed to use key based connection.
I am required to use credentials and connect to sftp server via script with not manual intervention.
Can i know how can i do this?
    #4  
Old 08-24-2012
hergp hergp is offline Forum Advisor  
Problem Eliminator
 
Join Date: Jan 2010
Last Activity: 18 December 2014, 2:47 PM EST
Location: Vienna, Austria
Posts: 806
Thanks: 19
Thanked 171 Times in 153 Posts
Quote:
Originally Posted by forums123456 View Post
We are not allowed to use key based connection.
That's unfortunate!

You can't provide the password to sftp via stdin-redirection, because sftp doesn't read stdin, but it opens /dev/tty to do that.

Therefore you have to resort to expect. Read here: http://www.unix.com/shell-programmin...tp-expect.html
Sponsored Links
    #5  
Old 08-24-2012
spacebar's Avatar
spacebar spacebar is offline
Registered User
 
Join Date: Oct 2009
Last Activity: 2 June 2014, 3:23 PM EDT
Location: spaceBAR Central
Posts: 440
Thanks: 0
Thanked 70 Times in 70 Posts
This is a simple script I use when I'm not allowed to use public/private keys(which I don't like!!), it might be overkill for what you want to do but at least it gives you some ideas:

Code:
#!/usr/local/bin/expect --
# Script: sftp_file_to.tcl
# Description: Utility to SFTP a file to a specified host
# usage: sftp_file_to.tcl target_server_port target_server user pass target_directory source_directory file_name_to_ftp rename_file

# Set named parameters
set ssh_port                 [lindex $argv 0]
set sftp_server              [lindex $argv 1]
set sftp_user                [lindex $argv 2]
set sftp_pass                [lindex $argv 3]
set target_directory         [lindex $argv 4]
set source_directory         [lindex $argv 5]
set file_name                [lindex $argv 6]
set rename_file              [lindex $argv 7]
set sftp_prompt "sftp>?"
set timeout 300

# Default variable(rename_file) to "N" if not supplied by caller.
if { $rename_file eq "" } {
  set rename_file N
}

# Procedure to connect to SFTP server
proc connect { sftp_pass } {
  variable sftp_prompt
  variable sftp_server
  expect -re "Connecting to.*"                     { exp_continue } \
         -re "Are you sure you want to continue.*" { exp_send "YES\r"; exp_continue } \
         -re "(Password|password).*:.*"            { exp_send "$sftp_pass\r"; exp_continue } \
         -re $sftp_prompt                          { return 0 } \
         eof                                       { puts "***Error connecting to($sftp_server)."; return 1 }
         timeout                                   { puts "***Error connecting to($sftp_server)."; return 1 }
  }

# Procedure to send meesage denoting error, then quit SFTP, then exit with status denoting error.
proc abort { msg } {
  puts "$msg";
  exp_send "quit\r";
  exit 1;
  }

# Connect to the SFTP server
spawn sftp -oPort=$ssh_port $sftp_user@$sftp_server
set connect_results [connect $sftp_pass]

# If successful connection, continue, else exit denoting error occured.
if { $connect_results == 0 } {
  # Change to target directory on target server.
  exp_send "cd $target_directory\r"
    expect "No such file or directory" { abort "\n**Error changing to directory($target_directory) on target server." } \
           "Failure"                   { abort "\n**Error changing to directory($target_directory) on target server." } \
           -re $sftp_prompt            {} \
           timeout { abort "\n**Error changing to directory($target_directory) on target server." }

  # Change local directory.
  exp_send "lcd $source_directory\r"
    expect "No such file or directory" { abort "\n**Error changing to directory($source_directory) on local machine." } \
           "Failure"                   { abort "\n**Error changing to directory($source_directory) on local machine." } \
           -re $sftp_prompt            {} \
           timeout { abort "\n**Error changing to directory($source_directory) on local machine." }

  # If rename_file = "Y" transfer file with '.xferring' as extension.
  if { $rename_file == "Y" } {
    set file_name_to_xfer $file_name
    append file_name_to_xfer .xferring
  } else {
    set file_name_to_xfer $file_name
  }

  # Put file to target host.
  set timeout 1800
  exp_send "put $file_name $file_name_to_xfer\r"
    expect "not found."                { abort "\n***Error transfering file($file_name) to: $sftp_server)." } \
           "No such file or directory" { abort "\n***Error transfering file($file_name) to: $sftp_server)." } \
           "Failure"                   { abort "\n***Error transfering file($file_name) to: $sftp_server)." } \
           -re $sftp_prompt            {} \
           timeout { abort "\n***Error transfering file($file_name) to: $sftp_server)." }

  # If rename_file = "Y" remove extension '.xferring' from file name after successful transfer.
  if { $rename_file == "Y" } {
    exp_send "rename $file_name_to_xfer $file_name\r"
      expect "No such file or directory" { abort "\n***Error renaming file($file_name_to_xfer) to($file_name) on $sftp_server)." } \
             "Failure"                   { abort "\n***Error renaming file($file_name_to_xfer) to($file_name) on $sftp_server)." } \
             -re $sftp_prompt            {} \
             timeout { abort "\n***Error renaming file($file_name_to_xfer) to($file_name) on $sftp_server)." }
  }

  # QUIT!!
  exp_send "quit\r"
  # Successful SFTP session so exit with zero status
  exit 0
}
# Error connecting to SFTP server so exit with non-zero status
exit 1



---------- Post updated at 09:48 PM ---------- Previous update was at 02:40 PM ----------

I also found another script I had created to to process sftp commands that are in a different file:

Code:
#!/opt/csw/bin/expect --
# Script: run_sftp_script.tcl
# Description: Utility to run a SFTP script
# usage: run_sftp.tcl target_server_port target_server user pass sftp_script_name

# Set named parameters
set ssh_port                 [lindex $argv 0]
set sftp_server              [lindex $argv 1]
set sftp_user                [lindex $argv 2]
set sftp_pass                [lindex $argv 3]
set sftp_script_name         [lindex $argv 4]
set sftp_prompt "sftp>?"
set timeout 30

# Procedure to connect to SFTP server
proc connect { sftp_pass } {
  variable sftp_prompt
  variable sftp_server
  expect -re "debug1:.*"                           { exp_continue } \
         -re "Connecting to.*"                     { exp_continue } \
         -re "Are you sure you want to continue.*" { exp_send "YES\r"; exp_continue } \
         "Password:"                               { exp_send "$sftp_pass\r"; exp_continue } \
         -re $sftp_prompt                          { return 0 } \
         -re .                                     { exp_continue  }
         eof                                       { puts "***Error connecting to($sftp_server)."; return 1 }
         timeout                                   { puts "***Error connecting to($sftp_server)."; return 1 }
  }

# Procedure to run SFTP commands from file
proc send_sftp_commands { sftp_script_name } {
  variable sftp_prompt
  #  Slurp up the sftp commands from file
  set fp [open "$sftp_script_name" r]
  set sftp_cmds [read $fp]
  close $fp

  #  Process sftp commands
  set sftp_command_list [split $sftp_cmds "\n"]

  foreach sftp_command $sftp_command_list {
    set comment [string index $sftp_command 0]
    if { $comment == "#" || $comment == "" } {
      continue
    }
    exp_send "$sftp_command\r"
      expect -re "Uploading.*"           { exp_continue } \
             "Failure"                   { abort "\n**Error running command($sftp_command)." } \
             -re $sftp_prompt            {} \
             timeout { abort "\n**Error running command($sftp_command)." }
  }
  return 0
}

# Procedure to send meesage denoting error, then quit SFTP, then exit with status denoting error.
proc abort { msg } {
  puts "$msg"
  exp_send "quit\r";
  exit 1;
  }

# Connect to the SFTP server and run sftp commands
spawn sftp -v -oPort=$ssh_port $sftp_user@$sftp_server
set connect_results [connect $sftp_pass]

# If successful connection, continue, else exit denoting error occured.
if { $connect_results == 0 } {
  puts "Successful connection/login to target host($sftp_server)."
  set sftp_results [send_sftp_commands $sftp_script_name]
  # If successful connection, continue, else exit denoting error occured.
  if { $sftp_results == 0 } {
    puts "Successful sftp session to target host($sftp_server)."
  # Successful SFTP session so exit with zero status
  exit 0
  }
}
# Error connecting to SFTP server so exit with non-zero status
puts "***Error running sftp script($sftp_script_name), for target host($sftp_server)."
exit 1

The Following User Says Thank You to spacebar For This Useful Post:
hergp (08-24-2012)
Sponsored Links
Closed Thread

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

More UNIX and Linux Forum Topics You Might Find Helpful
Thread Thread Starter Forum Replies Last Post
SFTP with Password Arpit Narula Shell Programming and Scripting 6 05-25-2012 05:41 AM
sftp is asking password aishsimplesweet Shell Programming and Scripting 22 08-06-2011 02:59 PM
password - SFTP Amit.Sagpariya Shell Programming and Scripting 6 08-18-2010 10:23 AM
Password less connection(sftp/ssh) panknil Shell Programming and Scripting 2 11-27-2009 12:04 PM
sftp/scp without password chuikingman Red Hat 5 08-25-2009 11:04 AM



All times are GMT -4. The time now is 01:27 PM.