GNU/Linux >> Tutoriales Linux >  >> Linux

¿Es posible recuperar el contenido de un script bash en ejecución desde la RAM?

Eche un vistazo a /proc/$PID/fd. Allí debería tener todos los descriptores de archivo abiertos por el proceso, incluido el script en sí. Solo cat $FD > /tmp/yourscript.sh debería ser suficiente para recuperarlo.


Suponiendo que el OP realmente significaba de RAM y no cualquier manera posible , y suponiendo que el proceso en el que se ejecutó el script tiene un límite de archivos de núcleo cero (que suele ser la configuración predeterminada, cat /proc/PID/limits ), luego debe adjuntar al proceso y establecer el límite central en un valor lo suficientemente grande como para incluir la imagen del proceso y usar la señal ABRT para generar el archivo central, o usar una herramienta como gdb que se puede adjuntar a un proceso y generar una imagen central del proceso desde la RAM.

  1. Instalar gdb

En algún shell con la misma propiedad que el script en ejecución o propiedad raíz:

  1. Haz ps ax para encontrar la identificación del proceso (PID)
  2. gdb -p PID

Tenga en cuenta que esto detendrá la ejecución del proceso pero no lo eliminará de la tabla de procesos.

  1. En gdb, emita el comando generate-core-file

gdb debería responder con algo como Saved corefile core.15113 , asumiendo que el PID es 15113.

  1. En gdb, emita el comando detach

Su secuencia de comandos continuará (reanudará) ejecutándose.

  1. En gdb, emita el comando quit
  2. En shell, ejecute strings core.15113 > my_script.sh

Abre el my_script.sh en algún editor. El texto de su secuencia de comandos debe estar hacia el final del archivo antes de la sección de entorno. Usa el editor para raspar las secciones antes y después del guión.

Pruebe esta solución en otro script antes de usarla en su script premiado. YMMV.

La secuencia se ve así:

[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. Evitar que un script bash se ejecute simultáneamente

  2. ¿Por qué The Bash Script no reconoce los alias?

  3. ¿Cuál es la mejor manera de detectar (a partir de un script) si el software está instalado?

  4. Bash Script para eliminar el archivo más antiguo de una carpeta?

  5. ¿La forma "adecuada" de probar si un servicio se está ejecutando en un script?

¿Es posible rastrear los comandos incorporados a Bash?

¿Cómo verifico la sintaxis de un script Bash sin ejecutarlo?

ejecutar script php (función php) en linux bash

Variable en Bash Script que mantiene su valor desde la última vez que se ejecutó

¿Cómo puedo hacer sonar la campana de audio dentro de un script bash que se ejecuta en la pantalla gnu?

Bash script para eliminar el archivo más antiguo de una carpeta