IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

[bash] Supprimer en masse 3 lignes en début de fichier


Sujet :

Linux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 10
    Par défaut [bash] Supprimer en masse 3 lignes en début de fichier
    Bonjour à tous,

    mon site à été hacké il y a peu de temps. Résultat des courses, tous mes fichiers .php ont été modifié : 3 lignes ont été ajoutées au début de chaque fichier :
    <?php /**/eval(base64_decode('XXXXX')); ?>
    <?php
    /**
    * le reste de mon code


    Ici il n'ya qu'une ligne, mais le code "XXX" est tellement grand, que ça prends 3 lignes sur mon éditeur.

    Je cherche donc une commande bash qui me permet de parcourir tout mon répertoire et ses sous-répertoires, de détecter les fichiers .php, de tester si cette (ces) ligne(s) est présente, et de la supprimer.

    Je n'ai encore pas réussi à faire cela, pouvez-vous m'aider ?

    Merci par avance à tous !

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Salut,

    Est-ce qu'il y a un motif dans ces 3 lignes bien caractéristique, facilement identifiable et isolable ?

    Si oui, un truc du genre devrait le faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find /répertoire -type f -name "*.php" -exec sed -i '1{N;N;/motif_qui_va_bien/d}' {} \;
    Attention, je te conseille de faire des tests au-préalable sur 2 ou 3 fichiers ou plus (l'idéal serait de prendre des fichiers infectés et des fichiers sains) que tu isoles dans un répertoire, sur lesquels tu lances la commande et vois si le résultat te satisfait...

    Au cas ou tu peux aussi rajouter une extension à l'option "-i" de sed, comme "-i.bak", ça te créera une sauvegarde avec l'extension ".bak" de chaque fichier modifié. Après quoi tu pourras supprimer ces fichiers si la commande a rempli sa fonction

  3. #3
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    jette un oeil du coté de head/tail

    http://www.linux-kheops.com/doc/man/...n1/tail.1.html

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 10
    Par défaut
    Je ne comprends pas le sed zipe31. Je connais bien le find, le exec et tout, mais que fait ton sed ?
    J'ai essayé chez moi ça ne fonctionne pas.

    En fait, la ligne à supprimer est toujours la même :
    <?php /**/eval(base64_decode('plein_de_lettre_et_de_chiifres')); ?>
    Il faut peut-être échapper certains caractère pour le sed ?


    jabbounet : Le head, pourquoi pas, mais il faudrait que je teste pour voir si la première ligne est celle à supprimer ou pas.
    Je continue mes recherches, merci encore

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Citation Envoyé par pT-benj Voir le message
    Je ne comprends pas le sed zipe31. Je connais bien le find, le exec et tout, mais que fait ton sed ?
    J'ai essayé chez moi ça ne fonctionne pas.

    En fait, la ligne à supprimer est toujours la même :
    <?php /**/eval(base64_decode('plein_de_lettre_et_de_chiifres')); ?>
    Il faut peut-être échapper certains caractère pour le sed ?
    Est-ce que ce motif "eval(base64_decode(" est unique dans les lignes a rechercher ?

    Si oui, alors :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find /répertoire -type f -name "*.php" -exec sed -i '1{N;N;/eval(base64_decode(/d}' {} \;
    Devrait aller bien.

    En fait la commande sed ne fait que vérifier si le motif "eval(base64_decode(" est bien présent dans les 3 premières lignes (1{N;N = on lit la 1ère ligne et on prend les 2 suivantes) de chaque fichier passé en paramètre, et si c'est le cas, on supprime (d) les 3 lignes. L'option "-i" signifie qu'il faut modifier le fichier "en place".

  6. #6
    Membre éclairé Avatar de ben.IT
    Homme Profil pro
    Inscrit en
    Janvier 2009
    Messages
    431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 431
    Par défaut
    Salut pT-benj,
    pour effacer les 3 premières lignes de ton fichier tu peux utiliser tail avec l'option -n et le préfixe +, d'après le man de tail :
    -n, --lines=N
    output the last N lines, instead of the last 10; or use +N to
    output lines starting with the Nth
    tu peux ainsi afficher les lignes de ton fichier de la 4 ème à la fin de ton fichier.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    Le script a débuté sur dim. 13 févr. 2011 14:53:45 CET
    benilto@supercopter:~/test$ cat test 
    a
    z
    e
    r
    t
    y
     
    benilto@supercopter:~/test$ tail -n +4 test 
    r
    t
    y
     
    benilto@supercopter:~/test$ tail -n +4 test > testOk
    benilto@supercopter:~/test$ cat testOk 
    r
    t
    y
     
    benilto@supercopter:~/test$ exit
    exit
     
    Script complété sur dim. 13 févr. 2011 14:54:20 CET
    en espérant t'avoir aidé,
    à bientôt,
    ben

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 10
    Par défaut
    Salut benilto,

    je connaissais déjà cette syntaxe de head et tail. Le problème était comment tester si le fichier était infecté, et comment virer cette première ligne le cas échéant.

    En fait, j'ai trouvé, ça fonctionne
    J'ai utilisé le code de zipe31 mais comme j'avais une simple quote dans mon filtre de recherche, j'ai du remplacer les simples quotes de la commande sed (que j'ai un peu modifié) par des doubles.
    Voici ma commande finale, qui fonctionne :

    find repertoire/ -type f -name "*.php" -exec sed -i "s/eval(base64_decode('plein_de_chiffres_et_lettres'));//g" {} \;

    Merci pour votre aide à tous en tout cas

  8. #8
    Membre éclairé Avatar de ben.IT
    Homme Profil pro
    Inscrit en
    Janvier 2009
    Messages
    431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 431
    Par défaut
    tu peux le faire en scirpt shell, si tu dois le faire sur plusieurs fichiers:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
      1 #!/bin/bash
      2 if [ $# -ne 2 ]
      3 then
      4         echo "param 1 : nom du fichier, param 2 nombre de premieres lignes a     enlever"
      5         exit 2
      6 fi
      7 #ajout de 1 pour commecneer a la ligne suivante
      8 let DEBUT=$2+1
      9 tail -n +$DEBUT $1 > tmp
     10 rm $1
     11 mv tmp $1
     12 echo "suppression des $2 lignes effectuees dans le fichier $1"
    a+,
    ben

  9. #9
    Membre éclairé Avatar de ben.IT
    Homme Profil pro
    Inscrit en
    Janvier 2009
    Messages
    431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 431
    Par défaut
    oups, désolé.
    bien joué
    a+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ajout d'une ligne en début de fichier CSV
    Par dbtn89 dans le forum Langage
    Réponses: 13
    Dernier message: 12/05/2015, 19h52
  2. Ajouter une ligne en début de fichier
    Par MB_MathemaTeX dans le forum Général Python
    Réponses: 4
    Dernier message: 20/03/2010, 18h02
  3. Ecrire une ligne au début du fichier existant
    Par squalito dans le forum VBScript
    Réponses: 1
    Dernier message: 17/07/2008, 23h37
  4. Supprimer un saut de ligne
    Par spikto dans le forum Langage
    Réponses: 1
    Dernier message: 28/11/2005, 20h54
  5. [RegEx] supprimer les retours à la ligne
    Par illegalsene dans le forum Langage
    Réponses: 4
    Dernier message: 21/10/2005, 10h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo