SSH के माध्यम से जुड़ने के तुरंत बाद मैं एक स्क्रिप्ट कैसे चला सकता हूं?


24

मैंने यह सवाल पूछना शुरू कर दिया लेकिन जब मैंने इसे खोला तो इसका जवाब दिया। मैं इस प्रश्न को पोस्ट करने जा रहा हूं, इसे मेरे समाधान के साथ पालन करें और इसे अन्य संभावित समाधानों के लिए खुला छोड़ दें।

<पृष्ठभूमि की कहानी>

मैं एक tmux और विम यूजर हूं। मुझे दूरस्थ विम काम पसंद है क्योंकि मुझे उबंटू विकास मशीनों के बारे में चिंता करने की ज़रूरत नहीं है जब एक फ्लैश फिल्म मुझे एक कर्नेल घबराहट देती है। रनिंग टक्स का मतलब है कि खुली फाइलें मेरे रीबूट होने के बाद मेरा इंतजार कर रही हैं और मैं वहीं से आगे बढ़ सकता हूं जहां से मैंने छोड़ा था। जब मैं इस तरह से जुड़ता हूं तो मुझे tmux सत्र में चलने में समस्या होती है:

ssh example.com -t 'tmux attach'

यूटीएफ -8 उन मुद्दों को तैयार करता है जो सामान्य रूप से गोलाबारी करते समय फसल नहीं करते हैं और बस मैन्युअल रूप से एक tmux सत्र में संलग्न होते हैं।

</ पृष्ठभूमि की कहानी>

इसलिए मैं ssh लॉगिन पर कुछ शुरू करने की एक पुन: प्रयोज्य विधि चाहता हूं, जो मेरे द्वारा कॉन्फ़िगर की गई किसी भी अन्य चीज को प्रभावित नहीं करता है .zshrc(या .bashrcयदि आप अभी भी bash का उपयोग करते हैं) जो मेरे विकास पर्यावरण के लिए आवश्यक हो सकती है, तो यह नहीं है जब मैं कभी-कभार स्थानीय रूप से बहुत उक्त मशीन पर काम कर रहा होता हूं, तो प्रकट होता हूं।

जवाबों:


13

जब आप चलाने ssh example.com, ssh डेमॉन आपके लिए लॉगिन खोल शुरू होता है, और प्रवेश खोल पढ़ता अपने ~/.profile(या ~/.bash_profileया ~/.zprofileया ~/.loginअपना लॉगिन खोल के आधार पर)। जब आप दूरस्थ रूप से (साथ या बिना -t) चलने के लिए एक कमांड निर्दिष्ट करते हैं , तो ssh डेमन एक साधारण शेल शुरू करता है, इसलिए आपका .profileपढ़ा नहीं जाता है। उपाय:

ssh example.com -t '. /etc/profile; . ~/.profile; tmux attach'

अधिकांश ssh डेमॉन को छोड़कर पर्यावरण के चर को प्रसारित करने से मना किया जाता है LC_*। यदि ssh डेमॉन example.comइसे अनुमति देता है, तो आप LC_*स्वचालित रूप से tmux शुरू करने के लिए एक कस्टम चर का दुरुपयोग कर सकते हैं - इसे अपने में डालें ~/.profile:

if [ -n "$LC_tmux_session" ] && tmux has -t "$LC_tmux_session"; then
  exec tmux attach -t "$LC_tmux_session"
elif [ -n "${LC_tmux_session+1}" ] && tmux has; then
  exec tmux attach
fi

तो के साथ प्रवेश करें LC_tmux_session= ssh example.comया LC_tmux_session=session_name ssh example.com

इस उत्तर में ssh पर पर्यावरण चर को पार करने के बारे में अधिक जानकारी है।


मेरे द्वारा उपयोग ssh example.com -t 'tmux attach'नहीं किए जाने का कारण यह नहीं है क्योंकि इसमें मेरे वातावरण को लोड करने में समस्याएँ हैं, बल्कि इसलिए कि मेरे पास UTF-8 चरित्र प्रदर्शन के साथ समस्याएँ हैं; पारंपरिक तरीके से कनेक्ट करते समय यह समस्या मौजूद नहीं है। यही कारण है कि यह प्रश्न SSH से जुड़ने के तुरंत बाद स्क्रिप्ट चलाने के बारे में है।
connrs

मैं हालांकि अपने समाधान प्यार करता हूँ। एलिगेंट
23:11

@connrs: क्या आपके पास अपने चलाने के दौरान भी UTF-8 के साथ समस्याएँ हैं .profile? मैंने मान लिया कि समस्या लक्ष्य मशीन पर गलत तरीके से सेट किए गए स्थानों के कारण थी, जो आपके /etc/profileया .profileतय की गई थी। अधिक जानकारी के साथ स्थानीय समस्या संभव है।
गिल्स एसओ- बुराई को रोकें '

मैं इसका परीक्षण करने के लिए कार्यालय वापस जाना चाहता था। आप पूरी तरह से सही हैं, सोर्सिंग / / / प्रोफाइल उचित व्यवहार को ट्रिगर करता है। अब आप वास्तव में समस्या हल हो गया है कि मुझे प्रेरित इस अधिक सामान्य सवाल पूछने के लिए
connrs

6

मैंने पूर्व PermitUserEnvironment yesमें आपके लिए एक पर्यावरण चर को स्थापित करने और जोड़ने की सलाह दी थी ~/.ssh/environmentजब तक कि एली हेडी नीचे टिप्पणी में बेहतर सुझाव के साथ चिपके नहीं

अपना .zlogin(बैश: .bash_profileइत्यादि) खोलें और निम्नलिखित डालें:

if [[ "$SSH_CONNECTION" != "" && "$MY_SSH_CONNECTION" != "yes" ]]; then
    while true; do
        echo -n "Do you want to attach to a tmux session? [y/n]"
        read yn
        case $yn in
            [Yy]* ) MY_SSH_CONNECTION="yes" tmux attach; break;;
            [Nn]* ) break;;
            * ) echo "Please answer y/n";;
        esac
    done
fi

से ली गई प्रेरणा: मैं लिनक्स शेल स्क्रिप्ट में इनपुट के लिए कैसे संकेत करूं?

ध्यान दें कि मैंने प्रयोग किया है .zlogin फ़ाइल का लेकिन आप अपनी .zshrcफ़ाइल का उपयोग कर सकते हैं, लेकिन मुझे अपने डॉटफ़ाइल्स को साफ रखना पसंद है और यह इसे अलग करता है इसलिए मैं इसे अन्य मशीनों पर उपयोग कर सकता हूं।

प्रश्न को अपने लिए कुछ उपयुक्त के साथ बदलें और MY_SSH_CONNECTION="yes" tmux attachउस बिंदु पर चलाने के लिए जो कुछ भी आप चाहते हैं उसके साथ बदलें ।

ध्यान दें कि स्क्रिप्ट कैसे सेट करता है MY_SSH_CONNECTION="yes"इससे पहले tmux attachकि यह tmux से होकर गुजरता है क्योंकि यह एक शेल भी खोल रहा है जो ऊपर उसी स्क्रिप्ट को एक्सेस करेगा और किसी भी पुनरावृत्ति को रोक देगा।


2
PermitUserEnvironment का उपयोग कुछ वातावरण में संभावित सुरक्षा निहितार्थ के कारण संभव नहीं होगा। SSH $ SSH_CONNECTION वैरिएबल सेट करता है, जिसे आपके .zlogin में $ SSH_LININ के स्थान पर इस्तेमाल किया जा सकता है, ~ / .ssh / पर्यावरण का उपयोग करने की आवश्यकता को पूरा करता है। कुछ ऐसा if [[ "$SSH_CONNECTION" != "" ]]करना चाहिए।
एली हेडी

3

स्वयं, मैं इसे अपनी .bash_profile फ़ाइलों में जोड़ता हूं:

if [ -z "$STY" ]; then
    reattach() { exec screen -A -D -RR ${1:+"$@"} ; }
fi
if [ -t 0 ]; then
    screen -wipe
    echo 'starting screen... (type Ctrl-C to abort)'
    sleep 5 && reattach
fi

इससे मुझे स्क्रीन सेशन को फिर से शुरू करने या बनाने के लिए कुछ समय मिल जाता है। यह 'ssh सिस्टम कमांड' फॉरमेट पर काम नहीं करेगा (जिसे ~ /.* प्रोफाइल नहीं कहते हैं)। यदि मैं गर्भपात करता हूं तो शेल फ़ंक्शन को फिर से सेट करने के लिए सेट किया गया है।


महान! मैं इसके बजाय bashrc में डालकर f * अप करने में कामयाब रहा, और फिर प्रत्येक नई स्क्रीन विंडो में - जब .profile में बदलते हुए यह ठीक काम करता है।
ह्यूगो

0

आप दौड़ने पर विचार कर सकते हैं

ssh remotehost -t screen -DR

और वहां अपना टर्मिनल सत्र चलाएं। आप बाद में अलग ( ^A^Dऔर एक अलग ग्राहक से) भी अलग कर सकते हैं । यह गैर-संवादात्मक आरंभीकरण के साथ समस्या को दूर कर देगा क्योंकि स्क्रीन पूर्ण इंटरैक्टिव टर्मिनल सत्र रखता है (वैकल्पिक रूप से लॉगऑन गोले के रूप में अच्छी तरह से, man screen(1) या ^A?)


जैसा कि मेरे प्रश्न में उल्लेख किया गया है, मैं अपने सत्रों को प्रबंधित करने के लिए GNU स्क्रीन के बजाय tmux का उपयोग कर रहा हूं। और जब -t 'tmux attach'मेरे साथ लोड किया जाता है तो मेरे पास ऐसे मुद्दे होते हैं जो सामान्य रूप से मौजूद नहीं होते हैं। यही कारण है कि असली सवाल स्क्रीन / सत्र प्रबंधन के बजाय ssh कनेक्ट पर स्क्रिप्ट चलाने के बारे में है। मेरे प्रश्न में स्पष्ट नहीं होने के लिए क्षमायाचना
9

क्षमा करें, आपने tmux का उल्लेख किया है लेकिन इसका मेरे लिए कोई मतलब नहीं है। हालांकि एक नए उपकरण का उल्लेख करने के लिए धन्यवाद!
sehe

0

यदि आप जोड़ते हैं, तो विशेष रूप से UTF-8 मुद्दों पर बात करने के लिए

SendEnv LANG

और $LANGकी तरह कुछ करने के लिए सेट कर दिया जाता en_US.UTF-8स्थानीय अंत पर और दूरदराज के अंत पर अपने sshd परमिट SendEnvनिर्देश (साथ AcceptEnvमें sshd_config) दूसरे छोर पर tmux, यह सम्मान करना चाहिए। मुझे थोड़ी देर के लिए यह समस्या थी और इसका निवारण करना मुश्किल था।


0

यदि आप चाहते हैं कि यह हर बार आपके कनेक्ट होने पर चले, तो आप रिमोट मशीन पर बस tmux attachअपने नीचे जोड़ सकते हैं ~/.profile

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