[George Peter Staplin]: [sftp] ([ssh] [FTP]) has a wonderful feature that allows for executing a script. The script below automates the procedure of uploading files from a local public_html to a network.
To make it easier you can use ssh public keys, so that you don't have to type the password repeatedly. I suggest that you generate a public key (~/.ssh/'''id_dsa.pub'''), and upload it to the server's ~/.ssh/authorized_keys, so that you don't need a password.
The authentication agent can help make it easier to manage key passwords.
$ crontab -l
@reboot ssh-agent -s | grep -v echo > $HOME/.ssh-agent
Then I just type '''ssh-add''' after I have started my box, and enter the private key password.
-----
======
#!/usr/bin/env tclsh8.4
proc main {argc argv} {
if {$argc < 1} {
puts stderr "syntax is: [info script] file"
return 1
}
set dir [file normalize .]
set remote_dir [string range $dir [string first public_html $dir] end]
puts REMOTE:$remote_dir
set fd [open _script_ w]
# Prefix the mkdir with - to avoid termination if it already exists.
puts $fd "-mkdir -p $remote_dir"
puts $fd "cd $remote_dir"
foreach f $argv {
puts "PUT $f"
puts $fd "put $f\nls -l $f"
}
puts $fd quit
close $fd
if {[catch {exec sftp -b _script_ georgeps@xmission.com} r] && $::errorCode ne "NONE"} {
puts stderr ERRORCODE:$::errorCode
puts stderr ERROR:$r
return 1
}
puts $r
file delete _script_
return 0
}
exit [main $::argc $::argv]
======
----
'''Usage:'''
$ pwd
/home/gps/archive/public_html/tmp
$ pubup foo.jpg
At this point foo.jpg should be uploaded to the server's public_html/tmp.
-----
'''[gavino] - 16aug2012'''
I automated sftp login and change dir and download:<
>
1 without keys<
>
2 SSH was turned OFF on the server, so ONLY pure SFTP connections are not dropped.
My Expect attempt failed, Net::SFTP failed since it uses SSH, which was turned off: so I used 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, and without ssh: only sftp connections get handled.<
>
code follows:
===
#!/usr/bin/perl
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 = "bush.texas.com";
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
$exp->expect($timeout,
["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
$exp->send("$sftpPassword\n");
# 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
$exp->send("bye\n");
# Destroy the expect object
$exp->soft_close();
===
<> Internet