Bagaimana memulihkan file yang terbuka tetapi dihapus di Linux menggunakan ln bukan cp?

8

Saya memiliki file yang sedang diunduh (dari sumber yang sulit diunduh ulang), tetapi tidak sengaja terhapus dari namespace sistem berkas (/ tmp / bla), dan saya ingin memulihkan file ini.

Biasanya saya bisa saja cp /proc/$PID/fd/$FD /tmp/blah, tetapi dalam hal ini hanya akan memberi saya snapshot sebagian, karena file tersebut masih diunduh. Selanjutnya, setelah pengunduhan selesai, proses pengunduhan (mis. Chrome) akan menutup FD.

Adakah cara untuk memulihkan dengan inode / membuat tautan keras? Ada solusi lain? Jika ada bedanya, saya terutama khawatir dengan ext4.

Yang
sumber

Jawaban:

11

Coba gunakan ekor untuk menyalin file secara terus-menerus:

tail -c +0 -f /proc/$pid/fd/$fd > filename

Tentu saja, Anda harus menghentikan proses ekor dengan tangan (atau cara eksternal lainnya) ketika unduhan selesai.

Stijn Hoop
sumber
Bekerja seperti pesona. Saya kira ini jauh lebih mudah dari yang saya kira, karena yang Anda butuhkan hanyalah program lain yang membuka file yang sama untuk menyimpannya.
Yang
4

Proyek fdlink , yang terdiri dari modul kernel Linux dan aplikasi sederhana, bertujuan untuk membuat tautan baru ke deskriptor file terbuka. Saya belum mencobanya.

pemain coneslayer
sumber
1

Ini akan menyelesaikan pekerjaan, meskipun tidak melalui dengan memulihkan inode:

cp /proc/$PID/fd/$FD /tmp/blah
kill $PID
wget -c $URL -O /tmp/blah

Atau hentikan unduhan di Chrome secara manual jika Anda tidak ingin mematikan seluruh peramban.

Pavel
sumber
Kalau saja masalahnya begitu sederhana sehingga saya bisa melanjutkan- / mengunduh ulang! Saya mengklarifikasi pertanyaan untuk menunjukkan bahwa saya tidak dapat berasumsi saya dapat mengunduh ulang.
Yang
Kedengarannya seperti masalah :-) Sepertinya semua peretas berbasis inode terlalu rendah dan spesifik sistem berkas.
Pavel
Ya, saya juga menambahkan ini ke pertanyaan saya: jika ada bedanya, saya terutama khawatir dengan ext4.
Yang
1

Jika Anda ingin melakukan tautan keras pada ini, Anda harus menggunakan opsi -s (lihat man ln) sehingga dalam direktori fd jalankan ls -fdan cari tahu jumlah file (kebanyakan angka dua digit) dan buatln NUMBER destination-file -s

meisterlei
sumber