Dateien aus dem RAM auslesen?

Alles, was nicht direkt mit Python-Problemen zu tun hat. Dies ist auch der perfekte Platz für Jobangebote.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Dateien aus dem RAM auslesen?

Beitragvon Rebecca » Mittwoch 19. Juli 2006, 10:05

Da meine Finger mal wieder schneller waren als mein Gehirn, habe ich aus Versehen einige Python-Dateien geloescht. Da ich ein zwei Tage altes Backup habe und noch relativ genau weiss, was ich seitdem gaendert habe, ist es nicht ganz soo dramatisch. Trotzdem waere es super, wenn ich die Dateien retten koennte.

Habe schon reiserfsck drauf losgelassen aber erfolglos, da ich in der Zwischenzeit leider einiges an neuen Daten auf der Partition produziert habe. Aber: Das Python-Programm rennt noch. D.h. ich nehme an, dass die entsprechenden Dateien irgendwo im Arbeitsspeicher rumliegen (naja, ich weiss natuerlich nicht so genau, wie der Python-Interpreter arbeitet...).

Also die Frage: Kann man die Dateien irgendwie wieder aus dem Arbeitsspeicher rausbekommen? Irgendwie den Kernel dazu veranlassen, die Dateien wieder auf Platte zu schreiben?

Wahrscheinlich ist's eh das beste, einfach die verlorenen Teile neu zu programmieren, aber trotzdem wuerde mich das Ganze interessieren!
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

Beitragvon N317V » Mittwoch 19. Juli 2006, 10:46

Nun als root kannst Du natürlich auf den Arbeitsspeicher ganz normal zugreifen, wie auf jede andere Datei. Das ist ja gerade das schöne an *nixen: dass alles eine Datei ist. Normalerweise müsstest Du dort einfach nach Teilen Deines Quelltextes z.B. der shebang greppen können. Mit etwas sed und awk kann man dann sicher auch die Dateien wieder auslesen. Wenn Du Dich noch ein wenig gedulden kannst: ich hab zuhause das hier http://www.oreilly.com/catalog/linuxsvrhack/index.html Ich glaube mich erinnern zu können, dass dort etwas ähnliches drin steht.
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Beitragvon Rebecca » Mittwoch 19. Juli 2006, 11:47

N317V hat geschrieben:Nun als root kannst Du natürlich auf den Arbeitsspeicher ganz normal zugreifen, wie auf jede andere Datei.

Das war auch mein erster Gedanke. Bin mal mein /dev/-Verzeichnis durchgegangen, aber ich hab nur die /dev/ram* fuer ramdisks gefunden, die bei mir alle ins Nirvana zeigen...
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

Beitragvon N317V » Mittwoch 19. Juli 2006, 11:58

Bin hier leider in der Arbeit auf Win festgenagelt und kann deshalb grad nicht im System nachschauen, aber ich bin mir ziemlich sicher, dass es nicht unter /dev war. Ich meine es war irgendwo in /proc Verdammt! Erst vor ein paar Tagen hatte ich einen Artikel gelesen, in dem das stand und ich weiß nicht mehr wo und finde im Moment auch nichts im Netz. Wahrscheinlich ganz simpel /proc/mem oder so.
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Beitragvon Rebecca » Mittwoch 19. Juli 2006, 13:32

Im proc-Verzeichnis in den einzelnen Prozess-Verzeichnissen gibt's jeweils eine Datei namens mem.

[code=]root@zam285:7455> grep "asdf" mem
grep: mem: No such process[/code]
:?:

Mir faellt ueberhaupt gerade ein, dass es ja noch die .pyc-Dateien gibt. D.h. wahrscheinlich wurden beim Programmstart die .py-Dateien gar nicht erst geladen. Naja, schade eigentlich. :cry: Echt bloede, meistens habe ich meinen Quellcode ja noch in nem Editor offen, sodass ich problemlos haette speichern koennen... Ich glaube, ich werde mir einen Wrapper um rm schreiben, der auf mich aufpasst wenn ich * benutze... Oder ich mach noch oefter Datensicherung.

Mich wuerde aber trotzdem interessieren, wie ich denn so an den Arbeitsspeicher rankomme.
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

Beitragvon N317V » Mittwoch 19. Juli 2006, 14:47

Rebecca hat geschrieben:Ich glaube, ich werde mir einen Wrapper um rm schreiben, der auf mich aufpasst wenn ich * benutze...

Sind Sie sicher? Sind Sie wirklich sicher? Sind Sie wirklich ganz ganz sicher?
Rebecca hat geschrieben:Mich wuerde aber trotzdem interessieren, wie ich denn so an den Arbeitsspeicher rankomme.


Such doch mal nach einer Datei in der Größe Deines Arbeitsspeichers. find müsste das doch können oder du.

edit: du *nicht* Du :-)
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
BlackJack

Beitragvon BlackJack » Mittwoch 19. Juli 2006, 17:07

Rebecca hat geschrieben:Im proc-Verzeichnis in den einzelnen Prozess-Verzeichnissen gibt's jeweils eine Datei namens mem.

[code=]root@zam285:7455> grep "asdf" mem
grep: mem: No such process[/code]
:?:


Auf die `mem` Datei kannst Du nicht einfach so zugreifen. Das geht entweder vom Prozess der zu diesem `mem` gehört, oder von einem Prozess der sich per `ptrace()` Systemaufruf an den Prozess "gehängt" hat. Und dann enthält die `mem` Datei auch den kompletten virtuellen Adressraum und gibt Lesefehler, wenn man auf geschützte oder nicht gemappte Bereiche zugreift. Ein `grep` wird da nicht funktionieren.

Eine simple Lösung wäre der GNU Debugger. Einfach per `attach` an den laufenden Prozess hängen und dann mit `gcore` einen Speicherabzug von dem Prozess in eine Datei schreiben. Da kannst Du dann nach Herzenslust mit einem Hexeditor Deiner Wahl drin herumwühlen.

Mir faellt ueberhaupt gerade ein, dass es ja noch die .pyc-Dateien gibt. D.h. wahrscheinlich wurden beim Programmstart die .py-Dateien gar nicht erst geladen. Naja, schade eigentlich. :cry:


Selbst wenn die Quelltextdateien beim Programmstart geladen wurden, würde ich nicht erwarten davon noch viel im Speicher zu finden. Die werden nach dem Übersetzen in Bytecode nicht mehr benötigt und der Speicher wird freigegeben. CPython gibt sogar den Bytecode auf Modulebene frei, nachdem er nicht mehr gebraucht wird.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder