মুছে ফেলা ফাইলটি যদি এখনও কোনও প্রক্রিয়া দ্বারা খোলা হয় তবে কীভাবে পুনরুদ্ধার করবেন?


19
$ cat important_file > /dev/null &
[1] 9711
$ rm important_file 
$ killall -STOP cat

[1]+  Stopped                 cat important_file > /tmp/p
$ ls -l /proc/`pidof cat`/fd/
total 0
lrwx------ 1 vi vi 64 May 13 20:32 0 -> /dev/pts/29
l-wx------ 1 vi vi 64 May 13 20:32 1 -> /tmp/p
lrwx------ 1 vi vi 64 May 13 20:32 2 -> /dev/pts/29
lr-x------ 1 vi vi 64 May 13 20:32 3 -> /home/vi/important_file (deleted)

কীভাবে এটি পুনরুদ্ধার করবেন important_file?

আমি কিছু চেষ্টা করেছিলাম

injcode -m dup2 -ofd=3 -ofilename=/tmp/recovered_file -oflags=O_CREAT $PID_OF_CAT

কিন্তু এটা কিছুই করে না।

উত্তর:


11

যদি / হোম এনএফএস হয় তবে / হোম / ভিআই-তে একটি .nfsNNNNNNNNNNN ফাইল থাকবে যা আপনি অ্যাক্সেস / অনুলিপি করতে পারবেন। যদি হোম কোনও স্থানীয় ফাইল সিস্টেম হয় তবে আপনি / proc / PID / fd / 3 লিঙ্কের মাধ্যমে একই জিনিসটি করতে সক্ষম হবেন:

cp /proc/PID/fd/3 /tmp/recovered_file

আপনি যদি ফাইলটি প্রকৃতপক্ষে মুছে ফেলতে চান তবে এখানে এই বিষয়ে একটি ব্লগ পোস্ট


1
ঠিক আছে, আমি এতে বিভ্রান্ত হয়ে পড়েছিলাম readlink /proc/13381/fd/3-> "/ home / vi / গুরুত্বপূর্ণ_file (মুছে ফেলা)" এবং /home/vi/important_file\ \(deleted\)সম্ভবত উপস্থিত নেই।
vi।

22

... নির্দিষ্ট সময়ে অনুলিপি করা (এবং কেবলমাত্র সেই সময়ের ফাইলের সামগ্রীর স্ন্যাপশট সংগ্রহ করা) tail -fসেই ফাইলটিকে একটি নতুন ফাইলে রূপান্তর করা:

tail -c +0 -f /proc/PIDofProgram>/fd/# > /new/path/to/file

(লেজের সতর্ক প্রোগ্রামারদের জন্য ধন্যবাদ, এটি বাইনারি আউটপুট নিয়েও কাজ করবে))

তার রানটাইমের সময়, tail -fস্বয়ংক্রিয়ভাবে ফাইলটি খোলা রাখে, মূল প্রোগ্রামটি শেষ হয়ে গেলে নিরাপদে এটিকে ডিস্ক থেকে মুছে ফেলা থেকে রক্ষা করে। সুতরাং, থামবেন না tail -fআপনার মূল প্রোগ্রাম শেষ হওয়ার পরে অবিলম্বে - tail'ed পরীক্ষা /new/path/to/fileপ্রথম তা হল আপনি যা চান তা। যদি এটি না হয় (বা অন্য কোনও কারণে অসন্তুষ্ট হয়), আপনি আবার মূল ফাইলটি অনুলিপি করতে পারেন, তবে এবার এটি লেখার পরে "প্রোগ্রাম" এবং এখনও চলছে না tail -f/ fd / ডিরেক্টরি


3
/ Proc / PIDof প্রোগ্রাম> / এফডি / # তে একটি হার্ডলিঙ্ক তৈরি সম্পর্কে কী?
বেকো


10

ইনড নম্বরটি খুঁজে পেতে lsof ব্যবহার করুন এবং এর সাথে একটি হার্ড লিঙ্কটি পুনরায় তৈরি করতে ডিবাগফগুলি ব্যবহার করুন। উদাহরণ স্বরূপ:

# lsof -p 12345 | grep /var/log/messages
syslogd 12345 root    3w   REG                8,3    3000    987654 /var/log/messages (deleted)
# mount | grep var
/dev/sda2 on /var type ext3 (rw)
# debugfs -w /dev/sda2
debugfs: cd log
debugfs: ln <987654> tmp
debugfs: mi tmp
                      Mode    [0100600] 
                   User ID    [0] 
                  Group ID    [0] 
                      Size    [3181271] 
             Creation time    [1375916400] 
         Modification time    [1375916322] 
               Access time    [1375939901]
             Deletion time    [9601027] 0
                Link count    [0] 1
               Block count    [6232] 
                File flags    [0x0] 
...snip...
debugfs:  q
# mv /var/log/tmp /var/log/messages
# ls -al /var/log/messages
-rw------- 0 root root 3301 Aug  8 10:10 /var/log/messages

আপনি অভিযোগ করার আগে, আমি উপরের প্রতিলিপিটি নকল করেছি কারণ এখনই হাতে মুছে ফেলা ফাইলটি নেই ;-)

আমি miমুছে ফেলার সময় এবং লিঙ্ক গণনাটি বোধগম্য মানগুলিতে (যথাক্রমে 0 এবং 1) পুনরায় সেট করতে ব্যবহার করি তবে এটি সঠিকভাবে কাজ করে না - আপনি দেখতে পাচ্ছেন যে লিঙ্কের গণনা শূন্যের মধ্যে রয়েছে ls। আমি মনে করি কার্নেলটি ইনোড ডেটা ক্যাশে করছে। নিরাপদ দিকে থাকতে আপনার সম্ভবত ডিবাগফ ব্যবহার করার পরে প্রথম দিকে সুযোগটি পাওয়া উচিত।

আমার অভিজ্ঞতায় আপনার অস্থায়ী ফাইলের নামটি ব্যবহার করে লিঙ্কটি তৈরি করা উচিত এবং তারপরে যথাযথ নামটি পরিবর্তন করা উচিত। এটিকে সরাসরি মূল ফাইলের নামের সাথে সংযোগ স্থাপনের ফলে ডিরেক্টরি দুর্নীতি দেখা দেয়। YMMV!


এটি যদি সত্যিই সঠিকভাবে কাজ না করে এবং সিস্টেমের ক্ষতির কারণ হয়ে থাকে তবে আপনি কেন এটি প্রস্তাব দিচ্ছেন? আমি মনে করি উত্তরের মধ্যে আপনার আরও স্পষ্টত অস্বীকৃতি থাকা উচিত যে এটি কেবলমাত্র একটি ওয়াইপি, এবং উত্পাদনে সত্যই চেষ্টা করা উচিত নয়।
সিএনটি

3

আপনি কেবল cpফাইলটি করতে পারেন , যেমন:

cp /proc/<pid>/fd/<fdno> /new/path/to/file

অবশ্যই, যদি ফাইলটি এখনও সংশোধন করা হয় তবে আপনি এই পদ্ধতির সাথে সমস্যায় পড়বেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.