क्या रूट के बजाय बनाई गई फ़ाइलों के लिए मेरे उपयोगकर्ता नाम के रूप में सेट करने के लिए sudo को बताने का कोई तरीका है?


19

यदि मैं एक करता हूं sudo cp /etc/foo.txt ~/foo.txt, rootतो स्वामी के रूप में नई फ़ाइल बनाई जाती है ।

अभी, मुझे पिछले दो आदेशों का उपयोग करने के अलावा ( lsउपयोग-मामले को स्पष्ट करने के लिए) इसके अलावा कोई रास्ता नहीं दिखाई दे रहा है :

belmin@server1$ ls /etc/foo.txt
>  -rw------- 1 root root 3848 Mar  6 20:35 /etc/foo.txt
>
belmin@server1$ sudo cp /etc/foo.txt ~/foo.txt
belmin@server1$ sudo chown belmin: $_

मैं चाहूंगा की:

  1. एक sudoआज्ञा में कर रहा हूँ ।
  2. मेरे वर्तमान उपयोगकर्ता को निर्दिष्ट करने के लिए नहीं (शायद एक चर का उपयोग करते हुए?)।

sudo cat /etc/foo.txt > ~/foo.txt। फ़ाइलें एक कारण से केवल पठनीय होती हैं, इसलिए गैर-रूट उपयोगकर्ताओं द्वारा प्रतियों को पठनीय बनाते समय उस कारण को ध्यान में रखना याद रखें।
jw013

जवाबों:


32

installइसके बजाय का उपयोग करें cp:

sudo install -o belmin /etc/foo.txt ~/foo.txt

के बारे में पता नहीं था install। धन्यवाद।
बेलमिन फर्नांडीज

4
@BelminFernandez: अपनी दूसरी वरीयता को समायोजित करने के लिए:sudo install -o "$USER" /etc/foo.txt ~/foo.txt
अगली सूचना तक

14

एक साथ POSIX संगतcp आप कर सकते हैं sudo cp -p foo barकरने के लिए निम्न फ़ाइल मेटाडाटा को बनाए रखने की प्रतिलिपि बनाते:

  • पहूंच समय
  • संशोधन का समय
  • यूज़र आईडी
  • समूह आईडी
  • मोड

यदि आप एक अलग उपयोगकर्ता सेट करना चाहते हैं तो जेनीडी का समाधान सबसे अच्छा है।


2
यह तभी काम करता है जब मूल फ़ाइल लक्ष्य उपयोगकर्ता के स्वामित्व में हो।
जेनी डी

4
मुझे लगता है कि sudo चलाने वाले व्यक्ति की मूल फ़ाइल नहीं है, अन्यथा उन्हें sudo का उपयोग करने की आवश्यकता नहीं होती।
EightBitTony 13

@EightBitTony आपको sudoउस फ़ाइल को कॉपी करने की आवश्यकता नहीं है जो आपके पास नहीं है। आपको केवल पढ़ने की पहुंच की आवश्यकता है , आखिर।
l0b0

हां, मेरी ओर से गलत-सही - लेकिन मुझे लगता है कि प्रश्न में उपयोगकर्ता आईडी फ़ाइल को या तो नहीं पढ़ सकता है, क्योंकि उन्हें अभी भी sudo की आवश्यकता नहीं होगी। इसलिए हमें अंतिम फ़ाइल का मालिक उपयोगकर्ता आईडी मान लेना चाहिए, जिसकी मूल फ़ाइल तक कोई पहुंच नहीं है। किसी भी तरह से, यह एक sudo 'समस्या' नहीं है। आपका उत्तर बताता है कि एक स्वामी को संरक्षित करना है जिसे हमें मान लेना है।
EightBitTony

2
यह सैद्धांतिक रूप से संभव है कि फ़ाइल लक्ष्य उपयोगकर्ता के स्वामित्व में है, लेकिन एक निर्देशिका में स्थित है, जिसमें लक्ष्य उपयोगकर्ता को प्रवेश करने की अनुमति नहीं है। लेकिन यह बहुत संभव नहीं है :-)
जेनी डी

8

यदि तुम करो:

sudo cat /etc/foo.txt > ~/foo.txt

फिर ~/foo.txtखोल के रूप में आप के रूप में (ताकि अपनी साख के साथ बनाया गया है), और उसके बाद sudoउसके स्टडआउट के साथ निष्पादित किया जाएगा।

अंत में, फ़ाइल आपके स्वामित्व में होगी।

इस तरह का दृष्टिकोण इसके द्वारा की गई चीजों को सीमित करने में भी मदद करता है root। यहाँ, rootकेवल अपने विशेषाधिकार का उपयोग करता है खोलने के लिए /etc/foo.txt, यह वह चीज नहीं करता है जो संभावित रूप से हानिकारक है (लिखने के लिए एक फ़ाइल खोलें, ~/foo.txtउदाहरण के लिए एक सिमलिंक था तो इसके बुरे परिणाम हो सकते हैं )।


2
यह मानता है कि उपयोगकर्ता लक्ष्य निर्देशिका में लिख सकता है।
जोहान

3

उपयोग करके sudo, आप किसी अन्य उपयोगकर्ता पर स्विच करते हैं। यह कमांड का पूरा बिंदु है। मुझे लगता है कि आपके पास पहली फ़ाइल तक कोई नियमित पहुँच नहीं है, इसलिए आपको rootपहुँच प्राप्त करने के लिए एक अन्य उपयोगकर्ता ( इस मामले में) होने की आवश्यकता है।

sudoअपने आप को प्रबंधित करने का कोई तरीका नहीं है, चूंकि सभी sudoकर रहे हैं कमांड को निष्पादित करने के लिए आपको दूसरे उपयोगकर्ता पर स्विच कर रहा है।

तुम्हें यह करना पड़ेगा

  1. दो कमांड (या एक कंपाउंड कमांड) का उपयोग करते रहें
  2. कोई अन्य कमांड ढूंढें (जैसे कि इंस्टॉल करें, दूसरे उत्तर में देखा गया)
  3. या एक स्क्रिप्ट लिखें और उस स्क्रिप्ट को निष्पादित करें sudo

1

सूडो एक पर्यावरण चर बनाता है "SUDO_USER" जिसका उपयोग आप उस उपयोगकर्ता का पता लगाने के लिए कर सकते हैं जिसने लॉग इन किया था (वास्तव में जो सुडो भाग गया था)।

आपको सूडो को रूट करने के लिए (अन्य उपयोगकर्ताओं को भी एक्सेस करने के लिए सूडो का उपयोग करना संभव है) मानकर, आप निम्न दो चरणों को स्वचालित करने के लिए एक स्क्रिप्ट लिख सकते हैं।

cp source target
chown $SUDO_USER target

(यह तब काम नहीं करेगा जब आप एक गैर रूट उपयोगकर्ता को sudo करते हैं क्योंकि केवल रूट ही फाइलों को दे सकता है।)

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

cp /path/source/some*files /path/target/directory/

एक जटिल स्क्रिप्ट यह पता लगाने के लिए कि कौन सी फाइलें और क्या निर्देशिकाएं पारित की गई हैं, जो पहले से मौजूद थीं, जिन्हें वास्तव में ओवरराइट किया गया था, और केवल सफलतापूर्वक कॉपी की गई फ़ाइलों के स्वामित्व को बदलने के लिए लिखा जा सकता था।

यह काम पहले ही हो चुका है। आप उपयोग कर सकते हैं cpio- sudo to root करने के बाद, फ़ाइलों को कॉपी करने के लिए cpio का उपयोग करें। cpio को कॉपी करने के लिए फ़ाइलों की एक सूची की आवश्यकता होती है, इसलिए यह एक दो चरण की प्रक्रिया है। नीचे मैं lsकॉपी करने के लिए फ़ाइलों की सूची उत्पन्न करने के लिए उपयोग करता हूं ।

ls /path/source/some*files | cpio -pdm --owner $SUDO_USER /path/target/directory/

-pdmइसका मतलब है "पासथ्रू मोड, निर्देशिका रूप में की जरूरत बनाएँ, बनाए रखें फ़ाइल संशोधन समय"

--owner $SUDO_USER" निर्दिष्ट उपयोगकर्ता फ़ाइलों का मालिक है।

अंतिम ऑपरेंड निर्देशिका है जहाँ cpio को फ़ाइलों को संग्रहित करना चाहिए।

Cpio awesomeness के बारे में अधिक जानने के लिए, यहाँ CPIO मैनुअल पेज पर जाएँ

एकल सूडो कमांड में ऐसा करना भी संभव है। यह मानते हुए कि आपके उपयोगकर्ता के पास फ़ाइलों को एक्सेस करने के अधिकार हैं, केवल sudo को cpio भाग के लिए उपयोग करें, जैसे:

ls /path/source/some*files | cpio -pdm --owner $USER /path/target/directory/

उपरोक्त मामले में मैं $ SUDO_USER के स्थान पर US USER का उपयोग कर रहा हूं क्योंकि इसका मूल्यांकन सूडो के चलने से पहले किया जाता है। वैकल्पिक रूप से, यदि उपयोगकर्ता के पास फ़ाइलों को सूचीबद्ध करने के लिए पहुंच नहीं है, तो इसे एक आवरण स्क्रिप्ट में डालें और आवरण को चलाने के लिए sudo का उपयोग करें। यह कठिन हो सकता है, लेकिन सबसे सरल मामले में रैपर दो तर्क, एक स्रोत और एक लक्ष्य लेता है।

यह "cp_as_user" आवरण में जाता है:

ls $1 | cpio -pdm --owner $SUDO_USER $2

फिर इस तरह से रैपर का उपयोग करें:

sudo cp_as_user "/ path / to / some * files" / path / to / target / directory

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