ঘটনাচক্রে অপসারণ / বিন। আমি কীভাবে এটি পুনরুদ্ধার করব?


91

আমি নামের একটি ডিরেক্টরিতে কাজ করছিলাম bin। আমার কাজ শেষ হওয়ার পরে, এর মালিকানা binএবং এর মধ্যে থাকা কয়েকটি ফাইলের কারণে আমি ঘটনাক্রমে দৌড়েছি:

sudo rm -r /bin

পরিবর্তে:

sudo rm -r bin

দেখে মনে হয় যে আমার /টাইপ করা সমস্ত কিছু সামনে আমার হাত যুক্ত হত ।

আমি কীভাবে আমার /binডিরেক্টরিটি পুনরুদ্ধার করতে পারি ?

আমি আমার উবুন্টুর সাথে সম্পর্কিত একই ফাইলগুলি চাই, আমি লাইভ ডিস্ক বা অন্য কোনও চলমান সিস্টেম থেকে সেগুলি অনুলিপি করে আটকানো পছন্দ করি না।


3
নন /binউবুন্টু শুধু করার জন্য একটি সিমবলিক লিঙ্ক উপর /usr/binএই দিন? সুতরাং আপনাকে যা করতে হবে তা হ'ল সিমলিংকটি পিছনে ফেলে দেওয়া উচিত?
মুজার

3
@ মুজার আমি ১ 16.০৪ চালাচ্ছি, এবং /binএটি /usr/binএখানে কোনও প্রতীকী লিঙ্ক নয় , আমি মনে করি যে এটি এর বিরুদ্ধে হবে FHS। এছাড়াও আমরা মত একটি তুচ্ছ প্যাকেজ পরীক্ষা যদি coreutilszesty (এখানে) । আমরা দেখতে পাচ্ছি যে /binপাশাপাশি প্রচুর জিনিস ইনস্টল করা হবে /usr/binতবে এখনও এটি একটি লিঙ্ক হতে পারে, আমি অবগত নই।
রাভেক্সিনা

2
@ রাভেক্সিনা আর্ক লিনাক্স ইতিমধ্যে / ইউএসআর / বিনকে সিমলিংক করে
দিমিত্রি কুদ্রিয়াভসেভ

1
আমি ভেবেছিলাম যে লোকেরা বুঝতে পারবে যে এটি একটি তৈরির পরিস্থিতি, আমি আসলে আমার অপসারণ করিনি /bin, আমি এমন কিছু বিষয় বিবেচনা করেছি যা অন্য কারওর সাথে ঘটতে পারে (আমি যে উত্তর দিয়েছিলাম এমন অন্য প্রশ্নের উপর ভিত্তি করে), তারপরে আমি আমার জ্ঞান ভাগ করে নেওয়ার জন্য একটি নির্দেশিকা লিখেছিলাম অন্যদের সাথে :), যদিও আমি সমস্ত মন্তব্যের প্রশংসা করি, তবে তারা এই প্রশ্নটি পড়তে আসা অন্যান্য ব্যক্তির পক্ষেও সহায়ক। আপনাকে সকলকে ধন্যবাদ;)
রাভেক্সিনা

1
আমি যখনই "rm -r" কমান্ড, বা অন্য কোনও কমান্ডের উল্লেখযোগ্য পরিণতি ঘটাতে পারি তার অভ্যাসটি আমি অর্জন করেছি, আমি কমান্ডটি টাইপ করি এবং তারপরে হিট করার আগে কমপক্ষে 3 সেকেন্ডের জন্য আমার হাতগুলি কীবোর্ড থেকে দূরে সরিয়ে রাখি ENTER। এটি আমাকে এটি সন্ধান করার এবং আমার কাছে সবকিছু ঠিক মতো টাইপ করা আছে তা নিশ্চিত করার সুযোগ দেয় এবং আমি জানি যে আমি কী করার পরিকল্পনা করছি তা কী করবে। বিরল ইভেন্টগুলিতে, বিরতি দেওয়ার সময়, আমি সিদ্ধান্ত নিয়েছি যে আমাকে কমান্ডটি মুছে ফেলতে হবে - এটি সর্বদা ভুল কমান্ডের কারণে নয়, তবে কখনও কখনও প্রথমে আমাকে কিছু যাচাইকরণ করতে হবে বলে মনে হয়।
আজাব

উত্তর:


180

এটা কি সম্ভব?

ভাল, বেশিরভাগ তুচ্ছ এবং গুরুত্বপূর্ণ ইউটিলিটিগুলি ইনস্টল করা আছে /binএবং এখন আপনি সেগুলির সকলের অ্যাক্সেস হারিয়ে ফেলেছেন। আসলে, আপনি যদি রিবুট করেন তবে আপনার সিস্টেম আর বুট-আপ করতে সক্ষম হবে না।

যাইহোক, আমরা সমস্যাটি স্থির করতে যাচ্ছি /binযেখানেই সম্ভব যতটা সম্ভব বিষয়বস্তু তৈরি করা হবে। পার্থক্যটি কিছু প্রতীকী লিঙ্কগুলির হবে যা আমরা খুব ঠিক করব।


কিভাবে?

প্রথমত, আমাদের chrootআপনার ভাঙা ব্যবস্থা থাকা উচিত , তবে একটি সামান্য পার্থক্য সহ ! এর পরে আমরা আপনার সিস্টেমে ইনস্টলড প্যাকেজগুলির একটি তালিকা পাব যার /binডিরেক্টরিতে কোনও ইনস্টল করা ফাইল রয়েছে , তারপরে আমরা কেবল প্রয়োজনীয় প্যাকেজগুলি ডাউনলোড করতে যাব এবং প্রয়োজনীয় ফাইলগুলি এতে বের করতে যাচ্ছি /bin। তারপরে আমাদের হয়ে যাবে।

উদাহরণস্বরূপ, পরে chroot, আমরা প্যাকেজগুলির একটি তালিকা পেতে পারি যা /binব্যবহারে ফাইলগুলি ইনস্টল করা রয়েছে :

dpkg --search /bin | cut -f1 -d: | tr ',' '\n'

এবং আমরা এটি ব্যবহার করতে পারি:

dpkg --listfiles PACKAGE-NAME | grep "^/bin/" # or awk '$0 ~ "^/bin/

এই প্যাকেজগুলি দ্বারা ইনস্টল করা ফাইলগুলিতে তালিকাভুক্ত করতে /bin

তারপরে আমরা কেবল আমাদের প্রয়োজনীয় সমস্ত প্যাকেজগুলির একটি তালিকা তৈরি করি, তারপরে সেগুলি ডাউনলোড করুন এবং এ জাতীয় /binকিছু দিয়ে এটিকে নিষেধ করুন :

xargs apt download < list-packages
dpkg-deb -x PACKAGE .
mv ./bin/* /bin

তবে আমাদের সিস্টেমে ইনস্টল করা সমস্ত প্যাকেজ পরীক্ষা করার জন্য আমাদের অবশ্যই একটি স্ক্রিপ্ট ব্যবহার করতে হবে, কারণ এটি নিজে হাতে করা কেবল উন্মাদনা।

সুতরাং আমি একটি স্ক্রিপ্ট লিখেছিলাম যা আমাদের প্রয়োজন সমস্ত কিছু করে। এটি আমাদের পুনরুদ্ধার করার জন্য প্রয়োজনীয় সমস্ত প্যাকেজ খুঁজে পায় /bin, প্রতিটি প্যাকেজের নাম এবং তাদের সম্পর্কিত ফাইলগুলি আমাদের দেখায় /bin। এখানে একটি স্ক্রিন শট হয়:

আমার স্ক্রিপ্ট দ্বারা আউটপুট হিসাবে <code> / বিন </code> প্যাকেজ তালিকার স্ক্রিনশট

শেষে আমরা সমস্ত প্যাকেজ পুনরায় ইনস্টল করতে বা শুধুমাত্র প্রয়োজনীয় ফাইলগুলি ডাউনলোড এবং এক্সট্র্যাক্ট করতে বেছে নিই /bin(যা প্রস্তাবিত বিকল্প):

আমার স্ক্রিপ্ট দ্বারা প্রদত্ত বিকল্পগুলির স্ক্রিনশট

আপনি এই স্ক্রিপ্টের একটি অনুলিপি গ্রহণ করতে পারেন বা সরাসরি এটি ডাউনলোড করতে পারেন


চল শুরু করি

chroot

আপনার ইনস্টলড উবুন্টুর মতো একই আর্কিটেকচারযুক্ত একটি সিস্টেমকে আপনার সিস্টেম বুট করুন, একটি টার্মিনাল খুলুন এবং রুট অ্যাক্সেস পান:

sudo -i

আপনার rootফাইল সিস্টেমটি মাউন্ট করুন (আমার জন্য এটি /dev/sda1):

mount /dev/sda1 /mnt

আমাদের ইন্টারনেটের সাথে সংযোগ প্রয়োজন, সুতরাং resolv.confলাইভ উবুন্টু থেকে আপনার মাউন্ট করা মূল পার্টিশনে অনুলিপি করুন :

cp /etc/resolv.conf /mnt/etc/resolv.conf

মাউন্ট করা পার্টিশনের কোথাও স্ক্রিপ্টটি অনুলিপি করুন, যেমন:

cp /media/ubuntu/usb/restore-bin.sh /mnt/restore-bin.sh

অথবা আপনি এটি wgetইত্যাদি ব্যবহার করে ডাউনলোড করতে পারেন:

wget https://git.io/v9fRm -O /mnt/restore-bin.sh

অন্যান্য প্রয়োজনীয় পাথ মাউন্ট করুন:

mount --bind /dev /mnt/dev
mount --bind /sys /mnt/sys
mount -t proc /proc /mnt/proc

এবং এখানে সামান্য পার্থক্য : chrootসেখানে কোনও /binডিরেক্টরি নেই যখন আমরা একটি ভাঙ্গা সিস্টেমের কিভাবে করতে পারি ? আমাদের কোন শেল চালানো উচিত?

সুতরাং একটি অস্থায়ী বিন ডিরেক্টরি তৈরি করুন। যেমন: bintmpআপনার ভাঙা সিস্টেমের মূলের মধ্যে নাম দেওয়া হয়েছে :

mkdir /mnt/bintmp

তারপরে লাইভটিকে আবদ্ধ করুন /bin:

mount --bind /bin /mnt/bintmp

/bintmp/bashআপনার লগইন শেল হিসাবে সেট করার সময় সিস্টেমে ক্রট করুন :

chroot /mnt /bintmp/bash

/bintmpআপনার PATHপরিবেশ পরিবর্তনশীল হিসাবে রফতানি করুন :

export PATH=/bintmp:$PATH

স্ক্রিপ্টটি সম্পাদনযোগ্য বিট দিন:

chmod +x restore-bin.sh

স্ক্রিপ্টটি চালান:

./restore-bin.sh

অনুসন্ধান শেষ হওয়ার জন্য অপেক্ষা করুন তারপরে আমরা স্ক্রিনশটটিতে যে প্রশ্নটি দেখেছি তার উত্তর দিন। এটি পুনরুদ্ধার শুরু হবে /binএবং আমরা প্রায় সম্পন্ন করেছি।

এটি সম্পন্ন হওয়ার পরে , পরিবেশ থেকে বেরিয়ে আসতে এবং মাউন্ট করা পাথগুলি আনমাউন্ট করার জন্য CTRL+ ব্যবহার করুন :Dchroot

umount -R /mnt

সিস্টেমটি পুনরায় বুট করুন।

এর মধ্যে লিঙ্কগুলি পুনরুদ্ধার করা হচ্ছে /bin

/binডিরেক্টরি দ্বারা পরিচালিত প্রায় 5 টি প্রতীকী লিঙ্ক ব্যতীত এখন ডিরেক্টরিতে থাকা সমস্ত ফাইলই ফিরে আসে update-alternatives

আপনার চলমান সিস্টেমে, চালান:

sudo update-alternatives --all

এটি আপনাকে কিছু প্রশ্ন জিজ্ঞাসা করে; আপনি কেবল ENTERসেগুলি গ্রহণ করতে চাপতে পারেন ।

এবং এখন আমরা সম্পন্ন।


30
এটি কোনও সন্দেহ ছাড়াই, আস্ক উবুন্টুকে আমি দেখেছি সেরা উত্তর। ওপি কোনও অসুবিধাজনক পরিস্থিতিতে রয়েছে তা জেনে আপনি এত বেশি কাজ করা আপনার পক্ষে অত্যন্ত দয়া।
ননি

15
ওহ অপেক্ষা tl; ডা। আমার বুঝতে হবে যে আপনি এটা করেছেন।
ননি

এটা চমৎকার. আমি পছন্দ করি যে এসই ডিজাইন কীভাবে কোনও ইঙ্গিত দেয় না যে এটি একটি স্ব-উত্তরযুক্ত প্রশ্ন।
পেদ্রো

5
@ হ্যামস্টেরিফিক এটি করেছে: উত্তরদাতার নাম (স্বাক্ষর) সমেত আয়তক্ষেত্রটি দেখুন: এর গা a় ব্যাকগ্রাউন্ড রয়েছে, যা ওপি পোস্টগুলি পোস্ট করে না। এটি মন্তব্য, উত্তর এবং প্রশ্নের ক্ষেত্রে প্রযোজ্য।
রুসলান

27

যদি আপনার বর্তমান সিস্টেমে এখনও চলমান শেল এবং ইন্টারনেট অ্যাক্সেস থাকে তবে এটি সিস্টেমে অন্য কোথাও বিদ্যমান সরঞ্জামগুলি ব্যবহার করে করা যেতে পারে। আমি ধরে নিচ্ছি আপনাকে কেবল মুছে ফেলা হয়েছে /bin/binঅবশ্যই সর্বাধিক সুবিধাজনক ইউটিলিটি রয়েছে যা আপনি এই জাতীয় পরিস্থিতিতে (ব্যস্তবক্স) ব্যবহার করতে পারেন তবে তা ছাড়া আমাদের কিছুটা সৃজনশীল হতে হবে।


আপনার ইতিমধ্যে একটি চলমান শেল রয়েছে, এবং যেহেতু sudoএটি রয়েছে /usr/bin, আমাদের আরও ক্ষতি করার আগে আসুন আমরা একটি চলমান রুট শেলটি পেয়ে যাই। তবে /bin/bashআর বেশিরভাগ শাঁস চলে গেছে! ভাগ্যক্রমে, লিনাক্সের কাছে আপনি যে শেলটি ব্যবহার করছেন তার একটি মেমোরি অনুলিপি রয়েছে। তাই:

sudo /proc/$$/exe

দৃrict়ভাবে বলতে গেলে আমাদের অনুসরণ করা অনেকের জন্য একটি রুট শেল দরকার নেই। তবে যাই হোক।

এখন, dpkgএখনও কাজ করে, কমপক্ষে কোন প্যাকেজে ফাইল রয়েছে তা সন্ধানের জন্য /bin:

dpkg -S /bin

আমরা ব্যবহার করতে পারি awkএটি প্রক্রিয়া এবং প্যাকেজের নাম পেতে, এবং xargsএবং apt-getপ্যাকেজ (সমস্ত মধ্যে ডাউনলোড করতে /usr/bin)। যদি আপনার অস্থায়ী ডিরেক্টরি থাকে তবে আপনি এটি ব্যবহার করতে পারেন cdকারণ আপনার বর্তমান ডিরেক্টরিটি কিছুটা অগোছালো হতে চলেছে:

dpkg -S /bin | awk -F '[, :]' '{NF--}1' | xargs apt-get download

এখন, আমাদের সবচেয়ে বড় সমস্যাটি হ'ল এটি /bin/tarঅনুপস্থিত এবং এটি ছাড়া dpkgআর্কাইভগুলি বের করতে পারে না। আমরা সেখানে দুই-তৃতীয়াংশ যেতে পারি, কারণ:

  1. .debফাইলগুলি আসলে arসংরক্ষণাগার (আবার এতে /usr/bin):

    ar x tar_*.deb
    
  2. দুটি .tar.*সংরক্ষণাগার সমন্বয়ে dataএবং control:

    $ echo *.tar.*
    control.tar.gz data.tar.xz
    
  3. যদিও gzip, ইউটিলিটি রয়েছে /bin, unxzরয়েছে /usr/bin:

    unxz data.tar.xz
    

এখন data.tarএটি tarথেকে নিষ্কাশন ছাড়াই আমাদের কাছে একটি ফাইল রয়েছে tar

পাইথন উদ্ধার ! এখানেই sudoসত্যই প্রয়োজন:

$ sudo python -c 'import tarfile; tarfile.open("data.tar").extractall("/")'
$ echo /bin/*
/bin/tar

dpkgযুক্তিসঙ্গতভাবে সম্পূর্ণ হওয়ার জন্য আমরা এখন বাকী ডেব ফাইলগুলি বের করতে ব্যবহার করতে পারি /bin:

for i in *.deb; do dpkg-deb -x "$i" /; done

তবে, আমাদের তবুও ডাব ফাইলগুলির যথাযথ ইনস্টলেশন করা উচিত, যাতে প্যাকেজগুলির দ্বারা তৈরি হওয়া সিমলিঙ্কগুলি পুনরায় তৈরি করা যায়:

sudo apt install --reinstall ./*.deb

বা:

sudo dpkg -i *.deb
sudo apt-get install -f

নোট:

  1. data.tar.xzফাইলটি প্রত্যক্ষ করতে আমরা পাইথন 2 ব্যবহার করতে পারি না , যেহেতু পাইথন 2 কেবলমাত্র জিজিপ এবং বিজিপ 2 সংক্ষেপণ সমর্থন করে। পাইথন 3 এটি সমর্থন করে, তাই আপনি পাইথন 3 সরাসরি ছাড়াই ব্যবহার করতে পারেন unxz:

    sudo python3 -c 'import tarfile; tarfile.open("data.tar.xz").extractall("/")'
    
  2. ফিরে আসার পরে /bin/tar, আপনার ব্যবহারের আগে আপনাকে কিছু ডিবে ফাইলগুলি বের করতে হবে apt-get: শেলস, কোরিউটিলস ইত্যাদি just কেবলমাত্র সমস্তগুলি বের করে নেওয়া এবং পরে পুনরায় ইনস্টল করা সহজ।

আমি এটি পরীক্ষা করিনি, তবে আমি এটি প্রায় সম্পূর্ণরূপে পড়েছিলাম, এটি দুর্দান্ত ছিল, আসলে আমি স্মৃতিতে ব্যাশের একটি অনুলিপি খুঁজে বের করার চেষ্টা করেছি, আমি কিছুটা অনুসন্ধান করেছি, আমি আকর্ষণীয় কিছু খুঁজে পেলাম না এবং দেখলাম তার পরেও ভিতরে নেই /usr/bin, আমি বললাম আমি যা কিছু যাচ্ছি ... দুর্দান্ত।
রাভেক্সিনা

1
একটি প্রশ্ন, /proc/$$/exeএকটি লিঙ্ক না /bin/bash? /binসরানো হলে এটি কীভাবে কাজ করবে ? (এটি কাজ করছে, তবে কীভাবে), আমি ভেবেছিলাম এটি একটি ভাঙা লিঙ্ক হওয়া উচিত ... এ কারণেই আমি এই আইডিয়াটি পিছনে ফেলেছি।
রাভেক্সিনা

3
@ রাভেক্সিনা সম্পূর্ণ উত্তর পেলেন না, তবে: কীভাবে / প্রো / /
মুড়ু

1
PATH = / usr / lib / klibc / বিন: AT পথ আপনার বিড়াল এবং পিঠে ফিরিয়ে আনবে
জোশুয়া

@ জোশুয়া এবং তাদের প্রত্যেকে স্থিতিশীলভাবে যুক্ত! নিস!
মুড়ু

7

আপনার সিস্টেমকে ব্যবহারযোগ্য করে তোলার জন্য আপনি অস্থায়ীভাবে কোনও লাইভ সিডি বা অন্য কোনও সিস্টেম থেকে ফাইলগুলি /binরাখতে পারেন, তারপরে apt-get install --reinstallপ্যাকেজগুলিতে থাকা প্যাকেজগুলির জন্য চালিয়ে আপনার উবুন্টু ইনস্টলেশন থেকে ফাইলগুলি প্রতিস্থাপন করুন /bin


এই আমি কি করতে হবে। লাইভ ডিভিডি একই সংস্করণ নম্বর হিসাবে প্রায় একই হবে যদি বর্তমান ইনস্টল করা ঠিক না হয়। আমার কাছে যদি ডিস্ক বা ইউএসবি লাইভ সংস্করণ থাকে তবে আমি তাদের তুলনা করতে এবং আপনার মতো উত্তর পোস্ট করতে পারি। এই থ্রেডটি আরও একটি থিয়োরিয়াল যদি ওপি কখনই প্রথমে স্থির / বিন মুছে না ফেলে যা একটি সম্ভাবনা যা তিনি একই সময়ে উত্তরটি সমস্ত সম্ভাবনার প্রশ্নের উত্তর হিসাবে লিখেছিলেন। এখনও খুব সুন্দর চিন্তার পরীক্ষা এবং চমৎকার লেখার স্টাইল।
WinEunuuchs2 ইউনিক্স

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

1

কিছু সংযোজন এই চমৎকার উত্তর , পরে আমি এই বিষয় সম্মুখীন (মুছে ফেলা সহ /boot, /etc, /libএবং /lib64):

  • chrootপ্রয়োজন /libএবং /lib64উপস্থিত হতে হবে; অন্যথায় আপনি নিম্নলিখিত ত্রুটিটি পাবেন:
    failed to run command ‘/bin/bash’: No such file or directory
    আমি এটি লাইভসিডি ওএস থেকে অনুলিপি করেছি এবং পুনরুদ্ধার করতে কোনও সমস্যা হয়নি। আপনি সিস্টেমে যে প্যাকেজগুলি ইনস্টল করেছেন তার উপর নির্ভর করে ওয়াইএমএমভি
  • আমি উপরে বর্ণিত উত্তরটি সম্পাদনা করতে পারি না, তবে একটি টাইপো রয়েছে:
    cp /etc/resolv.conf /mnt/etc/resolv.cof
    হওয়া উচিত
    cp /etc/resolv.conf /mnt/etc/resolv.conf
  • /bootগ্রাব সরঞ্জাম ব্যবহার করে সহজেই পুনরুদ্ধার করা যায়। এখানে দেখুন ।
  • যেহেতু এই উত্তরটি বিশেষ পরামর্শ দেওয়া হচ্ছে, apt install --reinstall <package>একটি দুর্দান্ত উপায় অনুপস্থিত ফাইল পুনরুদ্ধার হয় /bin, /libএবং /lib64
    • কিছু প্যাকেজ পুনরায় ইনস্টলেশন প্রয়োজন: libaio1, mysql-server, openvpn,vsftpd

স্বরে নোট করুন: এর
rm -rf folder /*মতো নয়rm -rf folder/*

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