माता-पिता के वातावरण को विरासत में दिए बिना एक कमांड चलाना


14

क्या कमांड चलाने का एक तरीका है "जैसे कि" यह एक नए लॉगिन सत्र में है?

मैंने पहले ही कोशिश की है env -i। हालाँकि, मैं विभिन्न ईएनवी चर के साथ सौदा नहीं करना चाहता, जिन्हें मुझे सेट या परेशान करना है।

मैंने भी कोशिश की है bash -c "some command"और bash -l -c "some commmand", लेकिन वे सभी वर्तमान वातावरण की नकल करते हैं।

निकटतम मैं आ गया है एक यहूदी बस्ती समाधान: ssh me@localhost "some command"


/bin/bash --loginउस व्यवहार को प्राप्त करने के लिए उपयोग करें । मैं एक उचित प्राप्त करने के लिए इसका उपयोग करता हूं $PATH
डैनियल बेक

इसके बराबर है /bin/bash --l, जो मैंने पहले ही कोशिश की थी। यह मूल वातावरण की नकल करता है। इसे आज़माएँ export SOME_VAL=something:। तब /bin/bash --login। तब env | grep SOME_VAL। मान होगा।
dgo.a

जवाबों:


12

यहाँ एक जवाब है कि sudo विशेषाधिकार या उपयोगकर्ता के पासवर्ड की आवश्यकता नहीं है, लेकिन फिर भी एक वातावरण प्रदान करता है जैसे कि आपको नए लॉगिन पर क्या मिलेगा।

env -i HOME="$HOME" bash -l -c 'your_command'

उदाहरण:

$ export ABC=123
$ env -i HOME="$HOME" bash -l -c 'env' | grep ABC
$ env HOME="$HOME" bash -l -c 'env' | grep ABC
ABC=123

स्पष्टीकरण के लिए इसे तोड़ना:

  1. env -i HOME="$HOME": पर्यावरण को साफ करता है। -iके साथ एक खाली वातावरण सेट करता है कोई चर । यह समस्याग्रस्त है क्योंकि इसका मतलब है कि यदि आप भोलेपन से चलाने की कोशिश करते हैं तो bash -lयह आपके .bash_profileआदि को लोड नहीं करेगा क्योंकि HOMEयह सेट नहीं है। इसे कम करने के लिए, हम स्पष्ट रूप से पास करते हैं HOME="$HOME", एक वातावरण बनाते हैं जहां HOME(और केवल HOME) सेट होता है।

  2. bash -l -c ...: लॉगिन शेल में वांछित कमांड चलाता है। आप इसके लिए एक लॉगिन शेल चाहते हैं क्योंकि हम एक स्वच्छ वातावरण से शुरू कर रहे हैं और सब कुछ पुनः लोड करने की आवश्यकता है।

विशेष रूप से:

  • इसके लिए sudo विशेषाधिकारों की आवश्यकता नहीं है ( sudoसंस्करण करता है)।
  • इसके लिए उपयोगकर्ता का पासवर्ड ( suसंस्करण करता है) टाइप करने की आवश्यकता नहीं है ।
  • इसके लिए SSH सर्वर को चलाने और पासवर्ड रहित कुंजी रखने की आवश्यकता नहीं होती है जिसका उपयोग मशीन में लॉग इन करने के लिए किया जा सकता है ( sshसंस्करण करता है)।

धन्यवाद, इलियट। यह इतना सरल और स्पष्ट दिखता है ... अब यह मेरे लिए इंगित किया गया है।
dgo.a

12
su -l $USER

sudo -u $USER -i

कुछ और भी अधिक आक्रामक प्रयास के लिए env -i bash, लेकिन यह $ HOME और $ TERM सहित सब कुछ अनिश्चित कर देता है


2
धन्यवाद! दूसरा कमांड मुझे वही देता है जो मैं चाहता हूं। मैंने 2 घंटे से अधिक समय तक खोज की और आपके उत्तर के करीब कुछ भी नहीं पाया। आपके उत्तर के आधार पर, मैं वापस गया man sudoऔर पाया: "यदि लक्षित उपयोगकर्ता चालान उपयोगकर्ता के समान है, तो किसी पासवर्ड की आवश्यकता नहीं है।" (ऐसा suलगता है कि हमेशा कोई पासवर्ड मांगता है।) मैं ऐसा मूर्ख हूं कि किसी manपृष्ठ के पहले पैराग्राफ में कुछ सरल को नजरअंदाज कर दिया है :( मैंने पहली बार में सूडो से परहेज किया क्योंकि मैंने माना कि यह हमेशा एक पासवर्ड के लिए कहा जाता है। धन्यवाद फिर से!
dgo.a

1
बस दूसरों के लिए एक संकेत ... यदि आपका लॉग इन $USERआपको रूट के रूप में और फिर sudo -u ...आपके उपयोगकर्ता के रूप में लॉग इन करना होगा । यदि आप बस sudo -uउपयोगकर्ता के रूप में करते हैं तो आपको विरासत में मिलेगा।
एडम जेंट

यह काम नहीं करता है, जाहिर है, अगर आपके पास sudoपहुंच नहीं है । क्या कोई वैकल्पिक विधि है जिसमें sudo की आवश्यकता नहीं है?
user5359531

@ user5359531: हाँ - su -l $USER
14:16 पर user1686

1
जो पासवर्ड मांगता है; मैं ssh कुंजी प्रमाणीकरण के माध्यम से लॉग इन हूं, इसलिए मुझे यह भी पता नहीं है कि पासवर्ड क्या है। और एक पासवर्ड प्रॉम्प्ट स्क्रिप्ट-क्षमता को मारने वाला है। अब तक इसका ssh $USER@localhost <command>
लुक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.