GNU/Linux >> Tutoriels Linux >  >> Linux

Est-il possible de récupérer le contenu d'un script bash en cours d'exécution à partir de la RAM

Jetez un œil à /proc/$PID/fd. Là, vous devriez avoir tous les descripteurs de fichiers ouverts par le processus, y compris le script lui-même. Juste cat $FD > /tmp/yourscript.sh devrait suffire à le récupérer.


En supposant que l'OP signifiait vraiment de la RAM et non n'importe comment , et en supposant que le processus dans lequel le script a été exécuté n'a aucune limite de fichier de base (ce qui est généralement le paramètre par défaut, cat /proc/PID/limits ), vous devez alors vous attacher au processus et soit définir la limite du noyau sur une valeur suffisamment grande pour inclure l'image de processus et utiliser le signal ABRT pour générer le fichier noyau, soit utiliser un outil tel que gdb qui peut s'attacher à un processus et générer une image centrale du processus à partir de la RAM.

  1. Installer gdb

Dans un shell avec la même propriété que le script en cours d'exécution ou la propriété root :

  1. Faire ps ax pour trouver l'identifiant du processus (PID)
  2. gdb -p PID

Notez que cela empêchera l'exécution du processus de continuer mais ne le supprimera pas de la table des processus.

  1. Dans gdb, lancez la commande generate-core-file

gdb devrait répondre avec quelque chose comme Saved corefile core.15113 , en supposant que le PID est 15113.

  1. Dans gdb, lancez la commande detach

Votre script continuera (reprendra) son exécution.

  1. Dans gdb, lancez la commande quit
  2. En shell, exécutez strings core.15113 > my_script.sh

Ouvrez le my_script.sh dans un certain éditeur. Le texte de votre script doit se trouver 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 :

[email protected]:~$ gdb -p 15113
GNU gdb (GDB) 7.4.1-debian
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Attaching to process 15113
Reading symbols from /bin/bash...(no debugging symbols found)...done.
Reading symbols from /lib/x86_64-linux-gnu/libtinfo.so.5...(no debugging symbols found)...done.
Loaded symbols for /lib/x86_64-linux-gnu/libtinfo.so.5
Reading symbols from /lib/x86_64-linux-gnu/libdl.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib/x86_64-linux-gnu/libdl.so.2
Reading symbols from /lib/x86_64-linux-gnu/libc.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib/x86_64-linux-gnu/libc.so.6
Reading symbols from /lib64/ld-linux-x86-64.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib64/ld-linux-x86-64.so.2
0x00007feaf4b4c7be in waitpid () from /lib/x86_64-linux-gnu/libc.so.6
(gdb) generate-core-file
Saved corefile core.15113
(gdb) detach
Detaching from program: /bin/bash, process 15113
(gdb) quit
[email protected]:~$ 

Linux
  1. Pourquoi le script Bash ne reconnaît-il pas les alias ?

  2. Est-il possible d'appliquer les commandes intégrées à Bash ?

  3. La "bonne" façon de tester si un service s'exécute dans un script ?

  4. Comment arrêter le script Loop Bash dans le terminal ?

  5. Installer des programmes à partir du script Bash ?

Comment vérifier la syntaxe d'un script Bash sans l'exécuter ?

Pipe vers/depuis le presse-papiers dans le script Bash

Exécuter le script bash à partir de l'URL

Exécuter un script Python à partir de PHP

Exécuter Pycharm en tant que root depuis le lanceur

Script bash pour supprimer le fichier le plus ancien d'un dossier