Скрипт для безвозвратного удаления данных

Discussion in 'PHP' started by Digimortal, 8 Mar 2007.

  1. Digimortal

    Digimortal Banned

    Joined:
    22 Aug 2006
    Messages:
    471
    Likes Received:
    248
    Reputations:
    189
    пример скрипта на perl, служащего для безвозвратного удаления файлов (без возможности восстановления спец. софтом) с жесткого диска.. Есть возможность использования 3х алгоритмов удаления; удалять отдельные файлы или полностью содержимое директорий..
    Code:
    #!/usr/bin/perl -w
    
    use strict;
    
    my $file = shift || usage();
    
    if ($file =~ /^\'/)
    {
    	while ($file !~ /\'$/ && @ARGV)
    	{
    		$file .= ' '; 
    		$file .= shift;
    	} 
    	$file =~ s/^\'//;
    	$file =~ s/\'$//;
    }
    
    my $algo = shift || 'visr';
    my $mode = shift || 0;
    
    my ($f, $rand, @size);
    
    $file =~ /[\/\\]$/ ? delete_dir($file) : wipe($file);
    
    
    sub delete_dir
    
    {
    	my $dir = shift;
    	
    	my @files = getfiles($dir, 0);	 
    	wipe("$dir/$_") foreach (@files);
    	
    	my @dirs  = getfiles($dir, 1);
    	delete_dir ("$dir/$_") foreach (@dirs);
    	
    	print "Directory $dir deleted..\n" if rmdir($dir) or print "Can't delete directory $dir\n";
    }
    
    
    sub getfiles
    
    {
    	my ($dir, $flag, $line, @dirlist, @res_mas, @dir_mas) = @_;
    	
    	opendir my $d, "$dir";
    	@dirlist = readdir $d;
    	
    	foreach my $line(@dirlist)
    	{
    		push @res_mas, $line if (!-d "$dir/$line" && $line ne '.' && $line ne '..' && !$flag);
    		push @dir_mas, $line if ( -d "$dir/$line" && $line ne '.' && $line ne '..' && $flag);
    	}
    	
    	closedir $d;
    	
    	return @res_mas if !$flag;
    	return @dir_mas if $flag;
    }
    
    
    sub wipe
    
    {
    	my $file = shift;
    
    	open $f, "+<", $file or exit print "Can't delete $file";
    	
    	binmode $f;
    	@size = stat $f;
    	my $t = time;
    
    	open $rand, "<", '/dev/urandom' or die "\n\tCan\'t open /dev/urandom\n" if $mode;
    
    	if ($algo eq 'visr') { visr() }
    	elsif ($algo eq 'bs') { bs() }
    	elsif ($algo eq 'pg') { pg() }
    	else { usage() }
    	
    	close $rand if $mode;
    	close $f;
    
    	unlink $file;
    	$t = time-$t;
    	
    	print "File $file deleted in $t seconds..\n";
    }
    
    
    sub usage
    
    { 
    	print << 'HELL';
    
    			The Mainest Evil of Runet
    	 _  _     _ _ _  __     _      _   _
    	| || |___| | | |/ /_ _ (_)__ _| |_| |_ ___
    	| __ / -_) | | . <| . \| / _. | . \  _(_-<
    	|_||_\___|_|_|_|\_\_||_|_\__. |_||_\__/__/
                hellknights.void.ru  |___/   .0x48k.
                digimortal.0x48k.cc        .Digimortal.
    	
    	   Tool: DiWiper.pl v.0.4
    
    	  Usage: perl diwiper.pl <file/dir> [algo] [mode]
    	  	  
    	Options: 	                   
    	   algo: visr - algorithm VISR  (default)
    		 bs   - Bruce Shneier's algorithm
    		 pg   - Peter Gutmann's algorithm
    	   mode: 0    - use rand()      (default)
    	   	 1    - use /dev/urandom
    	   	
    HELL
    
    	exit;
    }
    
    
    sub fill
    
    {
    	my $val = shift;
    	seek $f, 0, 0;
    	print $f $val for (1..$size[7]);
    }
    
    
    sub fill_rand
    
    {
    	seek $f, 0, 0;
    	for (1..$size[7])
    	{
    		print $f getc $rand if $mode;
    		print $f chr rand 256 if $mode==0;
    	}
    }
    
    
    sub visr
    
    {
    	for (1..3)
    	{
    		fill ("\x00");
    		fill ("\xFF");
    	}
    	fill ("\xAA");
    }
    
    
    sub bs
    
    {
    	fill ("\xFF");
    	fill ("\x00");
    	fill_rand() for (3..7);
    }
    
    
    sub pg
    
    {
    	fill_rand() for (1..4);
    	
    	my @val =( "\x55", "\xAA", "\x92", 
    		   "\x49", "\x24", "\x00", 
    		   "\x11", "\x22", "\x33", 
    		   "\x44", "\x55", "\x66", 
    		   "\x77", "\x88", "\x99", 
    		   "\xAA", "\xBB", "\xCC", 
    		   "\xDD", "\xEE", "\xFF", 
    		   "\x55", "\xAA", "\x92", 
    		   "\x00", "\x49", "\x24" );
          		
    	fill ($val[$_]) for (0..$#val);
    	fill_rand() for (32..35);
    }
    
    
    # thnx 2 ShadOS за то, что подкинул идейку этого скриптика ;)
    # & thnx 2 KSURi за "технический аудит" моего perl-кода =)
    # eof..
    
    для удаления папок/каталогов следует добавить в конец их имени "\" или "/", если есть пробелы в значении параметра - то обрамить одинарными кавычками.. например:
    perl diwiper.pl 'c:\Documents and Settings\user\123\' bs
    удалит безвозвратно алгоритмом Брюса Шнайера все файлы, содержащиеся в директории 123 и ее саму..

    з.ы. юзайте аккуратно, ато удалите чего лишнего =))
     
    #1 Digimortal, 8 Mar 2007
    Last edited: 11 Mar 2007
    2 people like this.
  2. ShadOS

    ShadOS ы

    Joined:
    11 Feb 2007
    Messages:
    667
    Likes Received:
    351
    Reputations:
    413
    digi, молодец! Это скрипт ведь и под никсами работает! А оффтоперам жирные минусы поноставить надо!