我可以遗忘将这些文档保存在一台濒临死亡的机器上吗?


49

首先,要供认:不,我没有进行应有的备份。

二,情况:

我有一台运行固态硬盘Fedora 25的Dell XPS 9550 。

当我被告知我试图保存到只读文件系统时,我正在处理文件并尝试保存它。原来我的文件系统现在是只读的,到处都是I / O错误

我可以通过打开的网络浏览器将文件发送给自己来保存一些文件,但是该文件崩溃了,因此我无法重新启动它。但是我仍然在编辑器中打开了感兴趣的文件。我似乎无法将文件保存在任何地方,但可以复制它们的内容。只要我能找到一种方法来提取文件内容,就可以节省数月的工作。

但是有一些可怕的局限性。我试图插入USB驱动器,但是似乎没有设备可以代表它,并且该mount命令以段错误终止。我可以尝试通过ssh切换到另一台计算机,但是出现“总线错误”并且死了。pingdmesgifconfig,所有这些工作。但是我确实有vimand lesslsand可以生成新bash实例。

没有lynx,没有firefox,没有google-chrome。没有DVD驱动器。

基本上看来我的SSD已经死了。也许是整个主板。我的内存中仍然有很有价值的文档,我有IP地址和网络连接,我可以运行一些随机命令,并且可以尝试的路径上还有3500个。

cat并且gcc似乎起作用。我可以写入/ tmp中的文件。我有一个正在运行的ipython实例似乎仍然可以正常工作。

所以...到目前为止我尝试过的都失败了。但是我觉得仍然有上千种可能性。我没有考虑什么?我怎么可能从快死了的计算机上删除这些文件?

一定有办法。

更新:新东西:

  • 由于自己的愚蠢,我失去了网络连接。
  • 我写了一个Python脚本来替换cpcp -r
  • 除非我找到某种方法来创建/devSD卡或USB驱动器的条目,否则获取数据的最佳选择似乎是屏幕,可能还有扬声器/音频电缆。
  • 我正在编写一个脚本以尝试读取文件并输出可读的文件。

建议还是很欢迎的!

更新2:较新的东西:

  • 在垂死的计算机上,我编写了一个Python脚本,该脚本将一点一点地读取文件,并尝试通过以一种颜色或另一种颜色闪烁屏幕来传达这些位。现在,它正在尝试编写一个两位代码,其中红色,绿色,蓝色和白色都代表两位。不过,这种方法效果不佳,因此我可能只切换为两种颜色,一次只做一次。
  • 在我的另一台笔记本电脑上(我为这个热门的新XPS放弃了可信赖的旧Thinkpad),我编写了一个脚本,该脚本使用OpenCV Python库从网络摄像头读取。想法是让它解码另一台计算机发送的代码。麻烦的是,来自摄像机的帧速率约为每秒15帧,这意味着如果我进行完美无误的传输,则我的最大数据速率将为每秒30位,即每秒225字节。每天324k。
  • 在快要死的XPS上,我可以tar将所需的文件打包到一个单独的档案中,该档案为1.7 MB。不幸的是,gzipbzip2xzlzop和任何压缩实用程序不可用。但是使用Python的zlib模块,我可以将此文件压缩到820KB。在这种大小的情况下,我可能会在几天内将其发送出去。
  • 因为这种传输方法很容易出错,所以我将在XPS上实现汉明码,以便在传输数据时添加一些错误校正。
  • 可能会发生并发症,因为这就是发生的情况,但是至少可以肯定地看出这些数据的可行性!
  • 由于这仍然是发送数据的麻烦方式,因此我对USB串行驱动程序进行了更多研究。我试图要装载的模块(usb-serial-simpleusb-debugsafe-serial)给I / O错误。我也不认为它是内置在内核中的,因为不存在/ dev / ttyUSB *设备。

到目前为止,感谢大家的建议-我知道这甚至不是一个明确的问题,因为你们事先不知道可以读取或不读取哪些程序/文件。仍然比这种视频方法更好的建议!

更新3:最新资料

  • 我有一个PS3 Eye网络摄像头,在禁用了它的自动增益和曝光功能之后,尽管每秒错误1字节,但仍成功地从XPS读取数据。这是一个巨大的成功-首次泄漏了数据!但是速度太慢,无法在任何合理的时间内取出我的820KB,错误率也太高。

带时钟的一位传输

  • 问题在于,写入终端的速度太慢。屏幕更新与即时更新完全不同,(我认为)要感谢urxvt我可以访问的终端仿真器的运行速度。
  • 我发现可以访问XPS上的Rust编译器。我使用Rust重新编写了传输脚本,以查看这是否可以提高终端刷新速度,但是并没有帮助。
  • 因为我不太可能提高帧速率,所以我不得不尝试增加每帧获取的数据量。我当前的方法如下所示:

电网传输

右半部分仍然是时钟信号,不断闪烁以指示新帧的到来。但是,现在左侧是一个网格,其中每个单元格的角落都用一个红色正方形标记,然后从红色正方形开始向右和向下闪烁的绿色单元格会不断闪烁,以指示一点。红色方块应使接收方计算机校准单元的位置。到目前为止,我还没有任何数据,但这就是我正在研究的内容。

  • 有人建议我考虑编写QR码,而不是这些临时的颜色模式。我也将对此进行研究,也许可以实现它而不是这种网格方法。纠错将是一个不错的选择,并且能够使用标准库进行解码。
  • 我了解到我可以访问libasound(ALSA声音库),但不能访问与其关联的头文件(alsa/asoundlib.h或其他文件)。如果有人知道如何在不使用标题的情况下使用共享库,或者可以帮助我编写正确的标题以使我产生音频输出,那么我可以采用基于音频的方式来取出文件。
  • 或者,如果有人可以在没有访问libusb的情况下帮助我操纵USB设备,那么也许我可以做些什么?

向前进!

更新4:产生音频输出!

用户Francesco Noferi做得很出色,帮助我利用了先前更新中提到的ALSA库。C编译器有问题,但是使用Rust编译器,我可以使用FFI直接调用libasound。现在,我已经通过音频播放了很多数据,听起来像是音乐!仍然需要建立一个真实的沟通渠道,但是我感到非常有希望。在这一点上,我的工作基本上是实施调制解调器,因此,如果有人对如何执行此操作有任何指导,那我将不胜感激。理想的调制方式是易于手工实现和解调,而我可以使用现有的库。由于这可以直接通过音频电缆而不是通过电话网络进行传输,因此从理论上讲 我们可以做的比56kbps更好,或者比今天的标准要好得多,但实际上,谁知道我们会得到什么。

感谢这里和/ r / techsupportmacgyver/ r / rust的每个人都提出了许多出色的建议。即将实施此“调制解调器”,然后我将以结尾词结尾。我想我可能会将我的代码放在将来供其他绝望的人使用的地方-甚至可能是一个易于手动输入到即将死机的奇怪的渗透工具的存储库?我们将看看会发生什么。

更新5:我花了很长时间与ALSA和我便宜的StarTech USB音频捕获设备(接收笔记本电脑中没有内置线)进行搏斗,许多错误的尝试开始尝试使用我自己的传输协议,但最终还是得到了一些建议我的业余无线电爱好者朋友实现了以150波特运行的 RTTY线路协议,实际上,该协议每秒可以提供大约10个字节。它不是超级快,但是相当可靠。我几乎完成了传输820KB文件的操作,并使用CRC32校验和(使用了Python的crc32功能进行了验证)zlib模块,我可以访问)。因此,我宣布胜利,并再次感谢我!我将花费更多时间来查找更多可读且可以传输的文件,但是基础已经就位。与大家一起工作很有趣!

最后更新

在染色机上:

$ 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

:-)



2
转到文件所在的目录,然后发出命令python -m SimpleHTTPServer。现在,您是通过共享文件的HTTP服务器端口8000。在同一网络中的其他设备上打开浏览器,然后键入以下内容: http://<IP address>:8000并开始下载所有内容。
jcbermu

2
您在这里遇到的很棒的怪胎。我希望我可以投票两次。
卡米尔Maciorowski

1
如何将废料冷却出RAM以减少挥发性并将其移至备用XPS呢?zh.wikipedia.org/wiki/Cold_boot_attack
root于2009年

1
有点偏离主题,但是如果您可以链接相关的reddit线程,这样我们将在这里看到建议的内容,那将很棒。
鲍勃

Answers:


15

这是一个示例libasound程序,具有足够的定义,可以获取基本的2通道44.1k WAV输出,而没有标题。

编辑:我实际上不确定是否直接以wav格式转储数据是否可行,因为录制时的噪声很容易损坏它,但是您可以做一些像正弦波的高频操作,这样更可靠

EDIT2:如果存在播放并且可以正常运行,您也可以使用它,并且编写一个输出原始音频并将其通过管道传输到播放或任何可以播放音频的程序

EDIT3:修改它根本不使用任何标题

如果-lasound无法编译,请添加-L / path / where / libasound / is / located

/*
    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;
}

我投票给您,认为您应该以这种出色的方式获得大量荣誉!麻烦就在这里:我要使用的所有四个包含文件都出现IO错误。因此,我需要一种解决方法。我可以在另一台笔记本电脑上进行预处理,但是结果是一个63K的文件,压缩了11K。如果我能找到获取数据的方法的XPS那么这是可行的,但我不激动在手动键入它。编译后的文件为10.4K或压缩后的2.4K。到了我可以手动输入的地方,但是错误很难被发现。
乔什·汉森

1
我已编辑程序,根本不使用任何标题,请尝试尝试
Francesco Noferi

gcc给了我“总线错误”(某些程序附带该错误,但并不太了解。)幸运的是,我有一个正在运行的Rust编译器,因此使用Rust的FFI功能,我在上面使用Rust实现了代码。它正在编译并运行,但是我仍然听不到任何声音。但是我不太确定音量是否调高了,它可能被静音了。但是我无法运行alsamixer / xfce4-mixer进行检查。我正在研究直接使用alsalib来确保音量上升。非常感谢您为此付出的努力!
乔什·汉森

1
听到您运行它,真高兴!对于音量,这是一个枚举默认设备的混音器控件并将其最大化的程序:gist.github.com/008f0c3acdbcae886a19868a0554987b。如果仍然有问题,则可能需要编写一些内容来枚举音频输出及其混音器条目,以确保它确实坏了,而不仅仅是输出到错误/静音的设备上。也可以尝试向音频输出程序中添加错误检查,以查看是否存在错误。总线错误意味着“试图访问不可能在那里的内存”,所以可能是损坏的内存映射库
Francesco Noferi

原来音量已经提高了,但是我实际上并没有向扬声器发送任何字节-某种程度上我不明白如何读入Rust中的缓冲区,它总是读取0个字节。但是使用我构建的一些字节,我可以产生音频输出!这很棒,这似乎是一种以干净的方式获取数据的好方法。现在是时候学习调制/解调策略了,所以我可以聪明地做到这一点。非常感谢您为此所做的工作-非常感谢!
乔什·汉森

3

您的HDMI或任何其他显示输出端口是否正常工作?如果是这样,您可以使用屏幕捕获设备将其记录为视频,并在以后进行处理。因此,不受网络摄像头帧率的限制。


2

您如何对数据进行十六进制编码并将其每页输出到终端?

您可以在二进制文件中添加带偏移量的前缀,以便可以轻松地重新生成页面(用于手动更正?)。

然后在另一台计算机上,使用某些OCR软件扫描页面。

80x25终端每页将产生1000个字节(减去一些前缀空间)。因此,您可以在大约1000页中获取数据。即使是每秒一页,也不到20分钟。

十六进制编码易于编写,并且提供了纠错的原始形式(只有16个有效符号)。


1

您可以建立网络连接吗?ssh可能有点过多,但是如果您可以在2台计算机上使用netcat,则可能能够传输数据。一种在发送模式,一种在收听模式。如果您需要做的就是传输文本,那么这“可以”是一种解决方案。

编辑:没关系,只要读到您也失去了网络连接即可。


1
我认为您的答案应该在那里。nc除了正常运行的网络堆栈外,它没有其他依赖项,在OP将其销毁之前,OP一直没有。这大大降低了可执行文件无法启动的机会。如果有人遇到类似问题,那绝对是一个有用的解决方案。
zneak

0

也许可以从命令行通过电子邮件发送电子邮件,包括发送文件。

就像是:

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

应该管用。

其他示例:http : //www.binarytides.com/linux-mail-command-examples/


可悲的是,mail它不在我可以运行的程序集合中(基本上是随机的)。再加上我失去了我的网络连接:-(
Josh Hansen

哎哟。好的,我剩下的就是cat文件,然后用手机拍照。
mcalex

可能是这样!
乔什·汉森

0

Python可以访问您的音频输出端口吗?您可以尝试使用那种方式传输数据-看到这个那个


我认为我没有安装Python的音频库,所以可能没有。但是/ dev / snd中有ALSA设备。alsa-lib已安装,但我认为我看不懂。有什么方法可以直接写入音频设备?
乔什·汉森

@ user17219您确定ossaudiodevPython安装中没有可用的库吗?如果我正确阅读了文档,它应该是Linux和FreeBSD中的标准模块。import ossaudiodev开箱即用地在我的Ubuntu中工作。
lukeg

其实您说的对,但它很遗憾,因为它不在内存中,所以我无法读取它---它试图从磁盘读取模块,这会导致I / O错误:-(不过建议
Josh Hansen

@ user17219,真可惜。tldp.org/HOWTO/Alsa-sound-6.html-此链接显示您可以尝试cat将文件设置为/dev/snd/pcm...设备。
lukeg '17

我已经尝试过,但是遇到了一些奇怪的错误。我认为自从编写该文档以来,pcm设备已经更改,因为现在有* p和* c变体。我试过cat荷兰国际集团/dev/random到所有的人,但无济于事。
乔什·汉森

0

你可以从你的机器上卸下SSD和dd/ photorec的/ etc它的另一个工作的机器上。

这是9550Dell服务手册 -请参阅“卸下固态驱动器”部分。卸下驱动器后,您将获得一个外部M.2 USB机柜并将磁盘连接到另一台计算机以恢复数据。


3
-1。在这种情况下,您的建议可能会使情况变得更糟。首先,我们无法确定哪些文件已提交到SSD,它们可能存在于缓存中。有些文件甚至根本没有保存:“但是我仍然在编辑器中打开了感兴趣的文件。我似乎无法将文件保存在任何地方,但是我可以复制它们的内容。” 接下来,存在SSD无法初始化的风险。它现在可以工作,因为它在故障之前已初始化。您的解决方案意味着肯定会丢失RAM内容,而可能丢失SSD内容。恐怕是政变
卡米尔Maciorowski

0

远射,但某些发行版中内置了火腿广播协议。一种常见的是fldigi。尝试哪个fldigi。

如果您有这个或另一个,他们通常使用相移键控的一些变体将文本转换为音频。输出到您的扬声器/耳机,并由同一房间中一台稳定的计算机接收,并在其麦克风上列出。(这消除了通过无线电波发送和接收音频的火腿收音机)。


0

QR码方法可能很好。您可以在屏幕上容纳尽可能多的内容,并在终端机允许时立即刷新它们。然后使用摄像头记录XPS的屏幕(而不是使用摄像头),然后仅对已保存的视频进行解密。即使使用慢动作捕捉也可能会有所帮助。


0

很棒的表演:)我有一个建议:您还可以使用连接到另一台计算机的声卡的光电二极管从屏幕上读取数据


或将音频输出连接到某些外部声卡的输入(以消除噪声)。在这里获得启发:chdk.wikia.com/wiki/Obtaining_a_firmware_dump
Milo O'h

问题本身以及前面的几个答案,讨论了如何使用相机捕获屏幕图像。您的方法会更好吗?甚至是附近的任何地方?如果是这样,请解释。不要在评论中回复;编辑您的答案,使其更清晰,更完整。
G-Man说'Resstate Monica''De​​c
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.