2012-01-24 12 views
11

मैं बस कुछ दूरस्थ सर्वर से ssh-एड और पाया कि stdout और सभी आदेशों/प्रक्रियाओं मैं पार्टी में चलाने के लिए कोशिश कर रहा हूँ की stderr कहीं पर पुनः निर्देशित किया गया है। तो, मैं निम्नलिखित हो गया सवालstdout मार्ग बदलने के लिए कैसे, stderr वापस करने के लिए/dev/tty

कैसे पता लगाने के लिए:

1) कौन सा फ़ाइल stdout, stderr लिनक्स में भेज दिए beeing है?

और

2) और कैसे डिफ़ॉल्ट stdout और stderr वापस करने के लिए/dev/tty से कहीं और भेजें?

अग्रिम धन्यवाद।

+0

आपको यह कैसे पता चला? –

+0

बस टाइपिंग कमांड जो STDOUT और STDERR को आउटपुट करना चाहिए। – Sergey

+0

क्या .bashrc में कुछ भी प्रासंगिक है? –

उत्तर

10

एक कमांड है कि आप के लिए सचमुच क्या पूछा क्या करना चाहिए में (2) है

exec >/dev/tty 2>&1 

लेकिन मुझे लगता है कि समस्या के अपने विश्लेषण सही नहीं है। यह ssh -v ... के आउटपुट को देखने में उपयोगी होगा (जहां ... आपके मूल ssh कमांड में जो भी तर्क टाइप किया गया है)।

+0

इसे मेरे कांटा प्रबंधन लूप में जोड़ने से स्टडआउट को रीसेट करने की चाल थी। मैं sshing, स्क्रीन चल रहा था, और एक फोर्किंग ओएस पैचिंग पर्ल स्क्रिप्ट चला रहा था, जिसके अंदर न्यूलाइन ने बिना किसी वापसी के अगली पंक्ति में कैरिज छोड़ने की तरह काम करना शुरू कर दिया। इस आदेश को इंगित करने के लिए बहुत अधिक gracias। –

1

यह केवल तभी किया जा सकता है जब आपका लम्बाई खोल एक पाइप के साथ tee कमांड के साथ पैरामीटर के रूप में शुरू किया गया हो।

मुझे समझाएं।

यदि आप /dev/tty1 में लॉग इन कर रहे हैं और कोई अन्य /dev/tty2 में लॉग इन कर रहा है। यदि आप कमांड का पालन करके अपना खोल (बैश) शुरू करते हैं तो सभी STDOUT/STDERR को फिर से/दूसरे शेल (/dev/tty2) में कॉपी किया जाएगा)।

bash 2>&1 | tee /dev/tty2 

तो, किसी को /dev/tty2 में बैठे अपने गतिविधि के सभी देखेंगे।

यदि कोई लॉग इन खोल /bin/bash के बजाय /bin/bash 2>&1 | tee /dev/tty2 है तो यह हर बार जब वह लॉग इन करता है तो होगा। लेकिन मुझे यकीन नहीं है कि लॉगिन खोल को इस तरह से सेट किया जा सकता है।

अगर कोई आपके खोल के सभी आउटपुट को दोबारा शुरू करता है तो आप यह जांच कर सकते हैं कि कोई भी tee पृष्ठभूमि में चल रहा है या नहीं।

ps ax | grep tee 

तरह

tee /dev/tty2 
8

हो जाएगा ताकि उत्पादन कुछ आदेश:

ls -l /proc/$$/fd/{1,2} 

आप जो फ़ाइलों stdout (फ़ाइल वर्णनकर्ता 1) और stderr के रूप में खुले हैं दिखाएगा (फ़ाइल वर्णनकर्ता 2) ।

+0

बहुत अच्छा! किसी भी विचार से पूर्व कैसे संबंधित है .: '1 -> पाइप: [16418291]' एक पिड में? –

+0

मैंने अभी पाया,/proc, इस के साथ अन्य पिड! '0 -> पाइप: [16418291]' –

1

आपके पहले प्रश्न का उत्तर /proc/self/fd में पाया जा सकता है। इसमें फ़ाइलों (या अन्य चीजें, पाइप, सॉकेट इत्यादि) के लिए सिम्लिंक होते हैं जो आपके बैश इंस्टेंस से जुड़े होते हैं।

[email protected]:~# ls -l /proc/self/fd 
total 0 
lrwx------ 1 root root 64 May 21 02:18 0 -> /dev/pts/3 
lrwx------ 1 root root 64 May 21 02:18 1 -> /dev/pts/3 
lrwx------ 1 root root 64 May 21 02:18 2 -> /dev/pts/3 
lr-x------ 1 root root 64 May 21 02:18 3 -> /proc/15529/fd/ 
[email protected]:~# ls -l /proc/self/fd < /dev/null 
total 0 
lr-x------ 1 root root 64 May 21 02:18 0 -> /dev/null 
lrwx------ 1 root root 64 May 21 02:18 1 -> /dev/pts/3 
lrwx------ 1 root root 64 May 21 02:18 2 -> /dev/pts/3 
lr-x------ 1 root root 64 May 21 02:18 3 -> /proc/15536/fd/ 
[email protected]:~# ls -l /proc/self/fd | cat 
total 0 
lrwx------ 1 root root 64 May 21 02:18 0 -> /dev/pts/3 
l-wx------ 1 root root 64 May 21 02:18 1 -> pipe:[497711] 
lrwx------ 1 root root 64 May 21 02:18 2 -> /dev/pts/3 
lr-x------ 1 root root 64 May 21 02:18 3 -> /proc/15537/fd/ 
[email protected]:~# 

पहले उदाहरण में, आप पहले 3 फ़ाइल वर्णनकर्ता (जो मानक आउटपुट, इनपुट, और त्रुटि क्रमशः) मेरी छद्म टर्मिनल /dev/pts/3 करने के लिए सभी बिंदु देख सकते हैं। दूसरे उदाहरण में मैंने इनपुट को /dev/null पर रीडायरेक्ट कर दिया है, इसलिए मानक इनपुट फ़ाइल डिस्क्रिप्टर /dev/null पर इंगित करता है। और अंतिम उदाहरण में मैंने ls से cat के आउटपुट को पाइप के माध्यम से भेजा है, और मानक इनपुट फ़ाइल डिस्क्रिप्टर इसे प्रतिबिंबित करता है। जहां तक ​​मुझे पता है कि पाइप के दूसरे छोर पर कौन सी प्रक्रिया को खोजने का कोई तरीका नहीं है। सभी उदाहरणों में चौथी फ़ाइल डिस्क्रिप्टर है जो ls को /proc/self/fd पढ़ने के लिए हैडल का प्रतिनिधित्व करता है। इस मामले में यह /proc/15537 कहता है क्योंकि /proc/self वास्तव में /proc/pid पर एक सिम्लिंक है जहां pid/proc/self तक पहुंचने वाली प्रक्रिया का पीआईडी ​​है।

संबंधित मुद्दे