我可以将这些文件保存在即将被遗忘的机器上吗?

Jos*_*sen 52 linux fedora crash bash ssd

首先,坦白:不,我没有做我应该做的备份。

二、情况:

我有一台带有运行Fedora 25固态磁盘的戴尔 XPS 9550 。

我正在处理一个文件,并在被告知我试图保存到只读文件系统时尝试保存它。原来我的文件系统现在是只读的,而且到处都是i/o 错误

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

但是有一些可怕的限制。我试图插入一个 USB 驱动器,但似乎没有设备代表它,并且该mount命令因段错误而终止。我可以尝试通过 ssh 连接到另一台计算机,但是我收到“总线错误”并且它死了。ping, dmesg, ifconfig, 这些都不起作用。但我有vimlessls,可以产生新的bash实例。

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

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

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

所以......到目前为止我所尝试的都失败了。但我觉得还有一千种可能。我没有考虑什么?我怎么可能从我垂死的计算机上获取这些文件?

一定有办法。

更新:新东西:

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

建议仍然非常欢迎!

更新2:更新的东西:

  • 在垂死的计算机上,我编写了一个 Python 脚本,它将一点一点地读取文件,并尝试通过使屏幕闪烁一种或另一种颜色来传达这些位。现在它正在尝试做一个两位代码,其中红色、绿色、蓝色和白色都代表一个两位对。不过,这效果不佳,所以我可能只是切换到两种颜色,一次做一点。
  • 在我的另一台笔记本电脑上(我为这个新的热门 XPS 放弃了可靠的旧 Thinkpad)我编写了一个脚本,该脚本使用 OpenCV Python 库从网络摄像头读取数据。这个想法是让它解码另一台计算机发送的代码。问题是来自相机的帧速率大约是每秒 15 帧,这意味着如果我有一个完美的、无错误的传输,我的最大数据速率将是每秒 30 位,即每秒 225 字节。那是每天 324k。
  • 在垂死的 XPS 上,我可以tar用来将所需的文件打包到一个 1.7 MB 的存档中。不幸的是,gzipbzip2xzlzop和任何压缩实用程序不可用。但是使用 Python 的zlib模块我可以将这个文件压缩到 820KB。考虑到这个尺寸,我可能会在几天内把这东西寄出去。
  • 因为这种传输方法很可能很容易出错,所以我将在 XPS 上实现汉明码,以便在传输数据时添加一些纠错功能。
  • 可能会出现并发症,因为这就是发生的事情,但至少以某种方式获取这些数据似乎是可行的!
  • 由于这仍然是一种非常糟糕的数据发送方式,我更多地研究了 USB 串行驱动程序。我尝试加载的模块 ( usb-serial-simple, usb-debug, safe-serial) 出现 i/o 错误。我也不认为它内置在内核中,因为没有 /dev/ttyUSB* 设备存在。

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

更新 3:最新的东西

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

带时钟的一位传输

  • 问题是写入终端太慢了。屏幕更新不像是即时的,感谢(我认为)urxvt我可以访问的终端模拟器的缓慢。
  • 我发现我可以访问 XPS 上的 Rust 编译器。我使用 Rust 重写了传输脚本,看看是否会提高终端刷新速度,但没有帮助。
  • 因为我不太可能提高帧率,所以我必须尝试增加每帧获得的数据量。我目前的方法看起来像这样:

电网传输

右半部分仍然是时钟信号,闪烁以标记新帧的到来。但是左边现在是一个网格,每个单元格在角落里用红色方块标记,然后红色方块右侧和下方的绿色单元格闪烁以指示位。红色方块应该让接收计算机校准细胞所在的位置。我还没有通过这种方式获得任何数据,但这就是我正在研究的。

  • 有人建议我考虑编写二维码而不是这些临时的颜色模式。我也将研究它,并可能实现它而不是这种网格方法。纠错将是一个不错的胜利,并且能够使用标准库进行解码。
  • 我了解到我可以访问 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.
Run Code Online (Sandbox Code Playgroud)

在救援机器上:

$ 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
Run Code Online (Sandbox Code Playgroud)

:-)

Fra*_*eri 15

这是一个示例 libasound 程序,它的定义刚好足以获得基本的 2 声道 44.1k wav 输出,而无需头文件。

编辑:我实际上不确定直接将数据转储为 wav 是否可行,因为录制时的噪音很容易损坏它,但是您可能可以在高频下执行诸如正弦波之类的操作,这样更可靠

EDIT2:如果 aplay 存在并且可以工作,您也可以使用它,只需编写一个输出原始音频的程序并将其通过管道传输到 aplay 或任何可以播放音频的东西

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;
}
Run Code Online (Sandbox Code Playgroud)


小智 5

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