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.
- Installa
gdb
In qualche shell con la stessa proprietà dello script in esecuzione o proprietà root:
- Esegui
ps ax
per trovare l'id del processo (PID) gdb -p PID
Tieni presente che ciò impedirà all'esecuzione del processo di continuare ma non lo rimuoverà dalla tabella dei processi.
- In gdb, esegui il comando
generate-core-file
gdb dovrebbe rispondere con qualcosa come Saved corefile core.15113
, supponendo che il PID sia 15113.
- In gdb, esegui il comando
detach
Il tuo script continuerà (riprenderà) l'esecuzione.
- In gdb, esegui il comando
quit
- 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]:~$