2010-11-17 4 views
1

Je travaille sur un dernier script perl pour mettre à jour mon fichier/etc/hosts, mais je suis bloqué et je me demande si quelqu'un peut vous aider s'il vous plaît? J'ai un fichier texte avec une adresse IP, et j'ai besoin que mon script perl lise ceci, ce qui est fait, mais maintenant je suis bloqué sur la mise à jour du fichier/etc/hosts.Utiliser un script perl pour analyser un fichier puis mettre à jour/etc/hosts

ici est mon script jusqu'à présent:

#!/usr/bin/perl 

use strict; 
my $ip_to_update; 

$ip_to_update = `cat /web_root/ip_update/ip_update.txt | awk {'print \$5'}` ; 

print "ip = $ip_to_update"; 

J'ai besoin alors de trouver une entrée dans/etc/hosts comme

remote.host.tld 192.168.0.20

donc je sais J'ai besoin de l'analyser pour remote.host.tld, puis remplacer le second bit, mais parce que l'ip ne sera pas le même que je ne peux pas faire un remplacement droit.

Quelqu'un peut-il aider le dernier bit im coincé comme s'il vous plaît :(

Thankyou

+0

Que voulez-vous dire ne peut pas faire un remplacement droit? Ne remplacez-vous pas l'IP avec une nouvelle adresse IP? Ou n'avez-vous pas l'info remote.host.tld ou l'ancienne adresse IP à remplacer? –

Répondre

1

Votre substitution ressemblera à ceci:

s#^.*\s(remote\.host\.tld)\s*$#$ip_to_update\t$1# 

remplacement peut se faire en une ligne:

perl -i -wpe "BEGIN{$ip=`awk {'print \$5'} /web_root/ip_update/ip_update.txt`} s#^.*\s(remote\.host\.tld)\s*$#$ip\t$1#"' 
+0

Salut merci pour les réponses, stupidement je l'ai eu à l'envers,/etc/hosts est "192.168.1.20 host.domain.tld" pas l'inverse. Comment intégrer la ligne de substitution dans mon script et comment spécifier le fichier/etc/hosts? – ard

+0

fantastique merci! :) – ard

+0

Salut Désolé, pour rouvrir ceci, mais comment l'intégrerais-je dans mon script existant? comme c'est juste un doublure perl si je comprends bien? – ard

0

Ok, j'ai mis à jour mon script pour inclure l'édition de fichier etc tout en un. ne pas être la meilleure façon de le faire, mais cela fonctionne :)

#!/usr/bin/perl 

use strict; 
use File::Copy; 
my $ip_to_update;   # IP from file 
my $fh_r;     # File handler for reading 
my $fh_w;     # File handler for writing 
my $file_read = "/etc/hosts";  # File to read in 
my $file_write = "/etc/hosts.new"; # File to write out 
my $file_backup = "/etc/hosts.bak"; # File to copy original to 

# Awks the IP from text file 
$ip_to_update = `/bin/awk < /web_root/ip_update/ip_update.txt {'print \$5'}` ; 

# Open File Handlers 
open($fh_r, '<', $file_read) or die "Can't open $file_read: $!"; 
open($fh_w, '>', $file_write) or die "Can't open $file_write: $!"; 

while (my $line = <$fh_r>) 
{ 
     if ($line =~ /remote.host.tld/) 
    { 
       #print $fh_w "# $line"; 
     } 
    else 
    { 
     print $fh_w "$line"; 
    } 
    } 

chomp($ip_to_update);   # Remove newlines 
print $fh_w "$ip_to_update   remote.host.tld\n"; 
     # Prints out new line with new ip and hostname 

# Close file handers 
close $fh_r; 
    close $fh_w; 

move("$file_read","$file_backup"); # Moves original file to .bak 
move("$file_write","$file_read"); # Moves new file to original file loaction 
Questions connexes