मैंने हटा दिया / बिन / आरएम। मैं इसे कैसे ठीक करूं?


168

बस मज़े के लिए, मुझे लगा कि मैं रास्पबेरी चल रहे अपने रास्पबेरी पाई पर इस आदेश का उपयोग करूंगा:

sudo rm -f /bin/rm

मुझे लगा कि मैं बस पुनः स्थापित कर सकता हूं coreutils: मैं गलत था!

apt-get install --reinstall coreutilsdpkgयह कहते हुए कि इससे पैकेज नहीं निकाला जा सकता, एक त्रुटि देता है । स्रोत से संकलन काम नहीं करता क्योंकि Makefileउपयोग करता है rm

मैं rmवापस काम कैसे कर सकता हूं ?


9
हर .deb मूल रूप से एक संग्रह है जिसे आप अनपैक कर सकते हैं और बस rm निष्पादन योग्य / बिन में कॉपी कर सकते हैं।
schaiba

1
यह ओएस क्या है? लिनक्स? यूनिक्स? कुछ और? अगर लिनक्स, कौन सा डिस्ट्रो? 64 बिट? 32?
terdon

12
ln -s /usr/lib/initramfs-tools/bin/busybox /bin/rm(या /bin/busybox, या एक initrd से इसे निकालें)
स्टीफन चेज़लस

10
रास्पबेरी पाई में एक एसडी मेमोरी कार्ड पर अपना ओएस है ताकि आप सिर्फ दूसरी मशीन पर पैकेज से आरएम बाइनरी निकाल सकें और इसे कार्ड पर वापस कॉपी कर सकें। किसी भी मामले में, प्रफुल्लित करने वाला स्टंट आपने वहाँ खींच लिया और सार्वजनिक रूप से इसे स्वीकार करने के लिए आप बहुत बोल्ड :)
क्रिश्चियन

15
@ user645715 37 लोगों ने इस सवाल को मनोरंजक पाया।
ब्रिलिएंड

जवाबों:


194
sudo touch /bin/rm && sudo chmod +x /bin/rm
apt-get download coreutils
sudo dpkg --unpack coreutils*

और फिर कभी नहीं।


आपने सूद के साथ सूद का उपयोग क्यों नहीं किया?

क्योंकि downloadकमांड को इसकी आवश्यकता नहीं है:

download
डाउनलोड दिए गए बाइनरी पैकेज को वर्तमान निर्देशिका में डाउनलोड करेगा

इसलिए, जब तक आप कुछ निर्देशिका में नहीं हैं, जिसे आप नहीं लिख सकते, आपको उपयोग करने की आवश्यकता नहीं है sudo, और यह बाद में समस्याग्रस्त हो सकता है क्योंकि आपको rootपैकेज को हटाने / स्थानांतरित करने के लिए अनुमतियों की आवश्यकता होगी ।


3
apt-get को
सुडो के

31
@Avippler नहीं, इस मामले में नहीं।
ब्रिअम

5
ध्यान दें कि एक खाली निष्पादन योग्य फ़ाइल को शेल स्क्रिप्ट के रूप में निष्पादित किया जाता है जो कुछ भी नहीं करता है। तो इसका मतलब है कि आह्वान करना /bin/sh। एक काम करना sudo ln -s true /bin/rmया उससे भी बेहतर करना सरल होता । sudo ln -s busybox /bin/rmrm
स्टीफन चेज़लस

1
apt-getअगर आपने कोरुटिल डाउनलोड नहीं किया है तो आपको sudo की ज़रूरत है क्योंकि अन्यथा यह लिखने में सक्षम नहीं होगा /varकि डेबियन डाउनलोड की गई फ़ाइलों को कहाँ बचाता है।
क्रिस्टोफर इव्स

3
@KristopherIves गलत ... apt-getपैकेज को वर्तमान निर्देशिका में हमेशा डाउनलोड करता है (हाँ, भले ही आपने उपयोग किया हो sudo), इसलिए जब तक आप एक निर्देशिका में नहीं होते हैं तब तक आप अपने उपयोगकर्ता के रूप में नहीं लिख सकते हैं जिसकी आपको आवश्यकता नहीं है sudo। कृपया मैन पेज चेक करें।
ब्रिअम

106

debianऔर इसका डेरिवेटिव (और शायद सबसे अधिक वितरण) के साथ आते हैं busyboxजिसका उपयोग किया जाता है initramfs

busybox एकल निष्पादन योग्य में अधिकांश मुख्य कमांड लाइन उपयोगिताओं को बंडल करता है।

आप अस्थायी रूप से सिमलिंक कर सकते हैं /bin/rmकरने के लिए /bin/busybox:

ln -s busybox /bin/rm

एक काम पाने के लिए rm(जिसके बाद आप अपना काम कर सकते हैं apt-get install --reinstall coreutils)।

उसी पद्धति का उपयोग अन्य सभी उपयोगिताओं के लिए किया जा सकता है, जिसमें busyboxशामिल हैं। वह सूची एक परिनियोजन से दूसरे में भिन्न होती है। आप के साथ सूची प्राप्त कर सकते हैं busybox --list

ध्यान दें कि वे संबंधित उपयोगिताओं के सीमित संस्करण हैं। वे कभी-कभी GNU एक्सटेंशन का समर्थन करते हैं, लेकिन आम तौर पर नहीं और उनमें से कुछ भी सभी मानक / POSIX सुविधाओं का समर्थन नहीं करेंगे (कुछ सुविधाओं को संकलन समय पर सक्षम / अक्षम किया जा सकता है)।

वैकल्पिक रूप से, आप zshबिल्ट आरएम का उपयोग कर सकते हैं :

#! /bin/zsh
zmodload zsh/files
rm "$@"

zsh/filesमॉड्यूल के लिए कुछ अतिरिक्त अंतर्निहित आदेशों के साथ प्रदान करता है ( rm, mv, ln, mkdir, rmdir, chown, chmod, sync)। यह इस तरह की स्थिति में उपयोगी है या जब आप अधिक प्रक्रियाओं को कांटा नहीं कर सकते हैं, लेकिन एक इंटरैक्टिव zshचल रहा है।

ksh93भी अतिरिक्त / वैकल्पिक आदेशों buitin की एक संख्या है, लेकिन नहीं rmउन के बीच में ( basename, chmod, dirname, getconf, head, mkdir, logname, cat, cmp, cut, uname, wc, sync)। आप उन्हें इसके साथ आमंत्रित कर सकते हैं:

command /opt/ast/bin/the-command

एक ksh93स्क्रिप्ट में।


5
बहुत बढ़िया जवाब। मुझे आश्चर्य होता है कि क्या ओपी को वास्तव में असली को फिर से स्थापित करने की आवश्यकता है rm। ;-)
जॉयवेटफील्ड

वास्तव में। वास्तव में, यह मुझे कोरुटिल्स को हटाने के बारे में भी सोचता है ... :-)
डेमनोन

4
@Damon: coreutils व्यस्त बॉक्स की तुलना में बुनियादी कमांड का एक विस्तारित संस्करण प्रदान करते हैं, इसलिए व्यस्त समय SUSv3 आवश्यकताओं से मेल खाने के लिए पर्याप्त हो सकता है, कोरुटिल्स अधिक विशिष्ट हैं; उदाहरण के लिए बिजीबॉक्स में i18n सपोर्ट सीमित है।
लियोरी

2
@ लियोरी: मैं आधा मजाक कर रहा था, हालांकि 10-15 साल पहले, मैंने वास्तव में इसे उस स्थिति में किया होगा ( विशेष रूप से i18n में जोड़ा गया "फीचर", मेरी राय में एक फायदा नहीं है - अनजाने में किए गए अनुवाद, और स्विचेस का उपयोग करना सीखें जो अप्रत्याशित रूप से किसी अन्य कंप्यूटर पर स्क्रिप्ट्स को तोड़ता है, कोई धन्यवाद नहीं)। हालाँकि, आजकल, मैं खुश हूँ अगर मेरे बिना कुछ भी छूने के बिना केवल एक लिनक्स सिस्टम सुचारू रूप से चलता है, और सिस्टम / कॉन्फिगर फाइल / बायनेरिज़ को स्थानांतरित / डिलीट किए बिना। जो दुख की बात है, अभी भी अक्सर ऐसा नहीं होता है, इसलिए मैं निश्चित रूप से कुछ ऐसा काम नहीं कर रहा हूं जो काम करता है :-)
डेमनोन

29

मामले में apt-getया बिना किसी पुनर्स्थापना के dpkgजरूरत नहीं है, तो आप के साथ अनुकरण कर सकते हैं :rmrmrmperl

cat > /bin/rm << "EOF"
#!/usr/bin/perl
foreach (@ARGV) { unlink $_ or warn "$@:$!"; }
EOF
chmod +x /bin/rm

3
ध्यान दें कि यह संभाल नहीं है -r, और तथ्य यह है कि यह एक सही निकास स्थिति नहीं लौटाता समस्याओं का कारण हो सकता है।
स्टीफन चेजालस

6
@StephaneChazelas यह apt-get install --reinstall coreutilsओपी को सामान्य करने की अनुमति देने और प्राप्त करने के लिए पर्याप्त है ।
terdon

इसलिए मैंने "केस में" लिखा। पैकेज कोरुटिल की कोई स्क्रिप्ट नहीं है। आम तौर पर पूर्व और बाद की स्थापित स्क्रिप्ट त्रुटियों पर विफल होती हैं यदि फाइलें मौजूद हैं या मौजूद नहीं हैं, उदाहरण के लिए यदि उन्हें हटाने की आवश्यकता है। और हाँ, यह सच है कि मैं पहले से ही पैकेज की जाँच करने के लिए बहुत आलसी था।

आप भी अनुकरण कर सकता है rmके साथ mv(करने के लिए 'कचरे के डिब्बे में')
sendmoreinfo

14

मैं rmकिसी अन्य मशीन से सही बाइनरी प्राप्त करने की कोशिश करूंगा , और फिर scpइसे कॉपी करने के लिए किसी चीज़ का उपयोग कर रहा हूं । यह पाठ्यक्रम केवल तभी काम करता है यदि scpपहले से स्थापित हो ...

यदि scpउपलब्ध नहीं है, तो ncभेजने के पक्ष में (उर्फ netcat) और /dev/tcp/HOST/PORTप्राप्त पक्ष पर पुनर्निर्देशन के साथ बैश भी काम कर सकता है।

यदि आपके पास एक और रास्पियन मशीन नहीं है, तो आप कोरुटिल्स पैकेज ( .debसही संस्करण के लिए प्राप्त कर सकते हैं) प्राप्त कर सकते हैं , और इसे dpkg-deb(डेबियन / उबंटू / मिंट / पर…

dpkg-deb --fsys-tarfile coreutils*.deb | tar xf - ./bin/rm

यदि आपके पास dpkg के साथ कोई अन्य मशीन नहीं है, तो आप फ़ाइल को ar(binutils विकास उपकरण से) और टार के साथ निकाल सकते हैं :

ar p coreutils*.deb data.tar.gz  | tar xzf - ./bin/rm

8
यदि scpउपलब्ध नहीं है, तो भेजने पर nc(उर्फ netcat) और प्राप्त पक्ष पर पुनर्निर्देशन के bashसाथ /dev/tcp/HOST/PORTही काम कर सकता है।
MvG

13

चूंकि यह डेबियन (या ubuntu) है, वहाँ फ़ाइलों को प्राप्त करने का एक आसान तरीका है:

mkdir /tmp/coreutils
sudo dpkg-deb --extract /var/cache/apt/archives/coreutils_ [tab complete for correct version].deb /tmp/coreutils
sudo cp /tmp/coreutils/bin/rm /bin

क्योंकि इसे स्थापित करने की कोशिश करने से पहले apt-get ने coreutils.deb को डाउनलोड कर लिया था, और डेबियन-आधारित सिस्टम पर मौजूद होने के लिए dpkg-deb की गारंटी है।

सीधे / tmp को न निकालें, यह मूल निर्देशिका पर अनुमतियाँ बदलता है।

यदि आप चारों ओर खेलने जा रहे हैं, तो आप पैकेज व्यस्त-स्थैतिक को स्थापित करना चाह सकते हैं, जो सब कुछ तोड़ने पर भी काम करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.