Могу ли я сохранить эти документы на умирающей машине от забвения?

49

Во-первых, признание: нет, я не делал резервных копий, которые должен был иметь.

Во-вторых, ситуация:

У меня Dell XPS 9550 с твердотельным диском под управлением Fedora 25 .

Я работал над файлом и попытался сохранить его, когда мне сказали, что я пытаюсь сохранить его в файловой системе только для чтения . Оказывается, моя файловая система теперь доступна только для чтения, и везде возникают ошибки ввода-вывода .

Мне удалось сохранить некоторые файлы, отправив их по электронной почте через открытый веб-браузер, но это не помогло, и я не могу перезапустить его. Но у меня все еще есть интересующие файлы, открытые в редакторе. Кажется, я нигде не могу сохранить файлы, но могу скопировать их содержимое. Если бы я только мог найти способ удалить содержимое файла, я бы сэкономил себе месяцы работы.

Но есть некоторые ужасные ограничения. Я попытался вставить USB-накопитель, но ни одно из устройств не представляет его, и mountкоманда умирает с ошибкой сегмента. Я могу попробовать ssh к другому компьютеру, но я получаю «ошибку шины», и она умирает. ping, dmesg, ifconfigНи одна из этих работ. Но у меня есть vimи lessи lsи может порождать новые bashэкземпляры.

Нет lynx, нет firefox, нет google-chrome. Там нет DVD-привода.

Похоже, мой SSD умер. Или, может быть, вся материнская плата. У меня в архиве есть ценные документы, у меня есть IP-адрес и сетевое соединение, я могу выполнить несколько случайных команд и еще 3500 на пути, который я могу попробовать.

catи gccпохоже на работу. Я могу писать в файлы в / tmp. У меня есть работающий ipythonэкземпляр, который все еще работает.

Итак ... то, что я пробовал до сих пор, провалилось. Но я чувствую, что есть еще тысяча возможностей. Что я не рассматриваю? Как я мог получить эти файлы с моего умирающего компьютера?

Должен быть способ.

ОБНОВЛЕНИЕ : Новые вещи:

  • Я потерял сетевое соединение из-за собственной глупости.
  • Я написал скрипт на Python для замены cpиcp -r
  • Если я не найду способ создать /devзапись для SD-карты или USB-накопителей, то мои лучшие ставки для вывода данных - это экран и, возможно, динамики / аудиокабель.
  • Я пишу сценарий, чтобы попытаться прочитать файлы и вывести, какие из них доступны для чтения.

Предложения по-прежнему очень приветствуются!

ОБНОВЛЕНИЕ 2 : более новые вещи:

  • На умирающем компьютере я написал скрипт на Python, который будет поочередно читать файл и пытаться передать эти биты, мигая экраном одного цвета или другого. Сейчас он пытается создать двухбитный код, где красный, зеленый, синий и белый представляют двухбитную пару. Однако это не очень хорошо работает, поэтому я мог бы просто переключиться на два цвета и делать по одному.
  • На другом моем ноутбуке (старом надежном Thinkpad, который я отказался от этой горячей новой XPS) я написал скрипт, который читает данные с веб-камеры с помощью библиотеки OpenCV Python. Идея состоит в том, чтобы он декодировал коды, отправленные другим компьютером. Проблема в том, что частота кадров с камеры составляет примерно 15 кадров в секунду, что означает, что если бы у меня была идеальная, безошибочная передача, моя максимальная скорость передачи данных была бы 30 бит в секунду, то есть 225 байтов в секунду. Это 324 КБ в день.
  • На умирающем XPS я могу tarупаковать нужные файлы в один архив, который составляет 1,7 МБ. К сожалению, gzip, bzip2, xz, lzopи независимо от сжатия утилиты недоступны. НО используя zlibмодуль Python, я могу сжать этот файл до 820 КБ. Учитывая этот размер, я мог бы, вероятно, отправить эту вещь через пару дней.
  • Поскольку этот метод передачи, вероятно, будет очень подвержен ошибкам, я собираюсь реализовать коды Хемминга на XPS, чтобы добавить некоторую коррекцию ошибок при передаче данных.
  • Скорее всего, будут осложнения, потому что это то, что происходит, но, по крайней мере, кажется возможным выполнимо получить эти данные!
  • Так как это все еще довольно неудачный способ отправки данных, я больше посмотрел на USB-драйверы для последовательного порта. Модули Я пытался загрузить ( usb-serial-simple, usb-debug, safe-serial) дают I / O ошибки. Я не думаю, что он встроен в ядро, потому что там нет устройств / dev / ttyUSB *.

Спасибо за все предложения на данный момент - я знаю, что это даже не вполне определенный вопрос, так как вы, ребята, заранее не знаете, какие программы / файлы можно читать или нет. Все еще открыт для лучших предложений, чем этот видео подход!

ОБНОВЛЕНИЕ 3 : Новые вещи

  • У меня есть веб-камера PS3 Eye, и после отключения ее автоматического усиления и экспонирования я успешно считываю данные с XPS, хотя и с ошибкой в ​​1 байт в секунду. Это большой успех - первые данные отфильтрованы! Но скорость слишком медленная, чтобы вывести мои 820 КБ в любое разумное время, и уровень ошибок слишком высок.

Один бит передачи с часами

  • Проблема в том, что запись в терминал происходит слишком медленно. Обновления экрана не похожи на мгновенные, спасибо (я думаю) медлительности urxvtэмулятора терминала, к которому у меня есть доступ.
  • Я обнаружил, что у меня есть доступ к компилятору Rust на XPS. Я переписал скрипт передачи, используя Rust, чтобы посмотреть, улучшит ли это скорость обновления терминала, но это не помогло.
  • Поскольку я вряд ли смогу увеличить частоту кадров, мне придется постараться увеличить объем данных, получаемых за кадр. Мой текущий подход выглядит примерно так:

сетка передачи

Правая половина все еще является тактовым сигналом, который мигает, чтобы отметить появление новых кадров. Но теперь слева - это сетка, где каждая ячейка помечена красным квадратом в углу, а затем зеленая ячейка справа и вниз от красного квадрата мигает и выключается, чтобы указать немного. Красные квадраты должны позволить принимающему компьютеру откалибровать расположение ячеек. У меня пока нет данных, но я над этим работаю.

  • Кто-то предложил мне заняться написанием QR-кодов вместо этих специальных цветовых схем. Я тоже собираюсь разобраться в этом и, возможно, реализовать это вместо этого сеточного подхода. Исправление ошибок было бы хорошим преимуществом, а также возможность использовать стандартные библиотеки для декодирования.
  • Я узнал, что у меня есть доступ к libasound (звуковая библиотека ALSA), но не к заголовочным файлам, связанным с ним ( alsa/asoundlib.hили чем-то еще). Если кто-то знает, как использовать разделяемую библиотеку без заголовков, или может помочь мне написать только правильный заголовок, позволяющий мне выводить аудио, тогда у меня может быть аудио-способ вывода файлов.
  • С другой стороны, если кто-то может помочь мне манипулировать USB-устройствами без доступа к libusb, то, возможно, я мог бы что-то с этим сделать?

Двигаться вперед!

ОБНОВЛЕНИЕ 4 : аудио выход произведен!

Пользователь Francesco Noferi проделал большую работу, помогая мне использовать библиотеку ALSA, упомянутую в предыдущем обновлении. У компилятора C была проблема, но с помощью компилятора Rust я смог использовать FFI для прямого вызова libasound. Теперь я проиграл кучу своих данных через аудио, и это звучит как музыка для моих ушей! Все еще нужно установить реальный канал связи, но я чувствую себя очень обнадеживающим. На данный момент моя работа в основном заключается в реализации модема, так что, если у кого-то есть какие-либо рекомендации относительно хороших способов сделать это, я весь слух. В идеале модуляцию, которую легко реализовать вручную, и демодуляцию, для которой есть существующая библиотека, которую я могу использовать. Так как это может идти напрямую через аудиокабель, а не через телефонную сеть, теоретически мы можем сделать намного лучше, чем 56 кбит / с или любой другой стандарт, но на практике кто знает, что мы получим.

Спасибо всем, кто следит за этим здесь и на / r / techsupportmacgyver, а также на / r / rust, которые внесли множество отличных предложений. Собираюсь внедрить этот «модем» в ближайшее время, а затем я закончу это эпилогом. Я думаю, что я мог бы разместить свой код где-нибудь, чтобы другие отчаянные люди могли использовать его в будущем - может быть, даже хранилище странных инструментов эксфильтрации, которые легко набрать в умирающую машину вручную? Посмотрим что получится.

ОБНОВЛЕНИЕ 5 : Мне потребовалось много времени на борьбу с ALSA и моим дешевым USB-устройством захвата звука StarTech (без встроенной линии на принимающем ноутбуке), и многие фальстарты пытались свернуть мой собственный протокол передачи, но, наконец, по совету Мои друзья-радиолюбители Ham Я реализовал линейный протокол RTTY со скоростью 150 бод, что на практике дает примерно 10 байтов в секунду. Это не супер быстро, но это довольно надежно. И я почти закончил передачу своего файла 820 КБ, проверенного с помощью контрольных сумм CRC32 (используя функциональность crc32 из Pythonzlibмодуль, к которому у меня есть доступ). Итак, я объявляю победу и хочу еще раз поблагодарить! Я потрачу еще немного времени на поиск дополнительных файлов, которые можно будет прочитать и которые я могу передать, но основа на месте. Было весело работать со всеми вами!

ЗАКЛЮЧИТЕЛЬНОЕ ОБНОВЛЕНИЕ :

На умирающей машине:

$ 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.

На спасательной машине:

$ 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

:-)

Джош Хансен
источник
4
Связанный:  Unix Recovery Legend .
G-Man говорит: «Восстановите Монику»
2
Перейдите в каталог, где у вас есть файлы и введите команду python -m SimpleHTTPServer. Теперь вы делитесь файлами через http-сервер в порту 8000 . Откройте браузер на другом устройстве в той же сети и введите следующее: http://<IP address>:8000и начните скачивать все, что можете.
Jcbermu
2
Отличная штука гиков, что у тебя здесь. Хотелось бы, чтобы я проголосовал дважды.
Камиль Мачоровский
1
Как насчет охлаждения дерьма из ОЗУ, чтобы уменьшить волатильность и перевести его на альтернативный XPS? en.wikipedia.org/wiki/Cold_boot_attack
root,
1
Несколько не по теме, но было бы здорово, если бы вы могли связать связанные темы Reddit, чтобы мы могли увидеть, что там было предложено.
Боб

Ответы:

15

Вот пример программы libasound с достаточным количеством определений, чтобы получить основной 2-канальный вывод wav 44.1k без заголовков.

РЕДАКТИРОВАТЬ: Я на самом деле не уверен, будет ли прямой дамп данных, как wav будет работать, так как шум при записи может легко повредить его, но вы, вероятно, можете сделать что-то вроде синусоидальной волны битов на высокой частоте, что является более надежным

РЕДАКТИРОВАТЬ 2: если aplay присутствует и работает, вы также можете использовать это и просто написать программу, которая выводит необработанный звук и транслирует его в aplay или все, что может воспроизводить аудио

EDIT3: изменил его, чтобы вообще не использовать заголовки

если -lasound не компилируется, добавьте -L / путь / где / libasound / находится / расположен

/*
    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;
}
Франческо Нофери
источник
Я проголосовал за вас и думаю, что вы заслуживаете кучу кредитов за этот потрясающий подход! Вот проблема: я получаю ошибки ввода-вывода на всех четырех включаемых файлах, которые вы хотите использовать. Так что мне нужно обойти это. Я могу выполнить предварительную обработку на другом ноутбуке, но в результате получается файл размером 63 Кбайт, сжатый файл размером 11 Кбайт. Если я смогу найти способ ввода данных в XPS, то это выполнимо, но я не рад набирать их вручную. Скомпилированный файл имеет размер 10,4 Кб или 2,4 Кб в сжатом виде. Теперь я могу набрать его вручную, но ошибки будет трудно обнаружить.
Джош Хансен
1
Я отредактировал программу, чтобы вообще не использовать заголовки, попробуйте это
Франческо Нофер
gccдал мне «Ошибка шины» (которая возникает с некоторыми программами, но на самом деле не понимаю.) К счастью, у меня есть работающий компилятор Rust, поэтому, используя возможность RFI FFI, я реализовал ваш код выше, используя Rust. Он компилируется и работает, но я до сих пор ничего не слышу. Но я не совсем уверен, если громкость увеличена --- это может быть отключено. Но я не могу запустить alsamixer / xfce4-mixer для проверки. Я пытаюсь использовать alsalib напрямую, чтобы убедиться, что громкость повышена. Большое вам спасибо за ваши усилия в этом!
Джош Хансен
1
приятно слышать, что вы запустили его! для объема, вот программа, которая перечисляет элементы управления микшера устройства по умолчанию и максимизирует их все: gist.github.com/008f0c3acdbcae886a19868a0554987b . если у вас все еще есть проблемы, вам может понадобиться написать что-то для перечисления аудиовыходов и их записей микшера, чтобы убедиться, что он действительно не работает, а не просто выводить на неправильное / приглушенное устройство. также можно попробовать добавить проверку ошибок в программу вывода звука, чтобы увидеть, если это ошибка. ошибка шины означает «попытался получить доступ к памяти, которой там быть не может», поэтому, возможно, поврежденные карты памяти
привязаны
Оказывается, громкость возросла, но я фактически не посылал никаких байтов в колонки - почему-то я не понимаю, как читать в буфер в Rust, он всегда читает 0 байтов. Но используя несколько байтов, которые я сконструировал, я смог произвести вывод звука! Это здорово, кажется, это хороший путь к получению данных в чистом виде. Теперь пришло время узнать о стратегиях модуляции / демодуляции, чтобы я мог сделать это разумно. Большое спасибо за вашу работу над этим --- высоко ценится!
Джош Хансен
3

Работает ли ваш HDMI или любой другой порт дисплея? Если это так, вы можете использовать устройство захвата экрана, чтобы записать его как видео и обрабатывать позже. Таким образом, не ограничиваясь частотой кадров вашей веб-камеры.

user169884
источник
2

Как насчет того, чтобы вы закодировали свои данные в шестнадцатеричном формате и выводили их на страницу за страницей в терминал?

Вы можете добавить префикс со смещением в двоичном файле, чтобы вы могли легко восстановить страницу (для ручной коррекции?)

Затем на другом компьютере используйте программное обеспечение OCR для сканирования страниц.

Терминал 80x25 будет выдавать 1000 байт на страницу (минус место для префикса). Таким образом, примерно на 1000 страницах вы можете получить свои данные. Даже на одной странице в секунду это меньше 20 минут.

Шестнадцатеричное кодирование легко написать, а также предоставляет необработанную форму исправления ошибок (всего 16 допустимых символов).

январь
источник
1

Вы можете настроить сетевое соединение? ssh может быть слишком много, но если вы можете использовать netcat на 2 компьютерах, вы сможете передавать данные. один в режиме отправки, другой в режиме прослушивания. Если все, что вам нужно сделать, это перенести текст, то это может быть решением.

редактировать: не важно, просто прочитайте, что вы потеряли сетевое соединение, а также ..

Xzenor
источник
1
Я думаю, что ваш ответ заслуживает того, чтобы быть там. ncне имеет никаких зависимостей, кроме функционирующего сетевого стека, который имел OP, пока он не взорвал его. Это резко снижает вероятность того, что исполняемый файл не запустится. Если кто-то столкнется с подобной проблемой, это определенно полезное решение.
zneak
0

Вы можете отправлять сообщения по электронной почте из командной строки, включая отправку файлов.

Что-то вроде:

$ mail -s "Hello World" user@yourmaildomain.com < /tmp/urgentFileToSave.txt

должно сработать.

Некоторые дополнительные примеры: http://www.binarytides.com/linux-mail-command-examples/

mcalex
источник
К сожалению, mailэто не относится к (по сути случайному) набору программ, которые я могу запустить. Плюс я потерял соединение с сетью :-(
Джош Хансен
Уч. Хорошо, все, что у меня осталось, - catэто файлы и фотографии с мобильного телефона.
mcalex
Это может прийти к этому!
Джош Хансен
0

Может ли Python получить доступ к вашему порту аудиовыхода? Вы можете попробовать перенести данные с помощью этого - посмотрите на то или другое .

lukeg
источник
Я не думаю, что у меня установлены аудио библиотеки Python, так что, вероятно, нет. Но в / dev / snd есть устройства ALSA. alsa-lib установлена, но я не думаю, что могу ее прочитать. Есть ли какой-нибудь способ записи на аудиоустройства напрямую?
Джош Хансен
@ user17219 Вы уверены, что ossaudiodevв вашей установке Python нет библиотеки? Это должен быть стандартный модуль в Linux и FreeBSD, если я правильно прочитал документацию. import ossaudiodevработал в моей Ubuntu из коробки.
Лукег
на самом деле вы правы, что он присутствует, но, к сожалению, его не было в памяти, поэтому я не могу его прочитать - он пытается прочитать модуль с диска, что приводит к ошибке ввода-вывода :-( Это было превосходно предложение, хотя
Джош Хансен
@ user17219 очень жаль. tldp.org/HOWTO/Alsa-sound-6.html - эта ссылка показывает, что вы можете попробовать просто cat- привязать файл к /dev/snd/pcm...устройству.
lukeg
Я пытался это сделать, но получил некоторые странные ошибки. Я думаю, что устройства pcm изменились с тех пор, как этот документ был написан, так как теперь есть варианты * p и * c. Я пытался catIng /dev/randomво все из них , но безрезультатно.
Джош Хансен
0

Вы можете удалить SSD с вашего компьютера и dd/ photorec/ etc на другом рабочем компьютере.

Вот руководство по обслуживанию Dell для 9550 - см. Раздел «Извлечение твердотельного накопителя». После извлечения диска вы можете получить внешний USB-корпус M.2 и подключить диск к другой машине, чтобы восстановить ваши данные.

DankMemes
источник
3
-1. В этом случае ваш совет может сделать все намного хуже. Прежде всего, мы не можем быть уверены, какие файлы были зафиксированы на SSD, они могут существовать в кеше. Некоторые файлы даже не были сохранены: «Но у меня все еще есть файлы, открытые в редакторе. Кажется, я не могу никуда сохранить файлы, но могу скопировать их содержимое». Далее есть риск, что SSD больше не будет инициализироваться; он работает сейчас, потому что он инициализирован до сбоя. Ваше решение означает потерю содержимого ОЗУ наверняка и содержимого SSD, возможно. Боюсь, это будет государственный переворот .
Камиль Мачоровский
0

Длинный выстрел, но в некоторых дистрибутивах встроены радиопротоколы. Один из распространенных - это fldigi. Попробуй какой флдиги.

Если у вас есть то или другое, они преобразуют текст в аудио, как правило, используя некоторые варианты фазовой манипуляции. Выходной сигнал поступает на ваши колонки / наушники, и он принимается стабильным компьютером в той же комнате, и записывается на его микрофон. (Это устраняет радиолюбители, которые передают и принимают аудио по радиоволнам).

JimR
источник
0

Подход QR-кодов может быть хорошим. Вы можете разместить на экране как можно больше и обновить их, как только ваш терминал позволит вам. Затем запишите экран XPS с помощью камеры (в отличие от веб-камеры) и просто расшифруйте сохраненное видео. Может быть полезно использовать даже замедленную съемку.

Ежик
источник
0

Отличное шоу :) У меня есть 1 предложение: вы также можете читать данные с экрана, используя фотодиод, подключенный к звуковой карте другого компьютера.

Майло О'х
источник
Или подключите аудиовыход ко входу какой-либо внешней звуковой карты (чтобы устранить шум). Вдохновитесь здесь: chdk.wikia.com/wiki/Obeding_a_firmware_dump
Майло О'Х
В самом вопросе и нескольких предыдущих ответах обсуждается захват снимков экрана камерой. Будет ли ваш подход лучше? Или даже где-нибудь так хорошо? Если так, пожалуйста, объясните. Не отвечайте в комментариях; отредактируйте свой ответ, чтобы сделать его более понятным и полным.
G-Man говорит: «Восстановите Монику»