सामान्य तौर पर बैश पर
स्टार्टअप फाइलों के संबंध में बैश का डिजाइन अजीबोगरीब है। .bashrc
दो असंबंधित परिस्थितियों में बैश लोड :
- जब यह एक इंटरेक्टिव शेल होता है, तो सिवाय इसके कि यह एक लॉगिन शेल (और इसके अलावा जब इसे छोड़ दिया जाए
sh
)। यही कारण है कि .bash_profile
आम तौर पर लोड होता है.bashrc
।
जब बैश इंटरैक्टिव नहीं है और न ही एक लॉगिन शेल है और न ही इनवोक किया गया है, sh
लेकिन इसके साथ निष्पादित करने के लिए एक कमांड दिया गया है -c
और SHLVL
1 के बराबर या कम या इसके बराबर है, और निम्न में से एक सत्य है:
- यदि मानक इनपुट एक सॉकेट है। व्यवहार में, यह ज्यादातर तब होता है जब बैश द्वारा आह्वान किया जाता है
rshd
, अर्थात दौड़ते समय rsh remotehost.example.com somecommand
।
यदि संकलित समय पर सक्रिय किया जाता है (जो कुछ वितरणों पर मामला है, जैसे कि डेबियन और डेरिवेटिव), यदि पर्यावरण चर में SSH_CLIENT
से SSH2_CLIENT
एक या परिभाषित किया गया है। व्यवहार में, इसका मतलब है कि बैश द्वारा sshd
, अर्थात ssh remotehost.example.com somecommand
।
यदि आप नहीं जानते कि कैसे बैश संकलित किया गया था, तो आप यह पता लगा सकते हैं कि क्या यह विकल्प यह जाँच कर सेट किया गया था कि क्या बाइनरी में स्ट्रिंग है SSH_CLIENT
:
strings /bin/bash | grep SSH_CLIENT
सामान्य तौर पर एसएसएच पर
जब आप SSH प्रोटोकॉल के माध्यम से एक कमांड निष्पादित करते हैं, तो कमांड को तार के रूप में तार पर पार किया जाता है। स्ट्रिंग को दूरस्थ शेल द्वारा निष्पादित किया जाता है। जब आप चलाते हैं ssh example.com somecommand
, यदि दूरस्थ उपयोगकर्ता का लॉगिन शेल है /bin/bash
, तो SSH सर्वर चलता है /bin/bash -c somecommand
। लॉगिन शेल को बायपास करने का कोई तरीका नहीं है। यह प्रतिबंधित लॉगिन गोले को अनुमति देता है , उदाहरण के लिए केवल फाइल कॉपी और सामान्य कमांड निष्पादन की अनुमति देने के लिए ।
एक अपवाद है: एसएसएच प्रोटोकॉल क्लाइंट को एक विशिष्ट सबसिस्टम का अनुरोध करने की अनुमति देता है। यदि क्लाइंट sftp
सबसिस्टम का अनुरोध करता है , तो डिफ़ॉल्ट रूप से ओपनएसएसएच सर्वर /usr/lib/openssh/sftp-server
उपयोगकर्ता के लॉगिन शेल के माध्यम से प्रोग्राम (स्थान भिन्न हो सकता है) को आमंत्रित करता है । लेकिन यह लाइन के माध्यम से एक आंतरिक SFTP सर्वर चलाने के लिए भी कॉन्फ़िगर किया जा सकता है
Subsystem sftp internal-sftp
में sshd_config
फ़ाइल। आंतरिक एसएफटीपी सर्वर के मामले में, और केवल इस मामले में, उपयोगकर्ता के लॉगिन शेल को बायपास किया जाता है।
इस चुनौती के लिए
ओवरएवरवायर बैंडिट 18 के मामले में .bashrc
शामिल है
…
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
…
echo 'Byebye !'
exit 0
तो आप इस स्तर को कुछ भी करके हल कर सकते हैं जिसके कारण बैश इंटरैक्टिव नहीं हो सकता है।
जैसा कि आपने खोजा, SFTP काम करता है।
लेकिन ssh bandit18@bandit.labs.overthewire.org cat readme
काम भी करेगा।
जैसा होगा echo 'cat readme' | ssh bandit18@bandit.labs.overthewire.org
।
और एक इंटरेक्टिव लॉगिन के दौरान सही समय पर Ctrl + C दबाने से भी काम होगा: यह बैश को बाधित करेगा, इसलिए .bashrc
इसे पूरी तरह से निष्पादित नहीं किया जाएगा। बैश को शुरू करने के लिए मैक्रोस्कोपिक समय लगता है, इसलिए जब यह मज़बूती से काम नहीं करता है, तो यह अभ्यास में किया जा सकता है।