मैं अपने डेस्कटॉप से ​​दूरस्थ सर्वर पर ssh पर कमांड के साथ स्क्रीन सत्र कैसे शुरू कर सकता हूं?


57

मैं अपने डेस्कटॉप पर एकल ssh कमांड से दूरस्थ सर्वर पर स्क्रीन सत्र शुरू करने में सक्षम होना चाहता हूं। हालांकि, स्क्रीन के लिए एक टर्मिनल की आवश्यकता होती है, जो ssh के माध्यम से कमांड चलाते समय उपलब्ध नहीं है।

तो जाहिर है

ssh root@my.machine screen "tail -f /var/log/messages"

(एक उदाहरण के रूप में) काम नहीं करता है, और देता है

Must be connected to a terminal.

मैं एक स्क्रीन के तहत कमांड लॉन्च करना चाहता हूं, ताकि मैं बाद में लॉग इन कर सकूं और स्क्रीन सेशन कर सकूं जैसा कि मैंने मैन्युअल रूप से लॉन्च किया था।


एक तरफ के रूप में, आप स्क्रीन के खराब उपयोग के माध्यम से इस त्रुटि को मार सकते हैं। मेरे पास एक शेल फ़ंक्शन था जो एक फ़ाइल से पढ़ने के लिए निष्पादन <foo कर रहा था। बहुत बाद में एक बड़ी स्क्रिप्ट में मैंने स्क्रीन लॉन्च करने की कोशिश की। नीचे दिए गए सभी तरीके। असली अपराधी फाँसी की सजा के रूप में विफल रहा। मन में धारण करने वाला। जाँच करें कि आपने अनजाने में अपने स्वयं के स्टड को नहीं मारा है।
नील मैकगिल

जवाबों:


77

Ssh के लिए -t विकल्प का उपयोग करके देखें

ssh -t root@my.machine screen "tail -f /var/log/messages"

आदमी ssh से

-t बल छद्म tty आवंटन। इसका उपयोग arbi को निष्पादित करने के लिए किया जा सकता है-
        एक रिमोट मशीन पर स्क्रीन-आधारित कार्यक्रम, जो हो सकता है
        मेनू सेवाओं को लागू करते समय बहुत उपयोगी, उदाहरण के लिए। कई-कई
        विकल्प tty आवंटन को बल देते हैं, भले ही ssh के पास कोई स्थानीय tty न हो।

मैं tmux के साथ भी यही कोशिश कर ssh -t user@machine tmux attachरहा हूं और मैं रिमोट tmux सेशन को अटैच कर सकता हूं लेकिन यह कैरेक्टर एन्कोडिंग के साथ गड़बड़ करता है। यह केवल एससीआई चार्ट प्रदर्शित करता है। क्या इसे ठीक करने का कोई तरीका है?
मैकारो

1
@Macario आप इसके लिए एक अलग प्रश्न खोलना चाहते हैं, जबकि यह मूर्त रूप से संबंधित है जैसा कि आप इसे ssh -t के साथ चला रहे हैं, ऐसा लगता है कि यह LC_ * अलग-अलग संवादात्मक बनाम गैर-संवादात्मक रूप से चलाने के लिए संबंधित है। जब आप निष्पादित करने के लिए ssh को कमांड-लाइन पास करते हैं, तो इसे गैर-संवादात्मक वातावरण के साथ निष्पादित किया जाएगा। यह संभव है कि गैर-अंतःक्रियात्मक रूप से निष्पादित करते समय TERM पर्यावरण चर की कमी हो, जिस स्थिति में tmux को यह पता नहीं होगा कि आपके टर्मिनल में वास्तव में क्या क्षमताएं हैं, और कम से कम सामान्य भाजक पर वापस आती है।
Kjetil Joergensen

मैं ssh का उपयोग नहीं कर रहा हूं, लेकिन उसी मुद्दे का सामना कर रहा हूं। कृपया मदद कीजिए। serverfault.com/questions/861632/unable-to-run-code-in-screen
zhangjinzhou

32

आप उपयोग कर सकते हैं:

ssh root@host screen -m -d "tail -f /var/log/messages"

उस पर चलने वाली कमांड के साथ एक अलग स्क्रीन शुरू होती है।

   -m   causes screen  to  ignore  the  $STY  environment  variable.  With
        "screen  -m"  creation  of  a  new session is enforced, regardless
        whether screen is called from within  another  screen  session  or
        not.  This  flag has a special meaning in connection with the `-d'
        option:

   -d -m   Start screen in "detached" mode. This creates a new session but
           doesn't  attach  to  it.  This  is  useful  for  system startup
           scripts.

1
आपका जवाब भी उतना ही अच्छा था, बहुत बुरा मुझे चुनना है। हो सकता है कि किसी को पहले उत्तर को संपादित करना चाहिए और अपनी जानकारी को जोड़ना चाहिए।
थॉमस वेंडर स्टिकल

8

देर से जवाब, लेकिन यह वही है जो मैं करता हूं, मैं एक उपनाम बनाता हूं (चलो इसे टी कहते हैं) जो ऐसा करता है:

ssh $MYSERVER -a -x -t screen -xRR -A -e^Zz -U -O

यह sshएजेंट और X11 अग्रेषण को अक्षम करने के लिए कहता है, और screenएक चालू सत्र में संलग्न करने के लिए कहता है, यदि आवश्यक हो तो एक नया शुरू करें ^Z, ब्रेकआउट कमांड के रूप में उपयोग करें, UTF-8 का उपयोग करें और टर्मिनल के बारे में स्मार्ट रहें।

इसका मतलब यह है कि मैं एक टर्मिनल खोल सकता हूं, tयह $ MYSERVER पर मेरा स्क्रीन सत्र खोलेगा। मैं फिर एक और टर्मिनल खोल सकता हूं, वही काम कर सकता हूं और मुझे उसी सत्र में एक और विंडो मिलती है।

एक ही स्क्रीन सत्र में कई टर्मिनल विंडो रखना वास्तव में अच्छा है ताकि आपको एक ही समय में दो स्क्रीन टैब देखने को मिलें।


1
मैं काफी कुछ पन्नों के माध्यम से पढ़ता हूं जो कि मैं क्या देख रहा था, इसका उत्तर नहीं देता, लेकिन आपने इसे रद्द कर दिया। मैं मान रहा हूं कि स्क्रीन या tmux शायद इन दिनों अधिकांश सर्वरों पर है, और जिन लोगों को मैं जोड़ता हूं वे संभावित रूप से अल्पकालिक हैं इसलिए मैं अधिकांश उत्तरों जैसे सुझाव के साथ बैश करना नहीं चाहता था। आप इसे अपने शेल में एक फ़ंक्शन भी बना सकते हैं और $ होस्ट और $ कमांड (जो आप अंत में डालेंगे) जैसे तर्क स्वीकार करते हैं। और अपने उपनाम को हार्डकोड करने के बजाय tजो एक एकल होस्ट है, आप इसे अपने ssh_config में होस्टनाम के साथ जोड़ सकते हैं।
ड्रैगन 788

@ dragon788 वास्तव में, मैंने इसे अब एक फंक्शन बनाया और "$ @" के साथ $ MYSERVER को बदल दिया। मैं अब भी इसका भरपूर उपयोग करता हूं।
w00t

4

निम्नलिखित को अपने सर्वर पर ~ / .bashrc फ़ाइल में डालकर, यह एक स्क्रीन सत्र शुरू करता है जब मैं पहली बार सर्वर पर लॉग ऑन करता हूं, या यदि कोई पहले से चल रहा है, तो मुझे उस सत्र से फिर से जोड़ता है।

मुझे यह बहुत आसान लगता है:

if [ -n "$SSH_CONNECTION" ] && [ -z "$SCREEN_EXIST" ]; then
    export SCREEN_EXIST=1
    screen -DRi
fi

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