किसी अन्य उपयोगकर्ता को Bash में फ़ंक्शन दें?


11

क्या कोई तरीका है कि मैं एक उपयोगकर्ता से दूसरे उपयोगकर्ता को एक फ़ंक्शन पास कर सकता हूं?

उदाहरण के लिए, मेरे पास एक छोटी बैश स्क्रिप्ट है जिसे मैं रूट के रूप में निष्पादित करता हूं:

#!/bin/bash
user_func(){
  whoami
  exit
}
su vagrant -c 'user_func'

हालाँकि, User_func फ़ंक्शन वैग्रंट उपयोगकर्ता के लिए परिभाषित नहीं है, केवल रूट के लिए, और निष्पादित नहीं किया जा सकता है।

मेरा दूसरा विकल्प कई लाइनों का होना होगा

su vagrant -c 'cmd1' 
su vagrant -c 'cmd2'
, etc 

या, कई आदेशों को निष्पादित करें पूर्व:, su vagrant -c 'cmd1; cmd2; cmd3;'लेकिन मैं अतिरिक्त नहीं करना पसंद करूंगा, खासकर जब वैग्रंट उपयोगकर्ता के रूप में 5 से अधिक कमांड निष्पादित करने का प्रयास किया जाता है।

क्या एक ही स्क्रिप्ट के भीतर से किसी अन्य उपयोगकर्ता के लिए एक फ़ंक्शन पारित करना संभव है (उदाहरण के लिए डिस्क पर एक स्क्रिप्ट को एक अलग उपयोगकर्ता के रूप में बनाना और फिर उस उत्पन्न स्क्रिप्ट को निष्पादित करना संभव नहीं है)? या फिर कोई और विकल्प है कि मैं देख रहा हूँ?

जवाबों:


10

लगता है जैसे आपको exportउस फ़ंक्शन की परिभाषा पहले चाहिए:

#!/bin/bash
user_func (){
  whoami
  exit
}
export -f user_func
su vagrant -c 'user_func'

चाल चलनी चाहिए।

-fबताता है exportकि यह एक चर नाम एक समारोह नाम के बजाय है। से उद्धृत help export:

बाद में निष्पादित आदेशों के पर्यावरण के लिए स्वचालित निर्यात के लिए प्रत्येक NAME को चिह्नित करता है। ....

विकल्प:

 -f   refer to shell functions

जैसा कि टिप्पणियों में पीटरफ और स्टीफन ने कहा है, यह दो बातों को मानता है:

  1. कि आपका suकमांड उपयोगकर्ता के वातावरण को अधिलेखित नहीं करेगा
  2. यह vagrantलॉगिन शेल है bash। यदि नहीं, तो आप suस्टीफन द्वारा दी गई वैकल्पिक कमांड लाइन का उपयोग कर सकते हैं :

    su vagrant -c 'bash -c user_func'

यह वास्तव में वैसा ही है जैसा मैं उम्मीद कर रहा था। मुझे नहीं पता था कि आप फ़ंक्शन को निर्यात कर पाएंगे। यह उसी तरह काम करता है जैसे मैं उम्मीद कर रहा था कि यह नमूना स्क्रिप्ट को संपादित करने के बाद होगा। धन्यवाद!
गिडिकमैन

1
अच्छा है, लेकिन उन मामलों में काम नहीं करेगा जहां suपर्यावरण को ओवरराइड करता है।
पेट्रफ

1
ध्यान दें कि यह केवल तभी काम करता है जब लॉगिन शैल vagrantहै bash। यदि नहीं, तोsu vagrant -c 'bash -c user_func'
स्टीफन चेज़लस

6

यह थोडा हैकिश है, लेकिन आप सोम्मैंड के अंदर फंक्शन की परिभाषा को पास suकर सकते हैं और फिर आप इसका इस्तेमाल कर सकते हैं।

$ function foo { do_some_stuff_here; }
$ su test -c "$(typeset -f foo); foo"

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


+1 वास्तव में नीरस चाल! हालांकि एक सवाल है कि क्या suशेल के वातावरण को बाहरी कारकों द्वारा अधिलेखित किया जा सकता है? मेरा मतलब है, इस मामले में suकमांड लाइन पर आपका पूरा नियंत्रण है क्योंकि यह एक स्क्रिप्ट में है। इसके नए शेल का वातावरण कैसे लिखा जा सकता है?
जोसेफ आर।

उदाहरण के लिए खोल द्वारा खोल दिया गया suहो सकता है कि पर्यावरण का कुछ आरंभ हो। suखुद भी सुरक्षा को थोड़ा सख्त करने के लिए फोन करने वाले के कुछ वातावरण को छीन सकता है (हालांकि यह आमतौर पर अधिक शक्तिशाली विकल्पों द्वारा किया जाता है sudo)।
पेट्रफ

0

यह आपके पास एक स्क्रिप्ट नहीं है, यह एक फ़ंक्शन है। ऐसा लगता है जैसे आप एक स्क्रिप्ट चाहते हैं । या तो में एक उचित स्क्रिप्ट बनाने के लिए और कहते हैं, के रूप में अपनी आवश्यकताओं की आवश्यकता होती है, /usr/local/binया में /home/vagrant/bin, और की तुलना में आप जैसे में सक्षम होना चाहिएsu vagrant -c '/home/vagrant/bin/myscript.sh'


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

0

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

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