क्या मैं इंटरैक्टिव मोड में आने से पहले ssh सत्र शुरू करते समय कुछ कमांड निष्पादित कर सकता हूं?


13

जब ssh कमांड को ssh कमांड के साथ शुरू करना मुझे दो विकल्प लगता है - डिफ़ॉल्ट इंटरव्यू के साथ डिफॉल्ट इंटरेक्टिव सेशन और होम डाइरेक्टरी से शुरू - या मनमाना कमांड को निष्पादित करने के लिए लेकिन गैर-अंतःक्रियात्मक (यहां तक ​​कि ट्रिक्स भी ssh "command; command; bash -i -l"बहुत अच्छा नहीं लगता है)। अक्सर मैं इंटरैक्टिव सत्र चाहता हूं, लेकिन इससे पहले कुछ हो रहा है - आम तौर पर एक निर्देशिका परिवर्तन, या कभी-कभी सिस्टम पर्यावरण समायोजन। ये चीजें सत्र-दर-सत्र बदलती रहेंगी, इसलिए मैं उन्हें अभी तक इसमें शामिल नहीं कर सकता .bashrc

क्या ऐसा करने का कोई तरीका है?

जवाबों:


13

मैं आत्म-उत्तर दे रहा हूं, क्योंकि मैंने आखिरकार रहस्य का पता लगा लिया है। न तो -tविकल्प के लिए ssh, न ही -lविकल्प के लिए bashअपने दम पर लॉगिन शेल को बढ़ावा मिलेगा - लेकिन संयोजन में वे काम करते हैं।

ssh user@host.com -t 'cd /some/where; FOO=BAR NUMBER=42 bash -l'निर्देशिका, सेट वातावरण चर बदल जाता है, और उसके बाद उचित लॉगिन खोल (कि फर्क सिर्फ इतना है कि मैं अब तक मिल गया है है शुरू होता है /etc/motdइस तरह से प्रदर्शित नहीं किया जाता है - यह सामान्य रूप से है sshकी या loginकी जिम्मेदारी है, नहीं bashहै - कि सब कुछ के अलावा अन्य लगता है पूरी तरह से काम करने के लिए, और सभी पर्यावरण चर समान हैं)।

ये वातावरण / निर्देशिका परिवर्तन ssh के बाद होते हैं, इसलिए वे PermitUserEnvironmentसंबंधित और संबंधित सेटिंग्स (बिल्कुल नियोजित) द्वारा प्रतिबंधित नहीं होते हैं , लेकिन पहले .bashrc/ .profileनिष्पादित हो जाते हैं। इसमें अपसाइड्स और डाउनसाइड्स हैं - बस कुछ को ओवरराइड करना कठिन है जो बैश इनिट स्क्रिप्ट्स से सेट हो जाता है PS1, लेकिन sshकमांड लाइनों में सही मानों को पैक करना आसान है , और .profileसभी भारी उठाने हैं।

और अगर वास्तव में आवश्यक है, तो .profileकमांड लाइन के साथ कुछ निष्पादित करने के लिए बैश प्राप्त करना वास्तव में बहुत आसान है जैसे ssh user@foo.com -t 'cd /mnt; echo ". ~/.bash_profile; PS1=\"\\h-\w \"" >~/xxx; bash --init-file ~/xxx'- बहुत ही बदसूरत जब उस तरह से रखा जाता है, लेकिन इन वैकल्पिक .profileफ़ाइलों को पहले तैयार किया जा सकता है। (जहां तक ​​मैं बता सकता हूं bashकि .profileस्क्रिप्ट के लिए कुछ उम्मीदवार स्थान हैं और पहले पाए गए को निष्पादित करेगा - . fileइस तरह की स्वचालित कमियां नहीं हैं, इसलिए आपको यह जांचने की आवश्यकता होगी कि आपका सामान्य कहां है profileयदि आप ऐसा करना चाहते हैं)


बहुत बढ़िया, इसके लिए धन्यवाद! मैं ssh'ing के बाद उपयोगकर्ता के खाते में मुकदमा करने का एक तरीका ढूंढ रहा था, और "-t" विकल्प ने इसे काम कर दिया। उस विकल्प के बिना, आपके शेल में प्रॉम्प्ट नहीं है, कमांड हिस्ट्री नहीं है, SIGINT से मर जाता है, आदि
Ashoat

यह उत्तर वास्तव में उपयोगी है, लेकिन आप ;पहले ssh लॉगिन स्ट्रिंग से कुछ s गायब हैं । यह मुझे आपका उत्तर संपादित नहीं करने देगा क्योंकि मैं पर्याप्त नहीं बदल रहा हूँ। मुझे यह काम करने के लिए मिला है ssh user@host.com -t 'cd /some/where; FOO=BAR; NUMBER=42; bash -l'। मुझे लगता है कि आपका यही इरादा है।
रोब क्वासोवस्की

2

.Bashrc को संपादित करें और अपनी SSH- विशिष्ट वातावरण सेटिंग्स को इसमें संलग्न करें:

if [ $SSH_TTY ]; then
    ...
fi

यह आपको विशेष रूप से SSH सत्रों के लिए सेटिंग्स जोड़ने की अनुमति देगा। 'पाठ्यक्रम, यदि आप चाहते हैं कि मनमाने ढंग से पर्यावरण चर सेट करें जो सत्र के अनुसार अलग-अलग हो, तो मुझे नहीं पता कि आप उन्हें टाइप करने के अलावा मशीन को आपके लिए कैसे बना सकते हैं ... इससे कोई फर्क नहीं पड़ता कि आप क्या कर रहे हैं।' सेटिंग्स की पसंद को आधार बनाने के लिए कुछ परीक्षण योग्य स्थिति की आवश्यकता होगी।


2

से sshआदमी पेज:

इसके अतिरिक्त, ssh ~ / .ssh / वातावरण को पढ़ता है, और यदि फ़ाइल मौजूद है और पर्यावरण के लिए "VARNAME = value" प्रारूप की पंक्तियों को जोड़ता है और उपयोगकर्ताओं को अपने वातावरण को बदलने की अनुमति है। अधिक जानकारी के लिए, sshd_config (5) में PermitUserEnvironment का विकल्प देखें।

जो कहते हैं:

PermitUserEnvironment
निर्दिष्ट करता है कि क्या ~ / .ssh / पर्यावरण और पर्यावरण = में विकल्प / / .ssh / अधिकृत_की sshd (8) द्वारा संसाधित हैं। डिफ़ॉल्ट "नहीं" है। पर्यावरण प्रसंस्करण को सक्षम करने से उपयोगकर्ता LD_PRELOAD जैसे तंत्रों का उपयोग करके कुछ कॉन्फ़िगरेशन में पहुंच प्रतिबंधों को बायपास करने में सक्षम हो सकते हैं।

इस सुविधा ~/.bashrcका उपयोग आपके रिमोट में बयानों को सशर्त रूप से निष्पादित करने के लिए किया जा सकता है ifजो मिकी ने सुझाए थे।


1

बस इस तरह से चलाएं: ssh -t yourdomain 'cd /yourpath; bash'

  • -t : ताकि शीघ्र दिखाई दे
  • ; bash: ताकि यह कमांड (यहां cd) को निष्पादित करने और ssh सत्र से बाहर निकलने के बावजूद नियंत्रण वापस कर दे

ServerFault में आपका स्वागत है! कृपया यह बताने के लिए कि वे क्या हैं, यह बताने के लिए कमांड और स्क्रिप्ट के लिए स्पष्टीकरण और / या प्रलेखन प्रदान करें।
कोरी नॉटसन

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