Ich habe versehentlich ein sehr komplexes Bash-Skript überschrieben, in dem ich versucht habe, Scoping und Threading auf saubere Weise zu implementieren.
Jetzt läuft noch dasselbe Skript, aber die Datei ist nicht mehr vorhanden. Die Frage lautet: Ist es möglich, den RAM zu durchsuchen und die Stichdarstellung der Datei selbst zu finden?
Ein weiteres Problem ist: Ich kann die Datei / dev / mem oder / dev / kmem nicht finden und habe bereits versucht, nach Inhalten zu suchen.
Für die Umwelt: Es ist ein Debian / Sid-Rechner (VPS) -Hostet auf vpsfx.com
root @ heisenberg: ~ # ls -a / dev . kmsg ptyp2 ptyp9 zufällig tty1 tty5 ttyp2 ttyp9 zufällig .. 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 Konsolenpunkte ptyp6 ptypd stdout tty2 tty9 ttyp6 ttypd fd ptyp0 ptyp7 ptype tty tty3 ttyp0 ttyp7 ttype voll ptyp1 ptyp8 ptypf tty0 tty4 ttyp1 ttyp8 ttypf
/proc
fs befindet sich nicht im RAM. Tatsächlich befindet es sich nirgendwo . Siehe unix.stackexchange.com/questions/74713/… . Obwohl Sie die fd von erhalten können/proc
,cat
liest die fd die Datei von fs, nicht von RAM. Richtig, Sie haben die Datei gelöscht, wodurch die Anzahl der Inode-Refs verringert wurde, und niemand anderes kann sie jetzt sehen. Sie wird jedoch erst dann aus dem fs gelöscht, wenn der Prozess, der das Skript ausführt, es schließt. Siehe stackoverflow.com/questions/2028874/… .Unter der Annahme, dass das OP wirklich RAM bedeutet und auf keine Weise möglich ist , und dass der Prozess, in dem das Skript ausgeführt wurde, keine Kerndateibeschränkung aufweist (dies ist normalerweise die Standardeinstellung
cat /proc/PID/limits
), müssen Sie eine Verbindung zum Prozess herstellen und beides Setzen Sie die Kernbeschränkung auf einen Wert, der groß genug ist, um das Prozessabbild einzuschließen und das ABRT-Signal zum Generieren der Kerndatei zu verwenden, oder verwenden Sie ein Toolgdb
, das sich an einen Prozess anfügen lässt und ein Kernabbild des Prozesses aus dem RAM generiert.gdb
In einer Shell mit demselben Besitz wie das ausgeführte Skript oder Root-Besitz:
ps ax
, um die Prozess-ID (PID) zu findengdb -p PID
Beachten Sie, dass dadurch die Prozessausführung nicht fortgesetzt, aber nicht aus der Prozesstabelle entfernt wird.
generate-core-file
gdb sollte mit so etwas wie antworten
Saved corefile core.15113
, vorausgesetzt die PID ist 15113.detach
Ihr Skript wird weiterhin ausgeführt (fortgesetzt).
quit
strings core.15113 > my_script.sh
Öffne den
my_script.sh
in irgendeinem Editor. Ihr Skripttext sollte sich am Ende der Datei vor dem Umgebungsabschnitt befinden. Verwenden Sie den Editor, um die Abschnitte vor und nach dem Skript zu entfernen.Testen Sie diese Lösung in einem anderen Skript, bevor Sie sie in Ihrem Gewinnskript verwenden. YMMV.
Die Sequenz sieht folgendermaßen aus:
quelle
dd die Festplattenpartition in überlappenden Blöcken und grep binary für Teile des Skripts. Wenn Sie Glück haben, schreiben Sie diese Chunks in ein temporäres Verzeichnis im RAM, um darin zu suchen und die Schreibzyklen Ihrer Festplatte oder SSD zu speichern. Nein, es ist keine From-Ram-Lösung. Beachten Sie, dass beim Lesen von disk byte byte Skripten möglicherweise das Zeichensatzformat utf-8 (oder ein ähnliches Format) verwendet wird. Daher müssen möglicherweise auch die grep-Parameter angepasst werden.
quelle