2010-09-07 6 views
2

Salut chers amis et bonjourlinux + mécanisme trouver avec expression irrégulière (trouver la commande) ou perl

La question suivante peut être compliquée et critique pour mes systèmes

J'ai 4 machines Linux avec groupe

Mon objectif est de trouver toutes sortes d'adresse IP (xxx.xxx.xxx.xxx) dans tous les fichiers dans le système linux

remarque: besoin de scanner chaque fichier dans le système linux et vérifier si le fichier comprend IP adresse si oui besoin d'imprimer l'adresse IP

comme suit

plus /etc/inet/file.example1

182.23.2.4 
255.255.0.0 
10.10.1.1 
19.2.*.* 
127.0.0.1 

plus /etc/dir/file1.example2

1.1.1.1 TCP 

Etc ...... Puis-je obtenir une suggestion créative pour rechercher toutes les adresses IP et les imprimer?

Lidia

+1

Encore une fois, c'est un problème pour SuperUser. – Johnsyweb

+0

@Johnsyweb La [FAQ] (http://stackoverflow.com/faq) indique que SU est pour «Dépannage général de logiciels ou de matériel informatique». Il s'agit d'une question de programmation, pas d'une question de dépannage. –

+0

Je suis assis corrigé. Bien que la raison de la question ne soit pas mentionnée, il semble s'agir de résoudre un problème de réseau ou de sécurité. Depuis que vous l'avez résolu avec un programme Perl, il est clairement à la maison sur SO. – Johnsyweb

Répondre

2

Lorsqu'on lui a demandé de faire correspondre une adresse IP, beaucoup écrire

/\d+\.\d+\.\d+\.\d+/ 

mais cela donnera des faux positifs. Dans Mastering Regular Expressions de Jeffrey Friedl, l'auteur donne un modèle pour les adresses IP correspondantes qui est beaucoup plus prudent. Le code ci-dessous emprunte à Friedl pour forcer non une exécution arbitraire de chiffres mais sur la plage de 0 à 255, nécessite qu'une adresse commence et se termine aux limites de mot (\b), et n'autorise pas l'adresse 0.0.0.0.

Sans argument, le code ci-dessous par défaut le répertoire en cours pour le début de sa recherche. Pour rechercher tous les fichiers, fournissez le répertoire racine en tant qu'argument. En ouvrant chaque chemin généré par find, nous recherchons ensuite une adresse IP sur chaque ligne et imprimons tous les hits avec leurs chemins respectifs.

Notez comment le code utilise local pour basculer de manière transparente entre le caractère NUL et la nouvelle ligne pour le séparateur d'enregistrement $/. Ceci est nécessaire parce que l'action de find sépare les noms de fichiers avec '\0', mais '\n' est le terminateur de ligne. Avec -T, nous recherchons uniquement des fichiers texte.

#! /usr/bin/perl 

use warnings; 
no warnings 'exec'; 
use strict; 

my $octet = qr/[01]?\d\d?|2[0-4]\d|25[0-5]/; 

my $ip = qr/ \b 
      (?!0+\.0+\.0+\.0+\b) 
      $octet(?:\.$octet){3} 
      \b 
      /x; 

@ARGV = (".") unless @ARGV; 
open my $find, "-|", "find", @ARGV, "-type", "f", "-print0" 
    or die "$0: failed to start find: $!\n"; 

$/ = "\0"; 
while (defined(my $path = <$find>)) { 
    chomp $path; 
    next unless -T $path; 
    if (open my $fh, "<", $path) { 
    local $/ = "\n"; 
    while (<$fh>) { 
     print "$path: $_" if /$ip/; 
    } 
    close $fh; 
    } 
    else { 
    warn "$0: open $path: $!\n"; 
    } 
} 
+0

script perl très cool et fort, je dois faire un test sur mon système, donc je vais vous envoyer ma dernière idée encore une fois THX – lidia

+0

si je veux rechercher uniquement l'IP - 123.34.5.23 – lidia

+0

donc je dois définir: mon $ octet = qr/123.34.5.23 /; ? – lidia

0

Sur Linux (où grep prend en charge la recherche récursive) et avec prise en charge d'au plus 1 adresse IP par ligne le code ci-dessous fonctionnerait (--include & exclude sont en option, la recherche commence à partir récursive $ PWD).

grep -r -P [--include=PATTERN --exclude=PATTERN]\ 
    '\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b' $PWD |\ 
    perl -ne 'print "$1\n" if /\b(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\b/;' 
+0

mais je dois aussi scanner tous les fichiers que votre exemple me donne pour trouver IP sur un seul fichier et j'ai besoin de trouver et de scanner tous les fichiers dans le système Linux – lidia

+0

@lidia - Cela fonctionne récursivement. Si vous remplacez $ PWD par/il va trouver toutes les adresses IP dans tous les fichiers, bien que cela prendra des âges – bobah

+0

OK, je reçois tout l'adresse IP écrou dont j'ai besoin pour obtenir le fichier qui correspond à l'adresse IP, comment changer votre syntaxe afin d'obtenir l'adresse IP et le chemin complet du fichier aussi? – lidia

0

Pour la recherche dans les fichiers, j'utilise presque toujours ack.

Un modèle simple qui, sous forme de notes de gbacon, se traduira par des faux positifs:

ack -uo '\b\d+\.\d+\.\d+\.\d+\b' /

L'option -u rend ack correspondance sans restriction, ack sautera généralement des répertoires de métadonnées de contrôle de version comme svn et sauvegarde des dossiers. L'option -o affichera la partie de chaque ligne qui correspond à la place de toute la ligne correspondante.

La même idée, mais en utilisant une meilleure forme de gbacon:

ack -uo '\b(?!0+\.0+\.0+\.0+\b)(?:[01]?\d\d?|2[0-4]\d|25[0-5])(?:\.(?:[01]?\d\d?|2[0-4]\d|25[0-5])){3}\b' /

Pour correspondre à une adresse spécifique, vous pouvez utiliser --literal pour spécifier le texte exact de match.

ack -uo --literal 123.34.5.23 /

Questions connexes