मैं एक टर्मिनल के आउटपुट को दूसरे टर्मिनल से कैसे हुक कर सकता हूं?


44

मुझे वर्तमान में चल रहे टर्मिनल (tty1) के उत्पादन को वर्चुअल टर्मिनल से हुक करने की आवश्यकता है और इसे कैप्चर करना (एक्स सर्वर चलाना)।


5
जबकि मैं समझता हूं कि कभी-कभी एक आदेश चलने के बाद दूसरे टटी पर सामग्री को पकड़ने की आवश्यकता होती है, रोकथाम का एक औंस इलाज के लायक है, इसलिए हमेशा उपयोग शुरू करने screenया tmuxएक कमांड शुरू करने से पहले विचार करें कि आप दूसरे टर्मिनल से पहुंचना चाहते हैं। ।
depquid

और जब आप इसे पहले से तैयार कर सकते हैं, तो शायद tmate एक अच्छा उम्मीदवार होगा जो इंटरनेट पर भी काम करता है और न केवल स्थानीय। (और वैकल्पिक लेखन का उपयोग किया है)
रग

जवाबों:


23

मुझे यह एक उपकरण कहा जाता है ttylog। यह सीपीएल पर उपलब्ध एक पर्ल प्रोग्राम है । इसमें कुछ युगल हैं, एक यह है कि मैं केवल यह पता लगा सकता हूं कि एक टर्मिनल से कैसे जुड़ा जाए जो किसी व्यक्ति के हिस्से के रूप में मेरे बॉक्स में बनाया गया था। दूसरा यह है कि आपको इसे उन्नत विशेषाधिकारों (यानी रूट या सुडो) के साथ चलाना होगा।

लेकिन यह काम करता है!

उदाहरण के लिए

पहले TERM # 1 में अपने बॉक्स में ssh:

TERM#1% ssh saml@grinchy

इस नए टर्मिनल के नोट पर ध्यान दें:

TERM#1% tty
/dev/pts/3

अब दूसरे टर्मिनल में (TERM # 2) इस कमांड को चलाएं:

TERM#2% ttylog pts/3
DEBUG: Scanning for psuedo terminal pts/3
DEBUG: Psuedo terminal [pts/3] found.
DEBUG: Found parent sshd pid [13789] for user [saml]

अब TERM # 1 पर वापस जाएं और सामान टाइप करें, यह TERM # 2 में दिखाई देगा।

टर्मिनलों के एस.एस.

सभी कमांड मैंने कोशिश की, (शीर्ष, एलएस, आदि) का उपयोग किए बिना घटना के बिना काम किया ttylog


बिल्कुल वही, जिसकी मुझे तलाश है (मैंने अतीत में इसका इस्तेमाल किया है, लेकिन नाम भूल गया और याद नहीं कर पाया)। बहुत धन्यवाद, मैंने अस्थायी रूप से गंदे विकल्प (gdb और आउटपुट प्रतिकृति) का उपयोग किया।
प्रूज़ीनैट

हां, वह gdbपहला विकल्प था जो मुझे आया था, मैंने अतीत में इसका इस्तेमाल किया है, लेकिन यह मेरे लिए कम से कम है। खुशी है कि यह आपकी मदद की!
स्लम

1
ttylog हालांकि सही प्रक्रिया से जुड़ नहीं सकता है - क्या कोई मेरे सवाल का जवाब दे सकता है: serverfault.com/questions/560972/…
LittleBobbyTables

21

वास्तव में यह है। / Dev / vcs * और / dev / vcsa * उपकरण / dev / tty * उपकरणों (वर्चुअल टर्मिनलों) से मेल खाते हैं। F1 = tty1 = vcs1 / vcsa1 और इसी तरह। Vcs / vcsa "चालू" वर्चुअल टर्मिनल के लिए ट्टी की तरह है।

जड़ के रूप में, आप बस इन उपकरणों (जैसे बिल्ली / देव / vcs2) को बिल्ली कर सकते हैं, और देख सकते हैं कि स्नैपशॉट लेने की तरह इसी वीटी (जैसे / देव / tty2 on F2 पर) क्या है। vcsa * vcs से अलग है * इसमें वे टर्मिनल (स्क्रीन) के आयामों के बारे में जानकारी शामिल करते हैं। ध्यान रखें, यह पात्रों का सिर्फ एक कच्चा स्नैपशॉट है, जैसा कि वे स्क्रीन पर दिखाते हैं - टर्मिनल को आवंटित मेमोरी से इकट्ठा किए जाते हैं - इसलिए अच्छे, आसानी से पार्सबल आउटपुट की उम्मीद न करें।

दोष यह है कि यदि सूचना बहुत तेजी से अतीत में चमकती है, तो उसे पकड़ना मुश्किल हो सकता है। शायद पूंछ-एफ / देव / vcs1 काम करेगा, अगर आपको कई स्क्रीनफुल (खुद की कोशिश नहीं की गई) का पालन करने की आवश्यकता है? इसे पहले फ़ाइल में रीडायरेक्ट करना आसान हो सकता है। इसे देखने के लिए VT (F1-F6) का उपयोग करना भी एक अच्छा विचार हो सकता है, क्योंकि टर्मिनलों में समान आयाम होंगे। मेरे अनुभव में, vcs * - vcsa * - उपकरणों का उपयोग करना सबसे अच्छा है।

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

पुनश्च: मैं यह पूछना भूल गया कि आप किस ओएस का उपयोग करते हैं। यह लिनक्स के लिए है, हालांकि इसी तरह के उपकरण संभवतः अन्य ओएस पर भी मौजूद हैं। उपकरणों के लिए मैन-पेज के बीच "वर्चुअल कंसोल मेमोरी" की खोज करने का प्रयास करें।


क्या ssh से tty1 में इनपुट इंजेक्ट करने का कोई तरीका है? उदाहरण के लिए मुझे डेबियन को चलाने वाले रास्पबेरी पाई के साथ काम करने की आवश्यकता है, लेकिन समस्या यह है कि इसमें केवल एक यूएसबी पोर्ट है, इसे वाईफाई एडॉप्टर द्वारा लिया जाता है, और इसलिए मैं इसके साथ tty1 का उपयोग करने के लिए एक कीबोर्ड संलग्न नहीं कर सकता। चूंकि मुझे एक स्क्रिप्ट चलाने की ज़रूरत है, जो निष्पादित करने की प्रक्रिया के दौरान बंद हो जाती है wlan0, मेरे पास वास्तव में एक कैच -22 स्थिति है जिसे डिबग करने की कोशिश की जा रही है जहां यह स्क्रिप्ट विफल हो रही है। मान लीजिए कि मैं एक USB हब का उपयोग नहीं कर सकता ... क्या मेरे लिए किसी तरह से / dev / tty1 में चार्ट को पाइप करने का कोई तरीका है?
स्टीवन लू

2
कुंआ। मैं सामान को /dev/tty1रूट करने में सक्षम हूं, लेकिन यह सब स्क्रीन पर पात्रों को प्रदर्शित करता है, उन्हें दर्ज नहीं करता है
स्टीवन लू

1
क्षमा करें यदि यह सिर्फ शोर है। यह वास्तव में 100% प्रासंगिक नहीं है। लेकिन मैं के साथ ऊपर टिप्पणी में मेरे प्रश्न का उत्तर इस
स्टीवन लू

18

की ओर देखें:

man 1 script

उदाहरण के लिए:

script -f /dev/tty1

मुझे इसकी तलाश थी। screenबुरी तरह से असफल होने की कोशिश कर रहा है । यह काम करता हैं।
sdkks

5

ttyउन्हें पहचानने के लिए प्रत्येक टर्मिनल में कमांड का उपयोग करें:

$ tty
/dev/pts/0

$ tty
/dev/pts/1

इन TTYs को मानते हुए, पहले स्टडआउट को दूसरे पर पुनर्निर्देशित करने के लिए, इसे पहले टर्मिनल में चलाएं:

exec 1>/dev/pts/1

नोट: अब हर कमांड आउटपुट pts / 1 पर दिखाई देगा

Pts / 0 के डिफ़ॉल्ट व्यवहार को रोकने के लिए:

exec 1>/dev/pts/0

प्रदर्शन के लिए यह वीडियो देखें ।


2

यह मेरे लिए काम किया:

  • कंप्यूटर "ए" पर एक कीबोर्ड का उपयोग करना (यानी भौतिक कंप्यूटर जिसे नियंत्रित किया जाना है), चलाएं: screen -q

  • sshकंप्यूटर "बी" से कंप्यूटर "ए" से कनेक्ट करें ।

  • Ssh सत्र में, टाइप screen -lsकरने के लिए एक सत्र आईडी प्राप्त करने के लिए (4 अंक जिसमें ट्टी शामिल है )।

  • उपरोक्त सत्र से कनेक्ट करें: screen -x <session id>... screen -lsऊपर दिए गए कमांड से प्राप्त सत्र आईडी संख्या का उपयोग करना ।

या तो "सत्र" में टाइप किया गया कुछ भी "सत्र" दोनों में होगा, इसलिए उदाहरण के लिए टाइपिंग screen -dबीओटीएच सत्र छोड़ देगा।


1

एक अन्य तरीका यह है कि screenअपने स्थानीय मशीन पर ग्नू उपयोगिता का उपयोग करें । -Lविकल्प के साथ इसे लागू करें , या उस विकल्प के बिना शुरू करें और ^aHकमांड अनुक्रम का उपयोग करें । या तो दृष्टिकोण सभी इनपुट और आउटपुट को एक फ़ाइल में लॉग इन करने का कारण बनता है जिसका नाम screenlog.xx है जहां स्क्रीन नंबर है।

यह एक काम है क्योंकि रिमोट मशीन पर कुछ भी अतिरिक्त स्थापित करने की आवश्यकता नहीं है।


1

चूंकि मैंने tty1 को स्क्रीन के साथ शुरू नहीं किया था इसलिए इस स्क्रिप्ट ने मदद की:

मैंने ऊपर बार्ड कोपरपुड से उत्तर का उपयोग किया। "128" मेरे tty1 की 1 पंक्ति है। नींद को एक उपयुक्त संख्या में सेट किया जा सकता है।

#!/bin/bash
while true
do
    sudo tail -c 128 /dev/vcs1 && echo ""
    sleep 10
done

मैंने इसे टर्मिनेटर में इस्तेमाल किया और कॉलम को आकार दिया ताकि स्क्रॉल पाठ की एक पंक्ति हो।


इस विचार के लिए धन्यवाद, रैस्पररी पर मुझे बस '' घड़ी बिल्ली / देव / वीकेएस '' करना था '' एक प्रक्रिया को देखने के लिए मैंने एक वर्चुअल कंसोल पर शुरू किया जो 'स्क्रीन' का उपयोग करने के बारे में भूल गया। और मैंने अभी-अभी अपना गनोम-टर्मिनल समायोजित किया है, मैंने इसे 80 वर्णों का चौड़ा किया है।
axkibe

0

दो टर्मिनल खोलें। ttyप्रत्येक में टाइप करें और आपको यह आईडी के रूप में मिलेगा/dev/pts/nº

फिर पहले में आप टाइप करते हैं script -f /dev/pts/nºofSecondTerminalऔर दूसरे में आप विपरीत करते हैं script -f /dev/pts/nºofFirstTerminalताकि वे जुड़े रहें

बधाई! दोनों एक ही सामान को आउटपुट और प्राप्त करते हैं। एक तीसरे की आवश्यकता है? अच्छा, क्या आपने संयोजन का अध्ययन किया है? आपको 6 script -fकमांड की आवश्यकता होगी । यहां तक ​​कि अधिक tty? जल्द ही...

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