মুছে ফেলা ফাইলটি পুনরুদ্ধার করে আপাচে খোলা?


10

ধরুন অ্যাপাচি লগ ফাইলটি মুছে ফেলা হয়েছে তবে এটি অ্যাপাচি দ্বারা উন্মুক্ত রাখা হয়েছে; তাহলে আমি এটিই করছি:

pid=$(lsof | grep text.txt | awk '/deleted/ {print $2}')
fd=$(lsof | grep text.txt | awk '/deleted/ {print $4}' | grep -oE "[[:digit:]]{1,}")

cp /proc/$pid/fd/$fd directorytobecopied/testfile.txt

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


lsof / | awk '(/deleted/||/abc.txt/) {print "FD :-",$4,"| File Name:-",$9}'
রাহুল পাতিল

উত্তর:


14

যদি কোনও ফাইল মুছে ফেলা হয়েছে তবে এখনও খোলা থাকে, তার অর্থ এই ফাইলটি এখনও ফাইল সিস্টেমে বিদ্যমান রয়েছে (এটির একটি ইনোড রয়েছে ) তবে একটি হার্ড লিঙ্ক গণনা রয়েছে ০. যেহেতু ফাইলটির কোনও লিঙ্ক নেই, আপনি নামটি খুলতে পারবেন না cannot । ইনোড দিয়ে ফাইল খোলার কোনও সুবিধা নেই।

ফাইলটি সিস্টেমের মাধ্যমে ফাইলটি আবিষ্কার করার কোনও উপায় নেই এবং বিশেষত ডিরেক্টরিটি যেখানে ছিল সেখানে অনুসন্ধানের কোনও উপায় নেই last ডিরেক্টরি এন্ট্রি চলে গেছে। যা যা রয়ে গেছে তা ফাইল নিজেই। আপনি একটি ফাইল সিস্টেম ডিবাগার দিয়ে ফাইলটিতে যেতে পারেন তবে এর জন্য রুট অনুমতি দরকার এবং এটি ব্যবহার করা শক্ত এবং ত্রুটি-প্রবণ।

লিনাক্সের অধীনে বিশেষ প্রতীকী লিঙ্কগুলির মাধ্যমে খোলা ফাইলগুলি উন্মুক্ত করে /proc। এই লিঙ্কগুলিকে বলা হয় /proc/12345/fd/42যেখানে 12345 কোনও প্রক্রিয়ার পিআইডি এবং 42 প্রক্রিয়াটির একটি ফাইল বর্ণনাকারীর সংখ্যা । সেই প্রক্রিয়াটির মতো একই ব্যবহারকারী হিসাবে চলমান একটি প্রোগ্রাম ফাইলটি অ্যাক্সেস করতে পারে (পড়ার / লেখার / সম্পাদনের অনুমতিগুলি ফাইলটি মুছে ফেলার সময় আপনার মতো ছিল)।

নাম যার অধীনে ফাইল খোলা হয় এখনও সিম্বলিক লিঙ্ক লক্ষ্য দৃশ্যমান: যদি ফাইল ছিল /var/log/apache/foo.log, তারপর লিংক লক্ষ্য /var/log/apache/foo.log (deleted)। (ফাইলটি খোলার পরে যদি নামটির নামকরণ করা হয়, তবে সিমলিংকের টার্গেটটি নাম পরিবর্তন করতে পারে))

সুতরাং আপনি কোনও প্রসেসের পিআইডি এবং এটি যেভাবে খোলা হয়েছে তার বিবরণ দিয়ে একটি খোলা মুছে ফেলা ফাইলের সামগ্রী পুনরুদ্ধার করতে পারবেন:

recover_open_deleted_file () {
  old_name=$(readlink "$1")
  case "$old_name" in
    *' (deleted)')
      old_name=${old_name%' (deleted)'}
      if [ -e "$old_name" ]; then
        new_name=$(TMPDIR=${old_name%/*} mktemp)
        echo "$oldname has been replaced, recovering content to $new_name"
      else
        new_name="$old_name"
      fi
      cat <"$1" >"$new_name";;
    *) echo "File is not deleted, doing nothing";;
  esac
}
recover_open_deleted_file "/proc/$pid/fd/$fd"

আপনি যদি কেবল প্রক্রিয়া আইডিটি জানেন তবে বর্ণনাকারী না, আপনি সমস্ত ফাইল পুনরুদ্ধার করতে পারেন

for x in /proc/$pid/fd/*; do
  recover_open_deleted_file "$x"
done

আপনি যদি প্রক্রিয়া আইডিটি না জানেন তবে আপনি সমস্ত প্রক্রিয়াগুলির মধ্যে অনুসন্ধান করতে পারেন:

for x in /proc/[1-9]*/fd/*; do
  case $(readlink "$x") in
    /var/log/apache/*) recover_open_deleted_file "$x";;
  esac
done

আপনি এই তালিকাটি আউটপুট বিশ্লেষণ করেও অর্জন করতে পারেন lsofতবে এটি সহজ বা নির্ভরযোগ্য বা আরও বহনযোগ্য নয় (এটি কোনওভাবে লিনাক্স-নির্দিষ্ট))


আপনি পড়তে বা লেখার জন্য এক্স / প্রবন্ধ / এক্স / এফডি / ওয়াই খুলতে পারেন নির্বিশেষে এক্স এর পড়া বা লেখার জন্য উন্মুক্ত আছে কিনা।
স্টাফেন চেজেলাস

ইউনিক্স ওএস ফাইলটি খোলার সময় কেন এটি মুছে ফেলার অনুমতি দেয় ... যদিও আমরা উইন্ডোতে এটি করতে পারি না
is

@ মুনিশ উইন্ডোজ একটি সমবায় মাল্টিটাস্কিং মডেল থেকে শুরু হয়েছিল: যদি কোনও অ্যাপ্লিকেশন খারাপ ব্যবহার করে তবে এটি সিস্টেমকে নীচে নামিয়ে আনতে পারে। বেশিরভাগ ইস্যু এখনই স্থির হয়ে গেছে, তবে উইন্ডোজ এখনও কোনও অ্যাপ্লিকেশনটিকে একটি ফাইল হাইজ্যাক করার অনুমতি দেয়: যতক্ষণ না ফাইলটি খোলা থাকে, ততক্ষণ এটি নাম পরিবর্তন বা মুছতে পারে না। ইউনিক্স এটির অনুমতি দেয় না: কোনও ফাইল মুছে ফেলা বা নামকরণ করা এটি খোলার থেকে অर्थোগোনাল।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

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