use strict; use warnings; use Carp; sub die_msg { my $ftp=shift; Carp::confess join "",@_,":\n",$ftp->message; } sub do_connect { my ($user,$pass,$host,$dir)=@_; my $ftp=Net::FTP->new($host) or die "Failed to connect to host '$host':$@"; $ftp->login($user,$pass) or die_msg $ftp,"Failed login"; $ftp->binary() or die_msg $ftp,"Failed to switch to binary mode"; $ftp->cwd($dir) or die "Cant cwd '$dir'"; return $ftp; } my $source_ftp=do_connect('user1','mypassword','some-server.com','/home/test/source'); my $dest_ftp =do_connect('user2','mypassword','some-server.com','/home/test/dest'); my $source_file = "test.txt"; my $dest_file ||= $source_file; $source_ftp->pasv_xfer($source_file, $dest_ftp, $dest_file) or warn "Failed xfer:\n" . $source_ftp->ok ? $dest_ftp->message : $source_ftp->message;