Linux में `fakeroot` कमांड की क्या आवश्यकता है


92

हमें fakerootकमांड की आवश्यकता क्यों है ? क्या हम केवल sudoया suआज्ञाओं का उपयोग नहीं कर सकते ?

आदमी पृष्ठ कहता है:

fakeroot - फ़ाइल हेरफेर के लिए एक वातावरण फ़ेकिंग रूट विशेषाधिकार में एक कमांड चलाते हैं

About.com कहता है:

नकली जड़ वातावरण देता है। इस पैकेज का उद्देश्य कुछ इस तरह से सक्षम करना है: dpkg-buildpackage -rfakerootअर्थात पैकेज बनाने के लिए रूट बनने की आवश्यकता को दूर करना। इस सेटिंग के द्वारा किया जाता है LD_PRELOADकरने के लिए libfakeroot.soहै, जो चारों ओर रैपर प्रदान करता है getuid, chown, chmod, mknod, stat, ..., जिससे एक नकली जड़ परिवेश का निर्माण। अगर आपको इसकी कोई समझ नहीं है, तो आपको इसकी आवश्यकता नहीं है fakeroot!

मेरा सवाल यह है कि यह एक विशेष उद्देश्य है जो एक सरल suया sudoनहीं हल करता है ? उदाहरण के लिए, उबंटू में सभी स्थापित पैकेजों को फिर से तैयार करने के लिए हम निम्नलिखित आदेश देते हैं:

$ fakeroot -u dpkg-repack `dpkg --get-selections | grep install | cut -f1`

क्या हम इस तरह fakeroot के बजाय sudo या su के साथ उपरोक्त कमांड कर सकते हैं:

$ sudo dpkg-repack `dpkg --get-selections | grep install | cut -f1`

संपादित करें:

चल रहा है:

$ sudo dpkg-repack `dpkg --get-selections | grep install | cut -f1`

मुझे यह त्रुटि देता है:

नियंत्रण निर्देशिका के पास खराब अनुमतियाँ 700 हैं (होनी चाहिए> = 0755 और <= 0775)

कोई भी कारण क्यों?


6
यह एक अच्छा विचार है, सुरक्षा कारणों से, सामान्य उपयोगकर्ता के रूप में किया जा सकता है जो सब कुछ करने से बचने के लिए, भले ही आप चला सकते हैं sudoया suक्योंकि यह आपकी मशीन है। fakerootइसके दो उपयोग हैं 1) यह विश्वास करने में कार्यक्रमों को बेवकूफ बनाता है कि आप वास्तव में रूट उपयोगकर्ता हैं, जिन्हें कुछ बुरी तरह से लिखे गए मालिकाना सॉफ़्टवेयर की आवश्यकता हो सकती है, भले ही ज़रूरत न हो (आमतौर पर विंडोज डेवलपर लिनक्स गया) और 2) यह फ़ाइल मोड और स्वामित्व परिवर्तनों का अनुकरण करने की अनुमति देता है जिसे आप ' टी अन्यथा करने में सक्षम हो, मुख्य रूप से tarसही अनुमति और स्वामित्व के साथ एक फ़ाइल बनाने के लिए, उदाहरण के लिए उपयोगी जब पैकेजिंग सॉफ्टवेयर।
pqnet

1
मुझे लगता है कि About.com के अंश में नोट इसे गाया गया है: यदि आपको इस बारे में कोई समझ नहीं है, तो आपको इसकी आवश्यकता नहीं है fakeroot! यदि आप ऐसी स्थिति के बारे में नहीं सोच सकते हैं जहां fakerootउपयोगी है, तो आपको इसकी आवश्यकता नहीं है। लेकिन जो लोग वास्तव में करते हैं, उन्हें उपयोग-मामले को पूरी तरह से समझने की आवश्यकता है।
क्रिस्टोफर शुल्त्स

जवाबों:


68

कल्पना करें कि आप एक दूरस्थ सर्वर पर काम करने वाले डेवलपर / पैकेज मेंटेनर आदि हैं। आप किसी पैकेज की सामग्री को अपडेट करना चाहते हैं और उसे फिर से बनाना, डाउनलोड करना चाहते हैं और कर्नेल से एक कर्नेल को अनुकूलित कर सकते हैं और इसका निर्माण कर सकते हैं, आदि। उन चीजों को करने की कोशिश करते समय, आपको पता चलेगा कि कुछ कदमों के लिए आपको rootअधिकार की आवश्यकता है ( UIDऔर GIDविभिन्न कारणों के लिए 0) (सुरक्षा, अनदेखी की अनुमति, आदि)। लेकिन rootअधिकार प्राप्त करना संभव नहीं है , क्योंकि आप एक रिमोट मशीन पर काम कर रहे हैं (और कई अन्य उपयोगकर्ताओं को आपके जैसी ही समस्या है)। यह वही है जो fakerootकरता है: यह पर्यावरण के लिए एक प्रभावी UIDऔर GID0 का दिखावा करता है जिसके लिए उन्हें आवश्यकता होती है।

व्यवहार में आपको कभी भी वास्तविक rootविशेषाधिकार नहीं मिलते (इसके विपरीत suऔर sudoजो आप उल्लेख करते हैं)।


इसलिए, मैं fakerootसिस्टम सेटिंग्स को बदलने के लिए उपयोग नहीं कर सकता हूँ ?? cuz कमांड जो हम चल रहे हैं वह सोचेंगे कि यह रूट के रूप में चल रहा है और हम जो चाहते हैं वह करते हैं। नहीं होगा?
मीडियम

3
@mrid ध्यान दें "व्यवहार में आपको वास्तविक रूट विशेषाधिकार कभी नहीं मिलते हैं"। तो
awser

52

स्पष्ट रूप से fakeroot और एक असली sudo / su के बीच अंतर देखने के लिए, बस करें:

$ fakeroot
# echo "Wow I have root access" > root.tst
# ls -l root.tst
-rw-rw-r-- 1 root root   23 Oct 25 12:13 root.tst
# ls -l /root
ls: cannot open directory /root: Permission denied
# exit
$ ls -l root.tst
-rw-rw-r-- 1 ubuntu ubuntu 23 Oct 25 12:13 root.tst

जब तक आप फ़ेकरूट खोल के भीतर हैं, ऐसा लगता है जैसे आप जड़ हैं - जब तक आप कुछ भी करने की कोशिश नहीं करते हैं जो वास्तव में रूट विशेषाधिकारों की आवश्यकता होती है। और यह वही है जो एक पैकेजिंग टूल को पैकेज बनाने की आवश्यकता होती है जो किसी भी मशीन पर समझ में आएगा।

वास्तव में, जब आप पैकेजिंग के लिए फ़ेकरूट का उपयोग करते हैं, तो आप जो कुछ हासिल करना चाहते हैं, वह आपकी फ़ाइलों को रूट के स्वामित्व के रूप में देखने के लिए आपके द्वारा चलाए जा रहे उपकरण बनाने के लिए है। न कुछ ज्यादा, न कुछ कम। तो वास्तव में, su या sudo सही फ़ाइल स्वामित्व प्राप्त करने के लिए काम नहीं करेगा।


क्या फेक खतरनाक नहीं है? यदि मैं suid bit और rx perm से फाइल बनाता हूं, तो फाइल रूट के स्वामित्व में, किसी के भी द्वारा, रूट के रूप में बनाई जाएगी! या शायद suid bit सेट करने से काम नहीं चलेगा?
फ्रेज़लाब

7
अच्छा नहीं। मैंने खुद यह कोशिश की। फ़ेकरूट का प्राथमिक कारण स्वामित्व जड़ प्राप्त करना है: वास्तव में जड़ के बिना निर्मित पैकेज में जड़। स्थापित पैकेजों में उचित परमिट होंगे, हालांकि।
हैन्ज़र

2
जब तक मैंने @ ntzrmtthihu777 की टिप्पणी पढ़ी तब तक यह सब बहुत उलझा हुआ था!
शाहबाज़

क्षमा करें, मैं विवरण नहीं समझता। उपकरण को पैच क्यों नहीं करें ताकि यदि आप जड़ नहीं हैं तो वे शिकायत नहीं करेंगे? संबंधित प्रश्न के रूप में: आखिरकार, आप फ़ाइलों को फ़ेकरूट के तहत बनाते हैं जो वास्तव में रूट के स्वामित्व में नहीं हैं । क्या इसका अर्थ यह नहीं होगा कि जब मैं ऐसी कोई .debफ़ाइल स्थापित करता हूँ , तो मेरी सभी /usrफ़ाइलें उपयोगकर्ता के पास होती हैं जिसे कोई भी कहता है fakeroot?
जोहान्स शहाब -

@ जोहान्सचैब-लिट, कोई बात नहीं। फ़ाइलें रूट के स्वामित्व में नहीं हैं, लेकिन एक fakerootशेल के अंदर , वे ऐसे दिखते हैं जैसे वे हैं। जब इस शेल के अंदर .deb पैकेज बनाया जाता है, तो फ़ाइल के मालिक को फाइल सिस्टम (जिसे fakerootइंटरसेप्ट और रिटर्न root) से पढ़ा जाता है और पैकेज में संग्रहीत किया जाता है। पैकेज स्थापित करते समय, dpkg को रूट एक्सेस की आवश्यकता होती है क्योंकि पैकेज इंगित करता है कि फ़ाइल को रूट के स्वामित्व में होना चाहिए।
शहबाज

45

चूंकि उत्तर समझना मुश्किल है (खुद के लिए) और इसे समझने के लिए कुछ सोच लिया ( इस टिप्पणी ने मुझे इसे समझा), मैं एक उम्मीद के साथ बेहतर स्पष्टीकरण देने जा रहा हूं।

1. फ़ेकरूट में क्या होता है

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

यदि आप इसके बारे में सोचते हैं, तो यह समय की कुल बर्बादी है। आप ऐसा सामान क्यों करेंगे जो वास्तव में नहीं होगा? यह पागल है। आप बस किसी भी तरह से नहीं कर सकते थे और इसमें कोई अंतर नहीं था, क्योंकि इसका कोई निशान नहीं है।

एक मिनट रुकिए...

2. फ़ेकरूट का निशान

वहाँ एक निशान छोड़ दिया जा सकता है fakeroot। चलो मोर्टेनसेल के उत्तर में आदेशों को देखते हैं जो बहुत अच्छा है और एक उत्थान के हकदार हैं:

$ fakeroot
# echo "Wow I have root access" > root.tst
# ls -l root.tst
-rw-rw-r-- 1 root root   23 Oct 25 12:13 root.tst
# ls -l /root
ls: cannot open directory /root: Permission denied
# exit
$ ls -l root.tst
-rw-rw-r-- 1 ubuntu ubuntu 23 Oct 25 12:13 root.tst

पहली नज़र में, ऐसा लगता है कि इस्तेमाल किया fakerootगया समय की कुल बर्बादी थी। अंत में, यदि आपने उपयोग नहीं किया होता fakeroot, तो आपको एक ही चीज़ मिलती।

यहाँ सूक्ष्म बात यह है:

$ cat root.tst
Wow I have root access

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

आइए एक और उदाहरण लेते हैं:

$ fakeroot
# touch x
# touch y
# chown myuser:myuser x
# ls -l > listing
# exit
$ ls -l
total 4
-rw-rw-r-- 1 myuser myuser 152 Jan  7 21:39 listing
-rw-rw-r-- 1 myuser myuser   0 Jan  7 21:39 x
-rw-rw-r-- 1 myuser myuser   0 Jan  7 21:39 y
$ cat listing
total 0
-rw-rw-r-- 1 root   root   0 Jan  7 21:39 listing
-rw-rw-r-- 1 myuser myuser 0 Jan  7 21:39 x
-rw-rw-r-- 1 root   root   0 Jan  7 21:39 y

देखते है क्या हुआ। मैंने होने का नाटक किया root, जो पूरी तरह से अप्रभावी है, और बनाया xऔर y। मैं xकरने के लिए myuserऔर yसे संबंधित होने का नाटक किया root। वे वास्तव में दोनों के हैं myuser(जैसा कि हम अंत में देख सकते हैं), लेकिन मैंने इसे ऐसा होने का नाटक किया।

फिर मैंने एक सूची बनाई और अपनी कल्पना को एक फ़ाइल में सहेजा। बाद में जब मैं फ़ाइल को देखता हूं, तो मैं देख सकता हूं कि मैंने कल्पना की थी कि फाइलों का स्वामित्व किसके पास होना चाहिए। फिर, वे वास्तव में उन लोगों के स्वामित्व में नहीं होते हैं जिनकी मैंने कल्पना की थी, मैंने बस कल्पना की थी।

3. तो: आप फिर से ऐसा क्यों चाहते हैं?

आप कह सकते हैं कि मुझे उस सूची को बनाने के लिए वास्तव में नकली होने की आवश्यकता नहीं थी। मैं बस लिस्टिंग बना सकता था, फिर अपनी कल्पना को प्रतिबिंबित करने के लिए इसे संपादित किया। आप सही हैं, आपको इसके fakerootलिए जरूरत नहीं थी । वास्तव में, यह जानते हुए कि fakerootवास्तव में कुछ भी नहीं होता है, आप संभवतः किसी भी क्षमता को प्राप्त नहीं कर सकते हैं जो आपके पास पहले नहीं थी।

लेकिन , और यह वही है जो fakerootसभी के बारे में है, लिस्टिंग का संपादन nontrivial हो सकता है। जैसा कि यह एक पैकेज के साथ है जो आपके सिस्टम पर स्थापित किया जा सकता है, आपके पास एक tarएड, gzipएड, xzएड, bzip2एड या कोई अन्य प्रारूप है जो आपकी फ़ाइलों को एक साथ रख रहा है और उनकी अनुमतियों और मालिकों को याद कर रहा है। क्या आप आसानी से संपीड़ित फ़ाइल को संशोधित कर सकते हैं और फ़ाइल के स्वामित्व को संपादित कर सकते हैं? मैं तुम्हारे बारे में नहीं जानता, लेकिन मैं एक तरह से सोच भी नहीं सकता।

क्या कोई ऐसा उपकरण बनाया जा सकता है, जो एक बार सब कुछ संकुचित हो जाए, यह संपीड़ित फ़ाइल को संशोधित करता है और प्रोग्रामेटिक रूप से मालिकों और अनुमतियों को संपादित करता है? हाँ वहाँ हो सकता है। तो या तो आप संपीड़ित करने से पहले मालिकों को नकली बना सकते हैं, या उन्हें बाद में बदल सकते हैं। डेबियन लोगों ने फैसला किया कि पूर्व आसान है।

4. सिर्फ उपयोग क्यों नहीं sudo?

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

इसके अलावा, मान लें कि आपके पास रूट अनुमतियां हैं। और मान लें कि आप यह दिखावा करना चाहते हैं कि एक फ़ाइल को केवल रूट तक पढ़ना चाहिए। इसलिए sudo, आप वास्तव में फ़ाइल स्वामी और अनुमतियों को बदलते हैं root, आप रूट शेल से बाहर निकलते हैं और सब कुछ पैकेज करने का प्रयास करते हैं। आप विफल हो जाते हैं क्योंकि अब आपके पास रूट एक्सेस नहीं होने के कारण अब आप फ़ाइल को नहीं पढ़ सकते हैं। तो आपको sudoपैकेज को रूट के रूप में कंप्रेस और बनाना होगा। प्रभावी रूप से, आपको सब कुछ जड़ के रूप में करना होगा।

यह बैड टीएम है

एक पैकेट के रूप में, आपको रूट अनुमतियों की आवश्यकता नहीं है और आपको इसे प्राप्त नहीं करना चाहिए। जब आप एक पैकेज स्थापित करते हैं, तो आपको Aरूट के रूप में कुछ फ़ाइल ( ) स्थापित करने की आवश्यकता हो सकती है और यहीं आपको रूट अनुमतियों की आवश्यकता होती है। सभी fakerootको यह संभव करना है। यह Aअभिलेखागार के लिए मूल के रूप में पैकर सूची की अनुमति देता है , ताकि जब पैकेज उपयोगकर्ता द्वारा विघटित हो जाए, तो संग्रहकर्ता रूट अनुमति की मांग करता है और Aरूट के स्वामित्व के अनुसार बनाता है ।


5
उत्कृष्ट राइटअप, यह स्पष्ट करता है।
क्रिश्चियन लॉन्ग

1
So either you could fake the ownerships before compressing, or change them after. Debian people decided the former is easier.इससे मुझे मदद मिली क्योंकि मैं सोचता रहा कि 'इसके बाद इसे संशोधित क्यों नहीं किया?'
आआआआआआआ

1
धन्यवाद, इस भ्रम मैं था अप को साफ करता है @ मोर्टेन के जवाब को पढ़ने के बाद
litb - Johannes Schaub

33

AFAIK, fakeroot एक ऐसे वातावरण में एक कमांड चलाता है जिसमें फ़ाइल हेरफेर के लिए रूट विशेषाधिकार दिखाई देता है। यह उपयोगकर्ताओं को रूट अनुमतियाँ / स्वामित्व वाली फ़ाइलों के साथ अभिलेखागार (टार, अर, .deb आदि) बनाने की अनुमति देने के लिए उपयोगी है। फ़ेकरूट के बिना किसी को अभिलेखों की घटक फ़ाइलों को सही अनुमतियों और स्वामित्व के साथ बनाने के लिए रूट विशेषाधिकार की आवश्यकता होगी, और फिर उन्हें पैक करना होगा, या किसी को अभिलेखागार का उपयोग किए बिना सीधे अभिलेखागार का निर्माण करना होगा।

फ़ेकरूट फ़ाइल हेरफेर लाइब्रेरी फ़ंक्शंस (chmod (), स्टेट () इत्यादि) को बदलकर काम करता है जो वास्तविक लाइब्रेरी फ़ंक्शंस के प्रभाव का अनुकरण करते हैं, उपयोगकर्ता वास्तव में मूल था।

सारांश:

 fakeroot [-l|--lib library] [--faked faked-binary] [--] [command]  

यहां और देखें: फ़ेकरूट


@MaskTheSmokin: तो fakeroot आपको केवल फ़ाइल हेरफेर संचालन के लिए सुपर उपयोगकर्ता शक्ति प्रदान करता है, सही।
GKT

@ gkt.pro: मुझे लगता है, हाँ।

10
यह वास्तव में सुपर यूजर पावर नहीं देता है, यह केवल इसे फेक देता है - इसमें चलने वाले प्रोग्राम को लगता है कि इसमें रूट विशेषाधिकार हैं, जबकि यह वास्तव में अभी भी उपयोगकर्ता के सामान्य विशेषाधिकार का उपयोग करता है।
पाओलो एबरमन

2
the program running in it thinks it has root privilegesरूट विशेषाधिकारों वाले कार्यक्रम में क्या अंतर है ? अगर मैं एक rm -rf /और कार्यक्रम कर सकता हूं , तो यह सोचता है कि मेरे पास रूट विशेषाधिकार हैं ...
उपयोगकर्ता अज्ञात

10
@userunknown आप यह जांचने में सक्षम हो rmसकते हैं कि आपके पास पर्याप्त अनुमति है, लेकिन कर्नेल आपको ऐसा नहीं करने देगा; unlinkसिस्टम कॉल विफल हो जाएगा। यह अकेले आवेदन अनुमतियों को संभालने के लिए अप करने के लिए नहीं है, या आपको लगता है कि अनुमतियों की जाँच नहीं करता और जो कुछ भी आप इसके साथ चाहते हैं अपने खुद के आवेदन लिखने में सक्षम हो जाएगा
माइकल Mrozek

11

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

इसके बारे में सोचते हुए, एकमात्र जगह जिसे मैंने देखा है वह कुछ प्रकार के संग्रह के निर्माण के लिए थी: एम्बेडेड सिस्टम के रूटफ़्स, टारगेज़ अभिलेखागार, आरपीएम पैकेज, .deb पैकेज, आदि।


1
fakerootबग पैकेजिंग सॉफ्टवेयर के लिए एक वर्कअराउंड टूल है: इस तरह के पैकेज बनाने के लिए आपको रूट होने की कोई आवश्यकता नहीं है, लेकिन चूंकि वे आपको फ़ाइल सिस्टम में सीधे सेट करने से पहले किसी अन्य तरीके से फ़ाइल अनुमति निर्दिष्ट करने की अनुमति नहीं देते हैं, जिसके लिए आपके पास कोई नहीं है पसंद
pqnet

3

एक सामान्य उपयोग यह पता लगाना है कि वास्तव में एक असफल बाइनरी क्या फाइलें एक्सेस करना चाहती हैं। यही है, हार्ड कोडित रास्तों और अनुचित अपवाद हैंडलिंग के कारण बग के बारे में पता लगाना और ठीक करना या काम करना।


1

आप वास्तव में रूट विशेषाधिकार होने के बिना फ़ेकरूट का उपयोग कर सकते हैं। यदि आपके पास suऔर / या sudoआप एक सरल के साथ अपने सिस्टम को नष्ट करने में सक्षम होंगे rm -rf /, लेकिन सबसे अधिक fakeroot के साथ आप अपने होम डायरेक्टरी को हटा देंगे।


2
इसके लिए आवश्यकता की व्याख्या नहीं है fakeroot। आप अपने घर की निर्देशिका को स्वयं के रूप में निकाल सकते हैं।
JMCF125

1

सरल उत्तर:

su और sudo कमांड को रूट के रूप में चलाते हैं। फ़ेकरूट आंशिक सैंडबॉक्स व्यवस्था के बाहर नहीं है।

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