Ssh एक कमांड कैसे चलाता है?


15

मैं दोनों क्लाइंट और सर्वर पर बैश का उपयोग कर रहा हूं। SSH पर कमांड चलाते समय:

  • ssh <host> 'declare' शेल चरों की सूची देता है।

  • ssh <host> 'mount' माउंट पॉइंट की एक सूची देता है।

हालांकि, declareएक बैश बिलिन है, जबकि mountएक बाहरी कमांड है। SSH को कैसे पता चलता है कि अगर सर्वर पर एक ही नाम के साथ एक शेल बिल्डिन और एक बाहरी कमांड है, तो कौन सा चलना है?


2
ssh हमेशा अपने शेल को चलाते हैं, जो अंदर संग्रहीत होता है /etc/passwd। यदि आप इसे /usr/sbin/nologinलॉग इन नहीं कर सकते हैं।
Ipor Sircer

जवाबों:


21

sshचलाता आदेशों आप दूरदराज के उपयोगकर्ता के खोल में प्रदान करते हैं (से प्राप्त /etc/passwdसे), दृश्य के रूप में स्रोत कोड :

argv[0] = (char *) shell0;
argv[1] = "-c";
argv[2] = (char *) command;
argv[3] = NULL;
execve(shell, argv, env);

इसलिए संबंधित आदेश जो दूरस्थ सर्वर पर आपके उदाहरण के लिए निष्पादित किए जाते हैं:

  • bash -c declare
  • bash -c mount

दोनों का bashमूल्यांकन और मूल्यांकन किया जाता है। बिल्ट-इन का मूल्यांकन अंदर किया जाता है, और बाहरी कमांड को कहा जाता है जैसे कि आप अपने स्थानीय कमांड लाइन प्रॉम्प्ट से ऐसा करेंगे।


यदि कोई शेल हमेशा ssh डेमॉन द्वारा शुरू किया जाता है, तो दिलचस्प बात यह है, जब उपयोगकर्ता ssh को कमांड के साथ कॉल करता है, तो वह शेल लॉगिन शेल नहीं है, भले ही उपयोगकर्ता ने किसी प्रकार का लॉगिन किया हो। कोई उपाय?
सायकर

हाँ। शेल चल रहा है कमांड 1) कोई लॉगिन शेल 2 नहीं है) इंटरएक्टिव नहीं। आप -tस्विच द्वारा अन्तरक्रियाशीलता को बाध्य कर सकते हैं , लेकिन यह अभी भी आरसी फ़ाइलों को लोड नहीं करेगा।
जकूज़ी

1
ध्यान दें कि sshd(सर्वर) ऐसा कर रहा है, न कि ssh(क्लाइंट)।
ysdx 13

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