सोर्सिंग के बिना SSH ।bashrc
.bashrcSSH के सर्वर पर दूरस्थ रूप से लॉग इन करते समय मैं अपनी फ़ाइल के साथ प्रयोग कर रहा था । मैंने अनजाने exitमें वहाँ छोड़ दिया जिससे सभी बाद के लॉगिन तुरंत डिस्कनेक्ट हो गए। मुझे प्रभावी रूप से बंद कर दिया गया था। मैं रूट विशेषाधिकारों वाले किसी व्यक्ति के हस्तक्षेप से पहुंच को पुनर्प्राप्त करने में सक्षम था, लेकिन क्या यह किसी और की मदद के बिना संभव होगा?
मैंने दौड़ने ssh <server> 'bash --norc --noprofile'और जैसे सामान करने की कोशिश की ssh <server> 'mv .bashrc bashrc-backup', और यहां तक कि जबरन इसे लिखने की कोशिश की scp empty-file <server>:.bashrc। हालांकि, ये सभी विकल्प .bashrcकमांड चलाने से पहले पहले टूटे हुए सोर्सिंग पर भरोसा करते हैं , इसलिए उनमें से किसी ने भी काम नहीं किया।
यह अच्छी तरह से हो सकता है कि इस तरह की स्थिति से बाहर निकलने का कोई रास्ता नहीं है। लेकिन यह है कि डिजाइन के द्वारा? क्या कोई कारण है कि सिस्टम को बंद करना आसान है, जैसे कि बस चलाना ssh <server> 'echo exit > .bashrc'? क्या इस तरह की गलती को कम करने के तरीके हैं?
जवाब
जैसा कि अन्य उत्तर में चर्चा की गई है, जब SSH क्लाइंट OpenSSH सर्वर से जुड़ता है, OpenSSH सर्वर आमतौर पर उपयोगकर्ता के लॉगिन शेल का उपयोग करके क्लाइंट की ओर से एक शेल सत्र शुरू करेगा:
- यदि ग्राहक एक इंटरैक्टिव सत्र का अनुरोध करता है, तो सर्वर उपयोगकर्ता के लॉगिन शेल को लॉन्च करेगा।
- यदि क्लाइंट कमांड चलाने का अनुरोध करता है, तो सर्वर कमांड को शेल कमांड के रूप में चलाने के लिए उपयोगकर्ता के लॉगिन शेल का उपयोग करेगा।
- उपयोगिताओं जैसे
scp,rsyncऔरgitजो परिवहन के लिए ssh का उपयोग करते हैं, रिमोट सिस्टम पर चलाने के लिए एक कमांड का अनुरोध करेंगे, इसलिए वे # 2 के तहत आते हैं।
यदि आपके पास दूरस्थ उपयोगकर्ता के शेल स्टार्टअप फ़ाइलों में कुछ है जो शेल को बाहर निकलने का कारण बनता है, तो आपको अंदर जाने में परेशानी होगी।
SFTP एक विशेष मामला है। OpenSSH सर्वर को एक बाहरी कमांड लॉन्च किए बिना SFTP का समर्थन करने के लिए कॉन्फ़िगर किया जा सकता है। यदि ऐसा है, तो आप सर्वर से कनेक्ट करने और .bashrcफ़ाइल को हटाने, नाम बदलने या बदलने के लिए sftp का उपयोग करने में सक्षम होंगे जो समस्या पैदा कर रहा है।
यह निर्भर करता है कि sftp को सपोर्ट करने के लिए सर्वर को कैसे कॉन्फ़िगर किया गया है। यह एक बाहरी कार्यक्रम (नाम sftp-server) लॉन्च करके sftp सत्र की सेवा कर सकता है । इस मामले में आपको उसी तरह की समस्या हो रही है जैसे आपके पास प्रोग्राम्स के साथ है scp। या, सर्वर "आंतरिक-sftp" के लिए संदर्भित कुछ द्वारा sftp सत्र की सेवा कर सकता है , जिसे किसी शेल को लागू करने की आवश्यकता नहीं है। यह सिर्फ इस बात पर निर्भर करता है कि विशेष रूप से SSH सर्वर कैसे कॉन्फ़िगर किया गया है।
ऐसा होने का कारण यह है, क्योंकि sshdसर्वर साइड घटक, आपके शेल का उपयोग करके प्रक्रियाओं को आमंत्रित करता है। यदि यह एक इंटरेक्टिव शेल को खोल रहा है, तो यह इसे लॉगिन शेल के रूप में बनाता है; अन्यथा, यह -cआपके द्वारा निर्दिष्ट आदेश को चलाने के लिए एक गैर-संवादात्मक शेल को स्पॉन करने के लिए तर्क का उपयोग करता है ।
आपके द्वारा निर्दिष्ट किए गए सभी ऑपरेशन (निर्दिष्ट कमांड और scp) गैर-संवादात्मक ऑपरेशन हैं, इसलिए आमतौर पर बैश लोड नहीं होगा .bashrc, लेकिन बैश को विशेष-आवरण के लिए किया जाता है जब sshdइसे लागू किया जाता है ताकि यह वैसे भी इसे लागू करे । यदि आप zsh का उपयोग कर रहे थे, तो .zshenv(जो सभी गोले के लिए मंगवाया गया है) लोड किया जाएगा, लेकिन .zshrc(जो केवल संवादात्मक गोले के लिए है) जब तक आप विशेष रूप से एक शैल सत्र लोड नहीं कर रहे थे।
इस मामले में, यदि आप बैश का उपयोग कर रहे हैं, तो आप भाग्य से बाहर हैं। शेल का उपयोग किए बिना सर्वर साइड पर SSH कमांड को लागू करने का कोई तरीका नहीं है; यह scp और sftp के लिए भी सही है। अधिकांश समय, आप शेल का उपयोग करना चाहते हैं क्योंकि यह PATHविभिन्न कार्यक्रमों के लिए चीजों को सेट करता है, और यह जटिल कमांड की उचित मात्रा के लिए अनुमति देता है, इसलिए ओपनएसएसएच हमेशा इसका उपयोग करता है।
इसके कुछ सुरक्षा लाभ भी हैं: यदि आप किसी ऐसे सिस्टम खाते में लॉग इन करने का प्रयास करते हैं जिसमें किसी तरह का वैध पासवर्ड है /usr/sbin/nologinया शेल का है /bin/false, तो आप कुछ भी नहीं कर सकते हैं, जो कि सिस्टम प्रशासक का इरादा है।
इसे कम करने के तरीके हैं। बहुत से लोग अपने डॉटफाइल्स का एक जीआईटी भंडार रखते हैं और उन्हें एक प्रणाली पर विकसित करते हैं, फिर उन्हें दूसरों को तैनात करते हैं। उदाहरण के लिए, मैं हमेशा अपने लैपटॉप पर डॉटफाइल डेवलपमेंट करता हूं। संभवत: यदि आप किसी नई टर्मिनल विंडो को तुरंत बाहर निकाल देते हैं, तो आपको यह समस्या थोड़ी जल्दी दिखाई देगी, और आपको इसे स्वयं ठीक करने के लिए रूट एक्सेस हो सकती है।
यदि आपको एक कॉन्फ़िगरेशन का परीक्षण करने की आवश्यकता है जो आपको लॉक कर सकती है, जैसे शेल कॉन्फ़िगरेशन या कोई sudoersपरिवर्तन, तो आप एक शेल (सामान्य या रूट, क्रमशः) को खुला छोड़ सकते हैं और फिर कुछ परीक्षण कर सकते हैं, इसलिए यदि आप कुछ तोड़ते हैं, तो आपके पास अभी भी है इसे पूर्ववत करने का तरीका।