wake-up-neo.net

Kann ich diese Dokumente vor dem Vergessen auf einem Sterbeautomaten speichern?

Zuerst ein Geständnis: Nein, ich habe nicht die Backups gemacht, die ich haben sollte.

Zweitens ist die Situation:

Ich habe ein Dell XPS 9550 mit einer Solid State Disk running Fedora 25.

Ich habe an einer Datei gearbeitet und versucht, sie zu speichern, als mir mitgeteilt wurde, dass ich auf einem schreibgeschützten Dateisystem speichern möchte. Es stellte sich heraus, dass mein Dateisystem jetzt schreibgeschützt ist und überall I/O-Fehler auftreten.

Ich konnte einige der Dateien speichern, indem ich sie über einen offenen Webbrowser per E-Mail an mich selbst schickte. Das ist jedoch abgestürzt und ich kann sie nicht erneut starten. Ich habe jedoch noch interessante Dateien in einem Editor geöffnet. Ich kann die Dateien anscheinend nirgendwo speichern, aber ich kann deren Inhalt kopieren. Wenn ich nur einen Weg finden könnte, den Dateiinhalt zu filtern, könnte ich mir monatelange Arbeit sparen.

Aber es gibt einige schreckliche Einschränkungen. Ich habe versucht, ein USB-Laufwerk anzuschließen, aber es wird kein Gerät angezeigt, das es darstellt, und der Befehl mount stirbt mit einem Segfault. Ich kann versuchen, auf einen anderen Computer zu ssh, aber ich erhalte "Busfehler" und es stirbt. ping, dmesg, ifconfig, keine dieser Arbeiten. Aber ich habe vim und less und ls und kann neue bash-Instanzen erzeugen.

Keine lynx, keine firefox, kein google-chrome. Es gibt kein DVD-Laufwerk.

Grundsätzlich scheint meine SSD gestorben zu sein. Oder vielleicht das ganze Motherboard. Ich habe noch Dokumente von großem Wert im Speicher, ich habe eine IP-Adresse und eine Netzwerkverbindung, ich kann ein paar zufällige Befehle ausführen und weitere 3500 auf dem Pfad, den ich versuchen könnte.

cat und gcc scheinen zu funktionieren. Ich kann in Dateien in/tmp schreiben. Ich habe eine laufende ipython-Instanz, die immer noch zu funktionieren scheint.

Also ... was ich bisher ausprobiert habe, ist gescheitert. Aber ich habe das Gefühl, dass es immer noch tausend Möglichkeiten gibt. Woran denke ich nicht? Wie könnte ich möglicherweise diese Dateien von meinem sterbenden Computer bekommen?

Es muss einen Weg geben.

UPDATE: Neues:

  • Ich habe meine Netzwerkverbindung wegen meiner eigenen Dummheit verloren.
  • Ich habe ein Python-Skript geschrieben, um cp und cp -r zu ersetzen.
  • Wenn ich keine Möglichkeit finde, einen /dev-Eintrag für die SD-Karte oder für USB-Laufwerke zu erstellen, sind der Bildschirm und möglicherweise die Lautsprecher/das Audiokabel meine besten Tipps zum Abrufen von Daten.
  • Ich schreibe ein Skript, um zu versuchen, Dateien zu lesen und auszugeben, welche lesbar sind.

Vorschläge noch sehr willkommen!

UPDATE 2: Neuere Sachen:

  • Auf dem sterbenden Computer habe ich ein Python-Skript geschrieben, das nach und nach eine Datei liest und versucht, diese Bits zu übermitteln, indem der Bildschirm in der einen oder anderen Farbe blinkt. Derzeit wird versucht, einen Zwei-Bit-Code zu erstellen, bei dem Rot, Grün, Blau und Weiß jeweils ein Zwei-Bit-Paar darstellen. Das funktioniert allerdings nicht so gut, deshalb wechsle ich möglicherweise zu zwei Farben und mache jeweils ein Bit.
  • Auf meinem anderen Laptop (dem vertrauenswürdigen alten Thinkpad, das ich für dieses heiße neue XPS aufgegeben habe) habe ich ein Skript geschrieben, das mithilfe der OpenCV-Python-Bibliothek von der Webcam liest. Die Idee ist, die vom anderen Computer gesendeten Codes dekodieren zu lassen. Das Problem ist, dass die Bildrate von der Kamera etwa 15 Bilder pro Sekunde beträgt. Wenn ich also eine perfekte, fehlerfreie Übertragung hätte, wäre meine maximale Datenrate 30 Bits pro Sekunde, d. H. 225 Bytes pro Sekunde. Das sind 324.000 pro Tag.
  • Auf dem sterbenden XPS kann ich mit tar die gewünschten Dateien in ein einziges Archiv packen, das 1,7 MB groß ist. Leider sind gzip, bzip2, xz, lzop und alle anderen Komprimierungsprogramme nicht verfügbar. ABER mit Pythons Modul zlib kann ich diese Datei auf 820 KB komprimieren. Angesichts dieser Größe könnte ich das Ding wahrscheinlich in ein paar Tagen verschicken lassen.
  • Da diese Übertragungsmethode wahrscheinlich sehr fehleranfällig ist, implementiere ich Hamming-Codes auf dem XPS, um beim Übertragen der Daten eine gewisse Fehlerkorrektur hinzuzufügen.
  • Wahrscheinlich wird es Komplikationen geben, weil das passiert, aber zumindest scheint es irgendwie machbar, diese Daten herauszubekommen!
  • Da dies immer noch eine ziemlich bescheuerte Methode zum Senden von Daten ist, habe ich mich mehr mit seriellen USB-Treibern befasst. Die Module, die ich zu laden versucht habe (usb-serial-simple, usb-debug, safe-serial), geben I/O-Fehler. Ich glaube auch nicht, dass es in den Kernel integriert ist, da keine/dev/ttyUSB * -Geräte vorhanden sind.

Vielen Dank für alle Vorschläge bisher --- Ich weiß, dass dies nicht einmal eine genau definierte Frage ist, da ihr im Voraus nicht wisst, welche Programme/Dateien gelesen werden können oder nicht. Noch offen für bessere Vorschläge als dieser Video-Ansatz!

UPDATE 3: Neueste Sachen

  • Ich habe eine PS3 Eye-Webcam und lese nach Deaktivierung der automatischen Verstärkung und Belichtung erfolgreich Daten vom XPS, wenn auch mit einer fehlerhaften Geschwindigkeit von 1 Byte pro Sekunde. Dies ist ein großer Erfolg - die ersten Daten werden ausgefiltert! Aber die Rate ist zu langsam, um meine 820 KB in einer angemessenen Zeit herauszubekommen, und die Fehlerrate ist zu hoch.

 One bit transmission with clock

  • Das Problem ist, dass das Schreiben in das Terminal zu langsam ist. Die Bildschirmaktualisierungen erfolgen nicht so schnell, dank der Langsamkeit des Terminalemulators urxvt, auf den ich Zugriff habe.
  • Ich habe festgestellt, dass ich auf dem XPS Zugriff auf einen Rust-Compiler habe. Ich habe das Übertragungsskript mit Rust umgeschrieben, um zu sehen, ob dies die Aktualisierungsgeschwindigkeit des Terminals verbessern würde, aber es hat nicht geholfen.
  • Da es unwahrscheinlich ist, dass ich die Framerate erhöhen kann, muss ich versuchen, die Datenmenge zu erhöhen, die ich pro Frame erhalte. Mein aktueller Ansatz sieht ungefähr so ​​aus:

 grid transmission

Die rechte Hälfte ist immer noch ein Taktsignal, das an und aus blinkt, um das Eintreffen neuer Frames zu kennzeichnen. Aber die linke Seite ist jetzt ein Raster, in dem jede Zelle durch ein rotes Quadrat in der Ecke markiert ist, und die grüne Zelle rechts und unten vom roten Quadrat blinkt auf und ab, um ein Bit anzuzeigen. Die roten Quadrate sollten den empfangenden Computer an der Stelle kalibrieren lassen, an der sich die Zellen befinden. Ich habe noch keine Daten auf diesem Weg, aber daran arbeite ich.

  • Jemand schlug vor, dass ich QR-Codes anstelle dieser Ad-hoc-Farbmuster schreiben sollte. Ich werde mich auch damit befassen und das vielleicht anstelle dieses Rasteransatzes implementieren. Die Fehlerkorrektur wäre ein netter Gewinn und die Möglichkeit, Standardbibliotheken zum Dekodieren zu verwenden.
  • Ich habe erfahren, dass ich Zugriff auf libasound (die ALSA-Soundbibliothek) habe, aber nicht auf die damit verbundenen Header-Dateien (alsa/asoundlib.h oder was auch immer). Wenn jemand weiß, wie man eine gemeinsam genutzte Bibliothek ohne die Header verwendet, oder wenn er mir helfen kann, genau den richtigen Header zu schreiben, damit ich eine Audioausgabe erzeuge, kann ich die Dateien auf Audiobasis rausholen.
  • Wenn mir jemand helfen könnte, die USB-Geräte zu manipulieren, ohne auf libusb zuzugreifen, könnte ich vielleicht etwas damit anfangen?

Vorwärts!

UPDATE 4: Audioausgabe erzeugt!

Benutzer Francesco Noferi hat großartige Arbeit geleistet und mir dabei geholfen, die im vorherigen Update erwähnte ALSA-Bibliothek zu nutzen. Der C-Compiler hatte ein Problem, aber mit dem Rust-Compiler konnte ich mit dem FFI direkt libasound aufrufen. Ich habe jetzt eine Menge meiner Daten über Audio abgespielt und es klingt wie Musik in meinen Ohren! Ich muss noch einen echten Kommunikationskanal aufbauen, aber ich bin sehr hoffnungsvoll. Zu diesem Zeitpunkt besteht meine Aufgabe im Wesentlichen darin, ein Modem zu implementieren. Wenn also jemand eine Anleitung zu guten Methoden hat, bin ich ganz Ohr. Idealerweise ist die Modulation einfach per Hand zu implementieren und es gibt eine Demodulation, für die ich eine vorhandene Bibliothek verwenden kann. Da dies direkt über ein Audiokabel und nicht über das Telefonnetz erfolgen kann, können wir theoretisch viel besser als 56 kbit/s oder was auch immer der Standard früher war, aber in der Praxis weiß wer was wir bekommen.

Vielen Dank an alle, die hier mitgemacht haben und bei/r/techsupportmacgyver und bei/r/Rust , die so viele hervorragende Vorschläge gemacht haben. Wir werden dieses "Modem" bald implementieren und dann werde ich es mit einem Epilog abschließen. Ich denke, ich könnte meinen Code irgendwo für andere verzweifelte Leute aufstellen, um ihn in Zukunft zu nutzen - vielleicht sogar für ein Repository mit seltsamen Exfiltrationswerkzeugen, die sich einfach von Hand in eine Sterbe-Maschine eingeben lassen? Mal sehen was passiert.

UPDATE 5: Es hat lange gedauert, bis ich mit ALSA und meinem billigen StarTech-USB-Audioerfassungsgerät (keine eingebaute Leitung auf dem empfangenden Laptop) gerungen bin, und viele haben versucht, meine eigenen zu rollen Übertragungsprotokoll, aber schließlich habe ich auf Anraten einiger Amateurfunkfreunde das RTTY-Leitungsprotokoll mit 150 Baud implementiert, was mir in der Praxis etwa 10 Bytes pro Sekunde ergibt. Es ist nicht super schnell, aber es ist ziemlich zuverlässig. Und ich bin fast fertig damit, meine 820-KB-Datei zu übertragen, die mithilfe von CRC32-Prüfsummen überprüft wurde (mithilfe der crc32-Funktionalität aus Pythons Modul zlib, auf das ich Zugriff habe). Also erkläre ich den Sieg und möchte mich noch einmal bedanken! Ich werde etwas mehr Zeit damit verbringen, weitere Dateien zu finden, die lesbar sind und die ich übertragen kann, aber die Grundlage ist vorhanden. Es hat Spaß gemacht, mit euch allen zu arbeiten!

FINAL UPDATE:

Auf der Sterbemaschine:

$ tar cf ./files
$ ./checksum.py ./files.tar 9999999
Part 1 checksum: -1459633665
$ ./zlib_compress.py ./files.tar
$ ./checksum.py ./files.tar.z 9999999
Part 1 checksum: -378365928
$ ./transmit_Rust/target/debug/transmit ./files.tar.z
Transmitting files.tar.gz over audio using RTTY
Period size: 2048
Sample rate: 44100
Samples per bit: 294
Sending start signal.
Transmitting data.
nread: 2048
nread: 2048
...
nread: 2048
nread: 208
Transmission complete. Sending hold signal.

Auf der Rettungsmaschine:

$ minimodem --rx -8 --rx-one -R 44100 -S 915 -M 1085 --startbits 3
            --stopbits 2 --alsa=1 150 -q > ./files.tar.z
$ ./checksum.py ./files.tar.z
Part 1 checksum: -378365928
$ ./zlib_decompress.py ./files.tar.z
$ ./checksum.py ./files.tar
Part 1 checksum: -1459633665

:-)

49
Josh Hansen

hier ist ein Beispiel für ein libasound-Programm mit gerade genug Definitionen, um eine grundlegende 2-Kanal-44.1k-WAV-Ausgabe ohne Header zu erhalten.

EDIT: Ich bin mir eigentlich nicht sicher, ob ein direktes Hochladen der Daten als WAV funktionieren würde, da Rauschen beim Aufnehmen diese leicht beschädigen könnte, aber Sie können wahrscheinlich so etwas wie eine Sinuswelle von Bits mit hoher Frequenz machen, was zuverlässiger ist

EDIT2: Wenn ein Play vorhanden ist und funktioniert, können Sie das auch verwenden und einfach ein Programm schreiben, das Roh-Audio ausgibt und in ein Play oder etwas anderes leitet, das Audio abspielen kann

EDIT3: Es wurde so geändert, dass keine Header mehr verwendet werden

wenn -lasound nicht kompiliert, fügen Sie -L/path/where/libasound/is/located hinzu

/*
    gcc alsa_noheader.c -lasound
    cat stuff.wav | ./a.out
*/

typedef unsigned int uint;
typedef unsigned long ulon;

int printf(char*, ...);
void* malloc(long);
long read(int fd, void* buf, ulon count);

int snd_pcm_open(void**, char*, int, int);
ulon snd_pcm_hw_params_sizeof();
int snd_pcm_hw_params_any(void*, void*);
int snd_pcm_hw_params_set_access(void*, void*, int);
int snd_pcm_hw_params_set_format(void*, void*, int);
int snd_pcm_hw_params_set_channels(void*, void*, uint);
int snd_pcm_hw_params_set_rate_near(void*, void*, uint*, int*);
int snd_pcm_hw_params(void*, void*);
int snd_pcm_hw_params_get_period_size(void*, ulon*, int*);
long snd_pcm_writei(void*, void*, uint);
int snd_pcm_prepare(void*);
int snd_pcm_drain(void*);
int snd_pcm_close(void*);

int main(int argc, char* argv[])
{
    void* pcm;
    void* params;

    int rate;
    int nchannels;
    ulon frames;
    void* buf;
    int bufsize;
    long nread;

    snd_pcm_open(&pcm, "default", 0, 0);
    params = malloc(snd_pcm_hw_params_sizeof());
    snd_pcm_hw_params_any(pcm, params);

    /* 3 = rw_interleaved */
    snd_pcm_hw_params_set_access(pcm, params, 3);

    /* 2 = 16-bit signed little endian */
    snd_pcm_hw_params_set_format(pcm, params, 2);

    /* 2 channels */
    nchannels = 2;
    snd_pcm_hw_params_set_channels(pcm, params, nchannels);

    /* sample rate */
    rate = 44100;
    snd_pcm_hw_params_set_rate_near(pcm, params, &rate, 0);

    snd_pcm_hw_params(pcm, params);
    snd_pcm_hw_params_get_period_size(params, &frames, 0);

    bufsize = frames * nchannels * 2;
    buf = malloc(bufsize);

    /* read file from stdin */
    while (nread = read(0, buf, bufsize) > 0)
    {
        if (snd_pcm_writei(pcm, buf, frames) == -29)
        {
            printf("W: underrun\n");
            snd_pcm_prepare(pcm);
        }
    }

    snd_pcm_drain(pcm);
    snd_pcm_close(pcm);

    return 0;
}
15

Funktioniert Ihr HDMI- oder ein anderer Bildschirmausgang? In diesem Fall können Sie ein Bildschirmaufzeichnungsgerät verwenden, um es als Video aufzuzeichnen und später zu verarbeiten. Dadurch wird die Framerate Ihrer Webcam nicht eingeschränkt.

3
user169884

Wie wäre es, wenn Sie Ihre Daten verhexen und Seite für Seite an das Terminal ausgeben?

Sie können ein Präfix mit dem Versatz in der Binärdatei hinzufügen, um eine Seite einfach neu zu generieren (zur manuellen Korrektur?)

Verwenden Sie dann auf einem anderen Computer eine OCR-Software, um die Seiten zu scannen.

80x25-Terminal würde 1000 Bytes pro Seite ergeben (abzüglich etwas Platz für das Präfix). Auf rund 1000 Seiten könnten Sie also Ihre Daten rausholen. Selbst bei einer Seite pro Sekunde sind das weniger als 20 Minuten.

Hex-Codierung ist einfach zu schreiben und bietet auch eine unformatierte Form der Fehlerkorrektur (es gibt nur 16 gültige Symbole).

2
Jan

kannst du eine Netzwerkverbindung aufbauen? ssh ist vielleicht ein bisschen zu viel, aber wenn Sie netcat auf 2 Computern verwenden können, können Sie möglicherweise Daten übertragen. eine im Sendemodus, eine im Hörmodus. Wenn Sie nur Text übertragen müssen, könnte dies eine Lösung sein.

edit: vergiss nicht, lies einfach, dass du auch deine Netzwerkverbindung verloren hast ..

1
Xzenor

Long Shot, aber in einigen Distributionen sind Amateurfunk-Protokolle eingebaut. Eines davon ist fldigi. Probier welchen fldigi.

Wenn Sie dies oder jenes haben, konvertieren sie Text in Audio, normalerweise unter Verwendung einer Variation der Phasenumtastung. Die Ausgabe erfolgt über Ihre Lautsprecher/Kopfhörer und wird von einem stabilen Computer im selben Raum empfangen, der auf dem Mikrofon aufgelistet ist. (Dies eliminiert die Amateurfunkgeräte, die das Audio über die Funkwellen senden und empfangen).

0
JimR

Der QR-Code-Ansatz könnte gut sein. Sie können so viele wie möglich auf den Bildschirm bringen und sie aktualisieren, sobald Ihr Terminal dies zulässt. Nehmen Sie dann den Bildschirm des XPS mit einer Kamera auf (im Gegensatz zur Verwendung einer Webcam) und entziffern Sie einfach das gespeicherte Video. Könnte hilfreich sein, um sogar Zeitlupenaufnahmen zu machen.

0
Ezhik

Tolle Show :) Ich habe einen Vorschlag: Sie können Daten auch mit einer Fotodiode vom Bildschirm lesen, die an die Soundkarte des anderen Computers angeschlossen ist

0
Milo O'h

Sie können sich selbst über die Befehlszeile eine E-Mail senden, einschließlich des Versendens von Dateien.

So etwas wie:

$ mail -s "Hello World" [email protected] < /tmp/urgentFileToSave.txt

sollte arbeiten.

Einige weitere Beispiele: http://www.binarytides.com/linux-mail-command-examples/

0
mcalex

Kann Python auf Ihren Audio-Out-Port zugreifen? Sie können versuchen, Daten mit diesem - siehe this oder that zu übertragen.

0
lukeg

Sie können die SSD von Ihrem Computer entfernen und dd/photorec/etc auf einem anderen funktionierenden Computer.

Hier ist das Dell-Servicehandbuch für den 9550 - siehe Abschnitt "Entfernen des Solid-State-Laufwerks". Sobald Sie das Laufwerk entfernt haben, können Sie ein externes M.2-USB-Gehäuse erwerben und die Festplatte an einen anderen Computer anschließen, um Ihre Daten wiederherzustellen.

0
DankMemes