GNU/Linux >> Linux Esercitazione >  >> Linux

È possibile recuperare il contenuto di uno script bash in esecuzione dalla RAM

Dai un'occhiata a /proc/$PID/fd. Lì dovresti avere tutti i descrittori di file aperti dal processo, incluso lo script stesso. Solo cat $FD > /tmp/yourscript.sh dovrebbe essere sufficiente per recuperarlo.


Supponendo che l'OP intendesse davvero dalla RAM e non in nessun modo possibile e supponendo che il processo in cui è stato eseguito lo script abbia un limite di file core pari a zero (che di solito è l'impostazione predefinita, cat /proc/PID/limits ), quindi devi collegarti al processo e impostare il core limit su un valore sufficientemente grande da includere l'immagine del processo e utilizzare il segnale ABRT per generare il file core, oppure utilizzare uno strumento come gdb che può collegarsi a un processo e generare un'immagine principale del processo dalla RAM.

  1. Installa gdb

In qualche shell con la stessa proprietà dello script in esecuzione o proprietà root:

  1. Esegui ps ax per trovare l'id del processo (PID)
  2. gdb -p PID

Tieni presente che ciò impedirà all'esecuzione del processo di continuare ma non lo rimuoverà dalla tabella dei processi.

  1. In gdb, esegui il comando generate-core-file

gdb dovrebbe rispondere con qualcosa come Saved corefile core.15113 , supponendo che il PID sia 15113.

  1. In gdb, esegui il comando detach

Il tuo script continuerà (riprenderà) l'esecuzione.

  1. In gdb, esegui il comando quit
  2. Nella shell, esegui strings core.15113 > my_script.sh

Apri il my_script.sh in qualche editore. Il testo dello script dovrebbe trovarsi verso la fine del file prima della sezione dell'ambiente. Usa l'editor per eliminare le sezioni prima e dopo lo script.

Prova questa soluzione su un altro script prima di usarla sul tuo script premio. YMMV.

La sequenza è simile a questa:

[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. Pipe da/verso gli appunti nello script Bash

  2. Qual è il modo migliore per garantire che sia in esecuzione solo un'istanza di uno script Bash?

  3. esecuzione di script php (funzione php) in linux bash

  4. Variabile in Bash Script che mantiene il valore dall'ultima esecuzione

  5. Come posso suonare il campanello audio all'interno di uno script bash in esecuzione sotto lo schermo di gnu?

Impedire l'esecuzione simultanea di uno script bash

Il modo migliore per rilevare (da uno script) se il software è installato?

Come fermare lo script Loop Bash nel terminale?

Bash + Come uscire dallo script secondario e dallo script principale in entrambi i casi?

Come posso controllare la sintassi di uno script Bash senza eseguirlo?

Esecuzione di Pycharm come root dal programma di avvio