récupérer un fichier supprimé maintenu ouvert par apache?


10

Supposons qu'un fichier journal apache soit supprimé mais qu'il soit maintenu ouvert par apache; alors c'est ce que je fais:

pid=$(lsof | grep text.txt | awk '/deleted/ {print $2}')
fd=$(lsof | grep text.txt | awk '/deleted/ {print $4}' | grep -oE "[[:digit:]]{1,}")

cp /proc/$pid/fd/$fd directorytobecopied/testfile.txt

Voici ce que je fais pour récupérer le fichier et le remettre où il était. Existe-t-il un moyen plus simple de le faire, car le code ci-dessus ne semble pas bon. De plus, comment puis-je savoir d'où le fichier a été supprimé ( répertoire copié) pour ne pas avoir à demander manuellement à quelqu'un où se trouvait le fichier à l'origine et le remettre là-bas.


lsof / | awk '(/deleted/||/abc.txt/) {print "FD :-",$4,"| File Name:-",$9}'
Rahul Patil

Réponses:


14

Si un fichier a été supprimé mais est toujours ouvert, cela signifie que le fichier existe toujours dans le système de fichiers (il a un inode ) mais a un nombre de liens durs de 0. Puisqu'il n'y a pas de lien vers le fichier, vous ne pouvez pas l'ouvrir par son nom . Il n'y a pas non plus de possibilité d'ouvrir un fichier par inode.

Il n'y a aucun moyen de découvrir le fichier via son système de fichiers, et surtout aucun moyen de rechercher le fichier dans le répertoire où il se trouvait en dernier. L'entrée du répertoire a disparu. Il ne reste que le fichier lui-même. Vous pouvez accéder au fichier avec un débogueur de système de fichiers, mais cela nécessite des autorisations root et est difficile à utiliser et source d'erreurs.

Linux expose les fichiers ouverts via des liens symboliques spéciaux sous /proc. Ces liens sont appelés /proc/12345/fd/42où 12345 est le PID d'un processus et 42 est le numéro d'un descripteur de fichier dans ce processus. Un programme fonctionnant avec le même utilisateur que ce processus peut accéder au fichier (les autorisations de lecture / écriture / exécution sont les mêmes que celles que vous aviez lorsque le fichier a été supprimé).

Le nom sous lequel le fichier a été ouvert est toujours visible dans la cible du lien symbolique: si le fichier l'était /var/log/apache/foo.log, alors la cible du lien est /var/log/apache/foo.log (deleted). (Si le fichier a été renommé après son ouverture, la cible du lien symbolique peut refléter le changement de nom.)

Ainsi, vous pouvez récupérer le contenu d'un fichier supprimé ouvert étant donné le PID d'un processus qui l'a ouvert et le descripteur sur lequel il est ouvert comme ceci:

recover_open_deleted_file () {
  old_name=$(readlink "$1")
  case "$old_name" in
    *' (deleted)')
      old_name=${old_name%' (deleted)'}
      if [ -e "$old_name" ]; then
        new_name=$(TMPDIR=${old_name%/*} mktemp)
        echo "$oldname has been replaced, recovering content to $new_name"
      else
        new_name="$old_name"
      fi
      cat <"$1" >"$new_name";;
    *) echo "File is not deleted, doing nothing";;
  esac
}
recover_open_deleted_file "/proc/$pid/fd/$fd"

Si vous ne connaissez que l'ID de processus mais pas le descripteur, vous pouvez récupérer tous les fichiers avec

for x in /proc/$pid/fd/*; do
  recover_open_deleted_file "$x"
done

Si vous ne connaissez pas non plus l'ID de processus, vous pouvez rechercher parmi tous les processus:

for x in /proc/[1-9]*/fd/*; do
  case $(readlink "$x") in
    /var/log/apache/*) recover_open_deleted_file "$x";;
  esac
done

Vous pouvez également obtenir cette liste en analysant la sortie de lsof, mais elle n'est ni plus simple, ni plus fiable, ni plus portable (c'est spécifique à Linux de toute façon).


Vous pouvez ouvrir / proc / x / fd / y pour la lecture ou l'écriture, que x l'ait ouvert pour la lecture ou l'écriture.
Stéphane Chazelas

pourquoi le système d'exploitation unix permet-il la suppression de fichiers quand il est ouvert ... alors que nous ne pouvons pas le faire dans windows.y a-t-il une explication
munish

@munish Windows est parti d'un modèle multitâche coopératif: si une application se comporte mal, cela pourrait faire baisser le système. La plupart des problèmes ont été résolus, mais Windows permet toujours à une application de pirater un fichier: tant que le fichier est ouvert, il ne peut pas être renommé ou supprimé. Unix ne le permet pas: supprimer ou renommer un fichier est orthogonal par rapport à son ouverture.
Gilles 'SO- arrête d'être méchant'

1
Vous venez de sauvegarder l'origine de la symétrie de Muse pour moi! Merci mille fois!
dotancohen
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.