J'ai accidentellement écrasé un script bash très complexe, où j'ai essayé d'implémenter la portée et le filetage de manière ordonnée.
Maintenant, le même script est toujours en cours d'exécution, mais le fichier n'est plus, la question est: est-il possible de parcourir le ram et de trouver la représentation sting du fichier lui-même?
Un autre problème est: je ne trouve pas le fichier / dev / mem ou / dev / kmem, déjà essayé de le récupérer pour le contenu.
Pour l'environnement: c'est un hostet debian / sid machine (vps) sur vpsfx.com
root @ heisenberg: ~ # ls -a / dev . kmsg ptyp2 ptyp9 aléatoire tty1 tty5 ttyp2 ttyp9 urandom .. log ptyp3 ptypa shm tty10 tty6 ttyp3 ttypa xconsole .udev null ptyp4 ptypb stderr tty11 tty7 ttyp4 ttypb zero char ptmx ptyp5 ptypc stdin tty12 tty8 ttyp5 ttypc console pts ptyp6 ptypd stdout tty2 tty9 ttyp6 ttypd fd ptyp0 ptyp7 ptype tty tty3 ttyp0 ttyp7 ttype ptyp1 complet ptyp8 ptypf tty0 tty4 ttyp1 ttyp8 ttypf
/proc
fs ne réside pas dans la RAM. En fait, il ne réside nulle part . Voir unix.stackexchange.com/questions/74713/… . Bien que vous puissiez obtenir le fd/proc
,cat
le fd lit le fichier à partir de fs, pas de RAM. Certes, vous avez supprimé le fichier, réduisant le nombre de références d'inode, et personne d'autre ne peut le voir maintenant, mais il n'est pas réellement supprimé du fs jusqu'à ce que le processus exécutant le script le ferme. Voir stackoverflow.com/questions/2028874/… .En supposant que l'OP signifiait vraiment à partir de la RAM et pas de toute manière possible , et en supposant que le processus dans lequel le script a été exécuté n'a aucune limite de fichier de base (qui est généralement le paramètre par défaut
cat /proc/PID/limits
), alors vous devez vous attacher au processus et soit définissez la limite de base sur une valeur suffisamment grande pour inclure l'image de processus et utiliser le signal ABRT pour générer le fichier de base, ou utilisez un outil tel quegdb
celui-ci peut se joindre à un processus et générer une image de base du processus à partir de la RAM.gdb
Dans certains shell avec la même propriété que le script en cours d'exécution ou la propriété root:
ps ax
pour trouver l'ID de processus (PID)gdb -p PID
Notez que cela empêchera l'exécution du processus de continuer mais ne la supprimera pas de la table de processus.
generate-core-file
gdb devrait répondre avec quelque chose comme
Saved corefile core.15113
, en supposant que le PID est 15113.detach
Votre script continuera (reprendra) à fonctionner.
quit
strings core.15113 > my_script.sh
Ouvrez le
my_script.sh
dans un éditeur. Le texte de votre script doit être vers la fin du fichier avant la section environnement. Utilisez l'éditeur pour gratter les sections avant et après le script.Testez cette solution sur un autre script avant de l'utiliser sur votre script de prix. YMMV.
La séquence ressemble à ceci:
la source
dd la partition du disque dur en morceaux se chevauchant et binaire grep pour des parties du script. si vous êtes chanceux, écrivez ces morceaux dans un répertoire temporaire dans ram pour y accéder pour sauvegarder votre disque dur ou les cycles d'écriture de ssd. non, ce n'est pas une solution «de bélier». soyez conscient du fait que lors de la lecture du disque octet par octet, les scripts peuvent être au format utf-8 (ou similaire) charset, de sorte que les paramètres grep devront également être adaptés.
la source