FTP Output Verarbeiten

Firewire2002

Registered User
Hallo,

ich steh momentan völlig auf dem Schlauch. :o
Und zwar bastel ich an einem FTP Backup Shell-Script. Welches bei der Erzeugung des Vollbackups einen neuen Ordner anlegt und bei differentiellen Backups in den zuletzt erstellten Ordner speichert. (Ordnernamen beinhalten das Datum)
Beim nächsten Vollbackup wird geprüft wieviele Ordner vorhanden sind und löscht alle Ordner (samt Backups) welche ein bestimmtes Alter überschritten haben.

Soviel zum Gesamtvorhaben. Nun zum eigentlichen Problem:
Um zu prüfen in welchen Ordner die Diff. Backups gespeichert werden sollen bzw. welche Ordner gelöscht werden können muss ich diese mittels "ls" vom FTP Server abfragen.
Die gesamte Ausgabe des FTP Clients in eine Variable zu schieben scheidet in sofern aus, da ich dazu mehrere FTP Sitzungen hintereinander aufbauen müsste. Dies möchte ich allerdings vermeiden und das gesamte innerhalb einer einzigen FTP Session machen.
Das heißt ich verbinde mich zum FTP Server, frage die dort verfügbaren Ordner und Dateien mittels "ls" ab, verarbeite diese Ausgabe, führe entsprechend weitere Aktionen auf dem FTP aus und trenne die Verbindung.

Ich hab allerdings keine Ahnung wie ich die Ausgabe zwischendurch verarbeite.

Die FTP Sitzung sieht im Moment so aus:
Code:
ftp -n << EOFTP
open $FTPHost
user $FTPUser $FTPPassword
bin
put "| tar --create --gzip --numeric-owner --same-permissions --absolute-names --recursion -g /.ftpbackup $Backup_Source" Backup_Full_$Day.tar.gz
quit
EOFTP
+ ein bisschen Kram davor und danach. ;)

Hat vielleicht jemand eine Idee für mich?

Edit:
Hab das Ganze nun in einem Perl Script gelöst.
Ideen wie man dies in einem Bash Script umsetzen könnte sind dennoch gern gesehen. :)

Wer interesse an dem FTP Backup Script hat, bitteschön:
Code:
#!/usr/bin/perl

use strict;
use warnings;
use Net::FTP;
use File::Copy;

#####################################################################################  Configuration

my $FTPHost='host';
my $FTPUser='user';
my $FTPPassword='password';

my $Backup_Source='/etc /home /root /srv';
my $Num_of_last_Backups=4;

my $BackupDate=`date +%Y%m%d`;
$BackupDate =~ s/\n//g;
my $Day=`date +%u`;
$Day =~ s/\n//g;

##################################################################################### Variables

my $obj;
my $remotefilename;
my $i;

##################################################################################### Cleaning

my $tmp=`apt-get clean`;
print $tmp;

##################################################################################### FTP

my $ftp = Net::FTP->new($FTPHost);

unless (defined $ftp) {
	print "$@\n";
	die "Can't create Net::FTP-Object\n";
}

$ftp->login($FTPUser,$FTPPassword) || die "Can't login $!";
$ftp->type('I');

##################################################################################### Backup

my @ftpdir = grep(/\d{8}/,$ftp->ls());
@ftpdir = sort {$b cmp $a} @ftpdir;

if ($Day == 7) {
	$remotefilename="Backup_Full_$Day.tar.gz";
	unlink("/.ftpbackup");
	
	$ftp->mkdir($BackupDate);
	for ($i=$Num_of_last_Backups; $i<=$#ftpdir; $i++ ) {
		$ftp->rmdir($ftpdir[$i], 1);
	}
	$ftp->cwd($BackupDate);

	open PIPE, "tar --create --gzip --numeric-owner --same-permissions --absolute-names --recursion -g /.ftpbackup $Backup_Source | ";
	$ftp->put(\*PIPE,$remotefilename);
	close(PIPE);
} 
else {
	$remotefilename="Backup_Diff_$Day.tar.gz";
	copy("/.ftpbackup", "/.ftpbackup.diff");
	$ftp->cwd($ftpdir[0]);

	open PIPE, "tar --create --gzip --numeric-owner --same-permissions --absolute-names --recursion -g /.ftpbackup.diff $Backup_Source | ";
	$ftp->put(\*PIPE,$remotefilename);
	close(PIPE);

	unlink("/.ftpbackup.diff");
}

##################################################################################### Finish

$ftp->quit();
 
Last edited by a moderator:
Back
Top