सोर्सिंग .bashrc के बाद ssh के साथ एक इंटरैक्टिव शेल में एक कमांड चलाएँ


11

मैं एक दूरस्थ उबंटू कंप्यूटर में सोर्स करना चाहता हूं, जो मेरा स्रोत है .bashrcऔर एक कमांड चलाता है जो उस द्वारा निर्धारित मापदंडों पर निर्भर करता है .bashrc। सभी एक इंटरैक्टिव शेल में जो कमांड किए जाने के बाद बंद नहीं होता है।

मैंने अब तक जो कोशिश की है

ssh user@remote_computer -t 'bash -l -c "my_alias;bash"'

या केवल

ssh user@remote_computer -t "my_alias;bash"

यह सामान्य आदेशों के लिए काम करता है ( lsउदाहरण के लिए) लेकिन जब मैं एक उर्फ ​​को चलाने की कोशिश करता हूं तो मुझे .bashrcएक त्रुटि मिलती है:

bash: my_alias: command not found

लेकिन तब जब मैं इसे फिर से लिखता हूं और इसे चलाता हूं, तो यह काम करता है!

तो मैं यह कैसे सुनिश्चित कर सकता हूं कि .bashrcकमांड को बुलाए जाने से पहले इसे खट्टा कर दिया जाए?


पद भ्रामक है। मैं सलाह देता हूं कि इस तरह से चल रहे कमांड का दुरुपयोग न करें; फिर भी अगर बैश या बैश कमांड मंगाया जा रहा है, तो मैं कहूंगा। जाहिर है कि इस तरह के आदेश को चलाने के लिए कुछ मतभेद या ख़ासियतें हैं, और अधिक गंभीर अनुप्रयोगों के लिए, मैं Ansible या कठपुतली की सिफारिश करूंगा।
रुई एफ रिबेरो

मैंने अपना प्रश्न संपादित किया। दूसरा कमांड अधिक सरल है और वही करता है, लेकिन फिर भी बिना सोर्सिंग के ।bashrc से पहले।
मेहदी

@RuiFRibeiro गाली ?? आप इस तरह की साधारण बात को कैसे दुरुपयोग कह सकते हैं ?? स्वचालित रूप से ssh के साथ रिमोट मशीन में लॉग इन करने के बाद कमांड चलाना, यह उतना ही सरल है। कोई भी बाहरी उपकरण जो इस तरह के एक छोटे से काम के लिए तैनात किया जाएगा, वह एक ओवरकिल होगा
मेहदी

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

जवाबों:


9

समस्या यह है कि आप एक गैर-इंटरैक्टिव शेल में एक उपनाम चलाने की कोशिश कर रहे हैं। जब आप दौड़ते हैं ssh user@computer command, commandतो गैर-अंतःक्रियात्मक रूप से चलाया जाता है।

गैर-संवादात्मक गोले एलियंस (मैन बैश से) को नहीं पढ़ते हैं:

जब शेल इंटरएक्टिव नहीं होता है, तब तक एलियासेस का विस्तार नहीं किया जाता है, जब तक कि एक्सप्लोसिअलीस शेल विकल्प शॉप्ट का उपयोग करके सेट नहीं किया जाता है (नीचे शेल बिल्डिन के तहत शॉप का वर्णन देखें)।

यह काम करता है अगर आप इसे फिर से मैन्युअल रूप से चलाते हैं क्योंकि अंतिम bashकमांड एक इंटरैक्टिव शेल शुरू करता है तो आपके उपनाम अब उपलब्ध हैं।

एक विकल्प के रूप में, आप अपने उपनाम को चलाने के लिए रिमोट मशीन पर bash -iएक साधारण लॉगिन शेल ( bash -l) के बजाय एक इंटरैक्टिव शेल ( ) लॉन्च कर सकते हैं :

ssh user@remote_computer -t 'bash -ic "my_alias;bash"'

हालांकि यह एक बहुत ही जटिल दृष्टिकोण है। आपने यह नहीं बताया कि आपको वास्तव में ऐसा करने की आवश्यकता क्यों है लेकिन इन विकल्पों पर विचार करें:

  1. बस रिमोट मशीन पर एक सामान्य लॉगिन इंटरैक्टिव शेल शुरू करें और मैन्युअल रूप से कमांड चलाएं:

    user@local $ ssh user@remote
    user@remote $ my_alias
    
  2. यदि आप हमेशा चाहते हैं कि जब आप इस कंप्यूटर से कनेक्ट होते हैं तो उर्फ ​​चलाया जाता है , तो दूरस्थ कंप्यूटर के ~/.profile(या ~/.bash_profile, यदि वर्तमान में) को संपादित करें और इस पंक्ति को अंत में जोड़ें:

    my_alias

    क्योंकि ~/.profileपढ़ा जाता है कि हर बार एक लॉगिन शेल शुरू होता है (इसलिए, हर बार जब आप कनेक्ट होते हैं ssh, उदाहरण के लिए), my_aliasतो आपके द्वारा कनेक्ट किए गए प्रत्येक को चलाने का कारण होगा ।

    ध्यान दें कि डिफ़ॉल्ट रूप से, लॉगिन गोले पढ़ें ~/.profileया ~/.bash_profileअनदेखा करें ~/.bashrc। कुछ वितरण (डेबियन और उसके डेरिवेटिव और आर्क, उदाहरण के लिए) जैसे कि उबंटू में वितरण का अपना डिफ़ॉल्ट ~/.profileया ~/.bash_profileफ़ाइल स्रोत है ~/.bashrcजिसका अर्थ है कि आपके द्वारा परिभाषित उपनाम ~/.bashrcभी एक लॉगिन शेल में उपलब्ध होंगे। यह सभी वितरणों के लिए सही नहीं है, इसलिए आपको ~/.profileइसे स्रोत के लिए मैन्युअल रूप से संपादित करना पड़ सकता है ~/.bashrc। यह भी ध्यान दें कि यदि ~/.bash_profileमौजूद है, तो ~/.profileबैश द्वारा नजरअंदाज कर दिया जाएगा।


तो क्या आप सुझाव देंगे कि उपनाम एक alias_profile में परिभाषित करें और उन्हें .profile या .bash_profile से कॉल करें?
मेहंदी

@ मेही जो आप करना चाहते हैं उस पर निर्भर करेगा। आपके उबंटू प्रणाली पर, ~/.basyrcस्वचालित रूप से पढ़ा जाता है ~./profile, इसलिए इसमें परिभाषित कोई भी उपनाम ~/.bashrcकिसी भी गोले को पढ़ने के लिए उपलब्ध होगा ~/.profile। यह काम करने के लिए आपको वास्तव में करने की आवश्यकता है ताकि स्पष्ट रूप से एक इंटरैक्टिव शेल ( -i) शुरू हो सके ।
terdon

5

मुझे अपने .bashrc के एक हिस्से पर टिप्पणी करनी पड़ी जो उपनामों को इस्तेमाल होने से रोकती है और एक विस्तार_लेख जोड़ें। इस पर टिप्पणी की गई

# If not running interactively, don't do anything
#case $- in
#    *i*) ;;
#      *) return;;
#esac

और यह जोड़ा गया

if [ -z "$PS1" ]; then
  shopt -s expand_aliases
fi

तब मेरी आज्ञा ने काम किया:

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