Version 12 of sftp

Updated 2012-08-16 23:28:25 by gavino

SFTP stands for ssh file transfer protocol; curiously, the pertinent Wikipedia article [L1 ] refers to the operative IETF draft [L2 ] only rather obliquely. When encountering the term sftp, one may in fact see references to two different things:

  1. the secure file transfer program client, which is a command line program that comes with OpenSSH and which is an interactive interface similar to the normal ftp clients one may find on their platform.
  2. the true ssh file transfer protocol. refers to this as being almost a remote file system protocol. Full support of the protocol is more than just running ftp over SSH-2 or with an SSL layer.

A vfs module for the ssh file transfer protocol would be extremely cool.

While there's a widespread belief that Expect is essentially necessary for effective automation of sftp (first sense), this is not true. Several distinct approaches exist [L3 ] [L4 ] [L5 ] ... [explain] OTOH, most of these seem to be alternative SFTP clients with built-in automation support, so for use from within Tcl the most portable solution may well be to use Expect (or sftp in batch mode, if that is sufficient).

BF - 2012-02-08 16:05:18

This guy claims to have a solution to the FTP on TLS problem

gavino - 16aug2012

I automated sftp login and change dir and download without keys using perl expect in order to script monitor the sftp server's working condition.  
I would love to see how tcl or tcl expect would do this without keys.
code follows:
use strict;
use Expect;

# Uncomment the following line if you want to see what expect is doing
#$Expect::Exp_Internal = 1;

# Uncomment the following line if you don't want to see any output from the script
#$Expect::Log_Stdout = 0;

# set your username/password here
my $sftpUsername = "gerogebush" ;
my $sftpPassword = "texas";
my $sftpServer = "";
my $fileToFetch1 = "file1";
my $fileToFetch2 = "file2";
my $dir1 = "IN";
my $dir2 = "OUT";
my $timeout = 1;

# If sftp is not in your path replace with absolute path of sftp program
my $command = 'sftp';
my $params = ("$sftpUsername\@$sftpServer");

# Create the Expect object
my $exp = Expect->spawn($command, $params) or die "Cannot spawn sftp command \n";

# If this is the first time you are running this , expect will send "yes" to add the key
# for the sftp server to the ~/.ssh/known_hosts file else
# wait for "Password Authentication" string to show up
        "Password Authentication",
        "Are you sure you want to continue connecting", sub {my $self = shift; $self->send("yes\n");}

# Wait for Password prompt to show up
#$exp->expect($timeout, "password:");
$exp->expect($timeout, "password:");
#$exp->expect($timeout, "Password:");

# Sent the sftp password

# Wait for sftp prompt
$exp->expect($timeout, "sftp>");

$exp->send("cd $dir1\n");

# Wait for sftp prompt
$exp->expect($timeout, "sftp>");

$exp->send("get $fileToFetch1\n");

# Wait for sftp prompt
$exp->expect($timeout, "sftp>");

$exp->send("cd ../$dir2\n");

# Wait for sftp prompt
$exp->expect($timeout, "sftp>");

$exp->send("get $fileToFetch2\n");

# Wait for sftp prompt
$exp->expect($timeout, "sftp>");

# Close ftp session

# Destroy the expect object