कैसे एक chmod से पुनर्प्राप्त करने के लिए -R 000 / बिन?


36

और अब मैं इसे वापस करने में असमर्थ हूँ .. या अपने किसी अन्य सिस्टम प्रोग्राम का उपयोग कर सकता हूँ। सौभाग्य से यह एक वीएम पर है जिसके साथ मैं कर रहा हूं, लेकिन क्या इसे हल करने का कोई तरीका है? सिस्टम Ubuntu सर्वर 12.10 है।

मैंने पुनर्प्राप्ति मोड में पुनः आरंभ करने का प्रयास किया है, दुर्भाग्यवश अब मैं सिस्टम में बूट करने में असमर्थ हूं क्योंकि चलने के लिए init- बॉटम उपलब्धता के बाद कुछ प्रोग्राम को अनुमति नहीं देने के कारण सिस्टम केवल लटका हुआ है। यह वही है जो मैं देख रहा हूं:

Begin: Running /scripts/init-bottom ... done
[   37.062059] init: Failed to spawn friendly-recovery pre-start process: unable to execute: Permission denied
[   37.084744]  init: Failed to spawn friendly-recovery post-stop process: unable to execute: Permission denied
[   37.101333] init: plymouth main process (220) killed by ABRT signal

इसके बाद कंप्यूटर हैंग हो जाता है।


यह /binआप /binया दोनों में chmoded फ़ाइलें है ?
स्टीफन चेजलस

1
साथ आर विकल्प ... दोनों / bin निर्देशिका
जेट

टिनिकोर के साथ एक यूएसबी रखना बहुत अच्छा है। ऐसा होने पर उपयोगी।
गाथा

जवाबों:


28

एक और साफ ओएस बूट करें, फ़ाइल सिस्टम को माउंट करें और अनुमतियाँ ठीक करें।

जैसा कि आपका टूटा हुआ फ़ाइल सिस्टम VM में रहता है, आपके पास अपना होस्ट सिस्टम उपलब्ध होना चाहिए और काम करना चाहिए। अपने टूटे हुए फ़ाइल सिस्टम को वहां माउंट करें और इसे ठीक करें।

QEMU / KVM के मामले में आप उदाहरण के लिए nbd का उपयोग करके फ़ाइल सिस्टम को माउंट कर सकते हैं ।


मुझे लगता है कि यह शायद इसे ठीक करने के तरीके के रूप में सही है, हालांकि, मुझे सिस्टम को माउंट करने की कोशिश करने की ज़रूरत है- अभी मुझे छवि फ़ाइल से प्रिसिस्टम मिल रहा है- initrd.img memtest & abi के रूप में।
जेट

1
@ जेट, आपने /bootउस वीएम के विभाजन को माउंट किया । कोशिश करें और रूट फाइल सिस्टम का पता लगाएं। यदि LVM पर, इसे सक्रिय करने vgchange -ayके nbdलिए कनेक्ट करने के बाद चलाएँ ।
स्टीफन चेज़लस

1
@StephaneChazelas मुझे मिल गया है। आप दोनों को बहुत बहुत धन्यवाद- मुझे इस तरह की गलतियाँ बहुत पसंद हैं, एक टन सीखा है!
जेट '

खुशी है कि यह तय हो गया है। मुझे कुछ याद आ रहा है। अगर यह एक vm है, तो यह होस्ट सिस्टम के लिए सिर्फ एक बड़ी फ़ाइल है, है ना? आप मरम्मत करने के लिए इसके अंदर कुछ भी कैसे माउंट करते हैं? (मैं समझता हूं कि गैर-वीएम प्रणाली पर यह कैसे करना है।)
जो

68

यहां तक ​​कि root, आप उन फ़ाइलों को निष्पादित नहीं कर सकते जिनके पास कोई xअनुमति बिट सेट नहीं है। हालांकि आप इस ld.soपर कॉल कर सकते हैं (बशर्ते वे गतिशील रूप से जुड़े निष्पादन योग्य हों):

$ echo /lib/*/ld*.so
/lib/i386-linux-gnu/ld-2.27.so /lib/x86_64-linux-gnu/ld-2.27.so

chmodनिष्पादन योग्य की वास्तुकला से मेल खाने वाले का उपयोग करें । मेरे मामले में x86_64एक:

sudo /lib/x86_64-linux-gnu/ld-2.27.so /bin/chmod 755 /bin /bin/chmod

या में कुछ फोन /usr/binकरने के लिए या कहीं और chmodकी तरह perl:

sudo perl -e 'chmod 0755, "/bin", "/bin/chmod"

अनुमतियाँ पुनर्स्थापित करते समय सावधान रहें कि कुछ फ़ाइलों को /binपसंद है mountया su0755 के अलावा अन्य अनुमतियाँ हैं।

यदि आपने रिबूट किया है, हालांकि, आप उस बिंदु तक नहीं पहुंच सकते हैं जहां आप चला सकते हैं perlया ld.soयद्यपि। initramfsयद्यपि आप चीजों को ठीक कर सकते हैं (initramfs में पुनर्प्राप्ति शेल प्राप्त करने के लिए एक गलत रूट निर्देशिका पास करते हैं; रूट फाइल सिस्टम आरोहित होने के बाद initramfs के लिए आपको एक शेल प्रदान करने के लिए initramfs भी देखें break=bottomया break=initकर्नेल पैरामीटर देखें (केवल-पढ़ने के लिए) हालांकि))। या अपने वीएम को एक लाइव सीडी छवि से बूट करें, या मेजबान पर वीएम फ़ाइल सिस्टम को बढ़ाकर ठीक करें जैसा कि दूसरों ने सुझाव दिया है।

Initramfs तरीका ठीक करना:

में grub, संपादित बूट प्रविष्टि और हटाने root=से पैरामीटर linuxआदेश:

setparams 'Ubuntu, with Linux 3.2.0-27-generic'                          

recordfail                                                               
gfxmode $linux_gfx_mode                                                  
insmod gzio                                                              
insmod ext2                                                              
set root='(hd1)'                                                         
search --no-floppy --fs-uuid --set=root dc02b07c-88ef-4804-afe0-4f02db2\ 
94561                                                                    
linux /boot/vmlinuz-3.2.0-27-generic                                     
initrd /boot/initrd.img-3.2.0-27-generic                                 

Ctrl-Xबूट करने के लिए। उबंटू के initramfs को रूट फाइल सिस्टम नहीं मिलेगा इसलिए एक रिकवरी शुरू करें sh। फिर रूट फाइलसिस्टम को माउंट करें (मेरे मामले में /dev/vdb, अपनी मशीन के अनुकूल) और चीजों को ठीक करें:

Target filesystem doesn't have requested /sbin/init.
No init found. Try passing init= bootarg.


BusyBox v1.18.5 (Ubuntu 1:1.18.5-1ubuntu4) built-in shell (ash)
Enter 'help' for a list of built-in commands.

(initramfs) mkdir /x
(initramfs) mount /dev/vdb /x
[   48.430071] EXT3-fs (vdb): error: couldn't mount because of unsupported optio
nal features (240)
[   48.477406] EXT4-fs (vdb): recovery complete
[   48.477747] EXT4-fs (vdb): mounted filesystem with ordered data mode. Opts: (
null)
(initramfs) chmod -R 755 /x/bin
(initramfs) umount /x
(initramfs) reboot

एक बार बूट होने के बाद, उन फ़ाइलों की अनुमतियों को ठीक करें, जिनकी किसी अन्य प्रणाली के साथ तुलना करके 755 अनुमतियाँ नहीं हैं।

के pythonरूप में चलाकर ठीक करना init:

में grub, संपादित बूट प्रविष्टि, इस समय रखने के root=पैरामीटर, परिवर्तन roकरने के लिए rwऔर एक जोड़ने init=/usr/bin/python:

setparams 'Ubuntu, with Linux 3.2.0-27-generic'                          

recordfail                                                               
gfxmode $linux_gfx_mode                                                  
insmod gzio                                                              
insmod ext2                                                              
set root='(hd1)'                                                         
search --no-floppy --fs-uuid --set=root dc02b07c-88ef-4804-afe0-4f02db2\ 
94561                                                                    
linux /boot/vmlinuz-3.2.0-27-generic root=UUID=dc02b07c-88ef-4804-afe0-\
4f02db294561 rw init=/usr/bin/python
initrd /boot/initrd.img-3.2.0-27-generic                                 

फिर, अजगर प्रॉम्प्ट पर:

Begin: Running /scripts/init-bottom ... done.
Python 2.7.3 (default, Apr 20 2012, 22:39:59)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.chmod('/bin/sh',0755)
>>> os.chmod('/bin/chmod',0755)
>>> os.execl('/bin/sh','sh')
sh: 0: can't access tty; job control turned off
# chmod -R 0755 /bin
# mount -o remount,ro /
[  100.704720] EXT4-fs (vdb): re-mounted. Opts: errors=remount-ro
# exec /sbin/init

दोबारा बूट होने पर, उन फ़ाइलों की अनुमतियों को ठीक करें, जिनकी किसी अन्य प्रणाली के साथ तुलना करके 755 अनुमतियाँ नहीं हैं।


5
+1, एक और शानदार जवाब, स्टीफन। मैं जोड़ूंगा: already try to rebootमामले में: एक लाइव सीडी पर बूट, आरडब्ल्यू / बिन वाले विभाजन को माउंट करें, और chmod 755 /bin(और अगर वे बदल गए थे तो अंदर फाइलें)। लेकिन बाद में, जांचें कि सभी फाइलें सही अनुमति हैं (आपके लिनक्स डिस्ट्रिब के आधार पर, आप शायद मूल पैकेज के खिलाफ / बिन की जांच कर सकते हैं)
ओलिवियर दुलक

4
वाह। आपके ज्ञान की गहराई 8-10 है।
स्लम

मैं निष्पादित करने के लिए ld.so का उपयोग नहीं कर सकता। pb.abhijeetr.com/fRWf यहां क्या गलत हो रहा है?
अभिजीत रस्तोगी

@shadyabhi, आपके पास शायद एक मल्टीकार सिस्टम है और 64 बिट एक्जीक्यूटेबल पर 32bit ld.so का उपयोग करने की कोशिश कर रहा है। आपके पास एक और होना चाहिए ld.so, शायद कुछ निर्देशिका में जैसे /lib/x86_64-linux-gnu
स्टीफन चेज़लस

1
@Kwpolska, os.execlऔर execक्रियान्वित करने के लिए, वे एक प्रक्रिया बांट रहे हैं नहीं है, बस निष्पादन की जगह एक ही प्रक्रिया में इतना सब में पीआईडी 1. प्रक्रिया 1 से किया जाता है, शुरू में चलाता है python, तो sh, तो init
स्टीफन चेज़लस

8

अजगर का उपयोग करें :)

$ python
>>> import os
>>> os.chmod('/bin', 0755)

वह /binअपना काम करने के लिए कुछ भी नहीं चाहिए । जाहिर है, मैंने यह कोशिश नहीं की है ...


हम्म, मैंने हमेशा सोचा कि यह और अन्य स्क्रिप्टिंग भाषाएं सिर्फ चामोद कार्यक्रम को कहेंगी। जानकर बहुत अच्छा लगा!
जेट

1
नहीं, chmodएक सिस्टम कॉल है, जिसे chmodप्रोग्राम द्वारा बुलाया जाता है और chmodपायथन / पर्ल / रूबी आदि में फ़ंक्शन द्वारा भी chmodउपयोगिता कहा जाता है।
डेनिस करसेमेकर

2
सिवाय उन गोले के जो chmodबिल्टइन है। उस तरह की स्थिति जहां गोले sashउपयोगी होते हैं। यह सांख्यिकीय रूप से जुड़ा हुआ है और इसमें बिलिन की तरह अधिकांश रिकवरी कमांड हैं chmod(इसलिए किसी और चीज़ पर भरोसा नहीं करता है)। यह आम तौर पर बैठेगा, /sbinहालांकि यह सभी फ़ाइल सिस्टम पर अतिरिक्त प्रतियां होने से नुकसान नहीं पहुंचाएगा, और मेमॉकड के साथ संयोजन में उपयोग किया जा सकता है। zshऔर ksh93एक चामोड निर्मित है (हालांकि डिफ़ॉल्ट रूप से सक्षम नहीं है)।
स्टीफन चेजलस

1
@ डेनिस लेकिन अगर आप सिस्टम में बूट नहीं कर सकते हैं तो आप इसे कैसे चला सकते हैं? जैसा कि ओपी कहते हैं: «दुर्भाग्य से अब मैं सिस्टम में बूट करने में असमर्थ हूं»।
नादिर संपोली

@NadirSampaoli यह निश्चित रूप से उन चीजों में से एक है जिन्हें आपको रिबूट करने से पहले पकड़ना होगा। यह सफलतापूर्वक chmodding रूट के बाद और सिस्टम को बंद करने से पहले किया जा सकता है।
केन बेलोव्स

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