एक कमांड को कैसे ट्रिक किया जाए, यह सोचकर कि इसका आउटपुट टर्मिनल पर जा रहा है


38

एक कमांड दिया गया है जो अपने व्यवहार को बदलता है जब इसका आउटपुट टर्मिनल पर जा रहा है (जैसे रंगीन आउटपुट का उत्पादन), तो उस व्यवहार को परिवर्तित व्यवहार को संरक्षित करते हुए पाइप लाइन में कैसे पुनः निर्देशित किया जा सकता है? उसके लिए एक उपयोगिता होनी चाहिए, जिसके बारे में मुझे जानकारी नहीं है।

कुछ कमांड, जैसे grep --color=always, व्यवहार को मजबूर करने के लिए विकल्प झंडे होते हैं, लेकिन सवाल यह है कि उन कार्यक्रमों के आसपास कैसे काम किया जाए जो पूरी तरह से उनके आउटपुट फ़ाइल डिस्क्रिप्टर के परीक्षण पर निर्भर करते हैं।

अगर यह मायने रखता है, तो मेरा खोल bashलिनक्स पर है।


आपको यह जानना होगा कि कमांड अपनी आउटपुट फाइल डिस्क्रिप्टर का परीक्षण कैसे करता है और किसी तरह से आउटपुट टर्मिनल से देखे जाने वाले परिणामों के अनुरूप परिणाम लौटाता है।
एंड्रयू हेनले

जवाबों:


21

आप का उपयोग करके आपको जो चाहिए वह मिल सकता है unbuffer

unbuffera tcl/ expectscript है। स्रोत को देखो अगर तुम चाहते हो मनुष्य में CAVEATS अनुभाग पर भी ध्यान दें।

यह भी ध्यान दें कि यह उपनामों को निष्पादित नहीं करता है जैसे:

alias ls='ls --color=auto'

जब तक कोई स्टीफन चेज़लस द्वारा बताई गई कोई ट्रिक नहीं जोड़ता:

यदि आप एक alias unbuffer='unbuffer '(अनुगामी स्थान पर ध्यान दें) करते हैं, तो बाद में उपनाम का विस्तार किया जाएगा unbuffer


एलियास पर नोट ने स्वीकार किया - यह किसी भी अन्य शेल निर्माणों जैसे बिल्डिन और फ़ंक्शंस के साथ भी काम नहीं करेगा।
आमिर

4
यदि आप एक alias unbuffer='unbuffer '(अनुगामी स्थान पर ध्यान दें) करते हैं, तो बाद में उपनाम का विस्तार किया जाएगा unbuffer
स्टीफन चेजेलस

unbufferयह है! sudo apt install expect- यह स्पष्ट नहीं था।
loxaxs

22

टूलसेट का इतिहास

आप ऐसे उपकरण को चाहने वाले पहले व्यक्ति नहीं हैं। लोग 30 साल से ऐसे उपकरण चाहते हैं। और वे लगभग लंबे समय से अस्तित्व में हैं।

इस तरह की चीज़ के लिए सबसे पहला उपकरण डैनियल जे। बर्नस्टीन का "पीटीआई" पैकेज था, जिसे रिच साल्ज़ ने "जिनसु चाकू" के रूप में वर्णित किया था, जिसे बर्नस्टीन ने 1990 के दशक में नेटहॉक (सिक!) को धोखा देने के लिए वापस लिखा था। "Pty" पैकेज का संस्करण 4 1992 में प्रकाशित किया गया था comp.sources.unix(वॉल्यूम 25 अंक 127 से 135 तक)। यह अभी भी वर्ल्ड वाइड वेब पर लोकल है। पॉल विक्सी ने उस समय इसका वर्णन किया:

मैं क्या कह सकता हूँ? यह स्लाइस, यह डाइस करता है, यह बर्तन धोता है, यह कुत्ते को चलता है। यह "बस काम करता है", जिसका अर्थ है कि यदि आप निर्देशों का पालन करते हैं तो आपको बिना बालों के खींचने या दांतों या अन्य मानक पोर्टिंग गतिविधियों के बिना एक कामकाजी पैकेज मिलेगा।

बर्नस्टीन ने बाद में इसे अपडेट किया, मथेन ने 1999-04-07 के पहले या बाद में, "ptyget" पैकेज के साथ, जिसकी उन्होंने घोषणा की:

मैंने एक नया छद्म ट्टी एलोकेटर, पेंटीगेट एक साथ रखा है। एक अल्फा संस्करण है ftp://koobera.math.uic.edu/pub/software/ptyget-0.50.tar.gz। एक ptyget मेलिंग सूची है; शामिल होने के लिए, एक खाली संदेश भेजें djb-ptyget-requ...@koobera.math.uic.edu। मैंने स्क्रैच से पेंटीज के इंटरफ़ेस को डिज़ाइन किया है। यह मटर की तुलना में बहुत अधिक मॉड्यूलर है; मूल पेंटी इंटरफ़ेस को अब तीन टुकड़ों में विभाजित किया गया है:

  • ptyget: एक छोटा, निम्न-स्तरीय कार्यक्रम - पैकेज में एकमात्र सेट्यूइड प्रोग्राम - जो एक नया छद्म-ट्टी आवंटित करता है और इसे आपकी पसंद के कार्यक्रम में भेजता है।
  • ptyspawn: एक और छोटा कार्यक्रम जो छद्म ट्टी के तहत एक बच्चे की प्रक्रिया को चलाता है, इसके बाहर निकलने और स्टॉप के लिए देखने के लिए इंतजार कर रहा है
  • ptyio: एक और, केवल थोड़ा बड़ा, प्रोग्राम जो डेटा को आगे और पीछे ले जाता है

पुराने गिंसू चाकू ptyको अब वर्तनी दिया गया है ptybandage, जो इसका पर्याय है ptyget ptyio -t ptyspawn; pty -d, छद्म ttys के लिए नेटवर्क कार्यक्रमों को संलग्न करने के लिए, अब वर्तनी है ptyrun, जो के लिए एक पर्याय है ptyget ptyio ptyspawn; और के nobufलिए एक पर्याय है ptyget ptyio -r ptyspawn -23x। मैंने सत्र प्रबंधन सुविधाओं को अलग पैकेज में विभाजित किया है।

वह अलग पैकेज "सेस" पैकेज था।

"पीटगेट", संयोगवश, बहुत प्रारंभिक संस्करण के उदाहरण के लिए उल्लेखनीय है, और कुछ प्रकाशित उदाहरणों में से एक है, बर्नस्टीन का कभी प्रकाशित "रीडो" बिल्ड सिस्टम नहीं है। dependonके लिए एक स्पष्ट अग्रदूत है redo-ifchange

प्रयोग

ptybandage

ptybandageवह है जो लोग आमतौर पर लॉगिन सत्र में चाहते हैं। इसका प्राथमिक उपयोग मामला ऐसे कार्यक्रम बना रहा है जो संवेदनशील हैं कि क्या उनके मानक इनपुट, आउटपुट, या त्रुटियां टर्मिनलों से जुड़े हैं, इस तरह से संचालित होते हैं, भले ही वे वास्तव में शेल पाइपलाइनों में हों, या उनके मानक फ़ाइल विवरणकर्ता फ़ाइल में पुनर्निर्देशित हों।

इसे चलाने के लिए एक कमांड लेता है (जिसे एक उचित बाहरी कमांड होना चाहिए, निश्चित रूप से) और इसे इस तरह से चलाता है कि यह सोचता है कि इसका मानक इनपुट, आउटपुट और त्रुटि टर्मिनल से जुड़ी हुई है, जो उन लोगों से जुड़ रहा है ptybandage। मूल मानक इनपुट, आउटपुट और त्रुटि।

यह नौकरी नियंत्रण के गोले के तहत चलने की बारीकियों से संबंधित है, यह सुनिश्चित करता है कि एक टर्मिनल STOP चरित्र न केवल बंद हो जाता है, ptybandageबल्कि आंतरिक टर्मिनल से जुड़े कार्यक्रम को भी बंद कर देता है।

ptyrun

ptyrunआमतौर पर लोग टीसीपी नेटवर्क सर्वर में क्या चाहते हैं। इसका प्राथमिक उपयोग मामला दूरस्थ निष्पादन वातावरण है जो स्वयं टर्मिनल सेट नहीं करता है, ऐसे प्रोग्राम चला रहा है जो टर्मिनल नहीं होने पर वांछित रूप से संचालित होते हैं।

यह जॉब कंट्रोल शेल के तहत चलने की उम्मीद नहीं करता है, और यदि कमांड चलाया जा रहा है तो स्टॉप सिग्नल प्राप्त होता है, इसे बस पुनरारंभ किया जाता है।

उपलब्ध टूलसेट

ड्रू नेल्सन दोनों "pty" संस्करण 4 और "ptyget" प्रकाशित करता है।

पॉल जार्क पाइगेट का एक निश्चित संस्करण प्रकाशित करता है, जो मूल में ऑपरेटिंग-सिस्टम-विशिष्ट छद्म-टर्मिनल डिवाइस ioctls से निपटने का प्रयास करता है जो कि ऑपरेटिंग सिस्टम वास्तव में अब प्रदान नहीं करते हैं।

नोश स्रोत पैकेज वर्कआलाइक ptybandangeऔर ptyrunस्क्रिप्ट के साथ आता है , जो लॉरेंट बरकोट के execlineटूल और नॉश पैकेज के स्वयं के छद्म टर्मिनल प्रबंधन कमांड का उपयोग करता है। Nosh संस्करण 1.23 के अनुसार ये nosh- टर्मिनल-एक्स्ट्रा पैकेज में पहले से उपलब्ध हैं। (पहले के संस्करणों ने केवल उन्हें स्रोत से निर्मित लोगों को आपूर्ति की थी।)

कुछ उदाहरण का उपयोग करता है

Jurjgen Oskam ptybandageने AIX पर इनपुट का उपयोग करके एक प्रोग्राम के लिए एक प्रोग्राम से इनपुट फीड किया है, जो एक पासवर्ड प्रॉम्प्ट के लिए अपने कंट्रोलिंग टर्मिनल को खोलता है और पढ़ता है:

$ ptybandage dsmadmc << EOF> uit.txt
joskam
पारण शब्द
क्वेरी सत्र
क्वेरी प्रक्रिया
छोड़ना
EOF

एंडी ब्रैडफ़ोर्डptyrunbgplgsh ने नेटवर्क के माध्यम से इंटरएक्टिव राउटर कंट्रोल प्रोग्राम को सुलभ बनाने के लिए डेमोंटोल्स और ucspi-tcp के तहत OpenBSD पर उपयोग करते हुए यह सोचा कि यह एक टर्मिनल से बात कर रहा है:

#! / Bin / श
2> और 1 निष्पादित करें
निष्पादित एन्विडगिड साक्षात्कार tcpserver -vDRHl0 0 23 ptyrun / usr / bin / bgplgsh

आगे की पढाई


इतिहास में सबक के लिए धन्यवाद, लेकिन आपके द्वारा सुझाए गए उपकरण आधुनिक लिनक्स वितरण में उपलब्ध नहीं हैं, इसलिए उपयोगी नहीं हैं।
आमिर

4
हाइपरलिंक्स का एक समूह है और उत्तर का एक पूरा भाग जहां उपकरण निश्चित रूप से उपलब्ध हैं।
JdeBP

1
आपकी क्या राय है expect?
CMCDragonkai

20

आप सोसाइटी का उपयोग एक pty से जुड़ी प्रक्रिया को शुरू करने के लिए कर सकते हैं , और एक फाइल में pty के दूसरे सिरे को जोड़ने के लिए socialat प्राप्त कर सकते हैं। कौन सा AFAIU वही है जो आपने पूछा था:

socat EXEC:"my-command",pty GOPEN:mylog.log

यह विधि वापस आने के लिए isattyकहा जाएगा और एक प्रक्रिया जो केवल उसी पर निर्भर करती है उसे आउटपुट नियंत्रण कोड के लिए मूर्ख बनाया जाएगा। ध्यान दें कि कुछ प्रक्रियाएं (विशेष रूप से ) पर्यावरण चर के मूल्य की भी जांच करती हैं , इसलिए आपको इसे कुछ उचित जैसे सेट करने की आवश्यकता हो सकती हैmy-commandtruegrepTERM"xterm"


13

वहाँ भी एक अच्छा समाधान यहाँ कार्ल यूजर द्वारा सुपर उपयोगकर्ता पर पोस्ट किया गया है :

एक छोटी साझा लाइब्रेरी संकलित करें:

echo "int isatty(int fd) { return 1; }" | gcc -O2 -fpic -shared -ldl -o isatty.so -xc -

फिर अपने आदेश को इस isatty(3)ओवरराइड को गतिशील रूप से लोड करने के लिए कहें :

LD_PRELOAD=./isatty.so mycommand

यह वहाँ बाहर हर आदेश के लिए काम नहीं कर सकता है, यहां तक ​​कि कुछ अप्रत्याशित तरीके से टूट सकता है, लेकिन शायद ज्यादातर मामलों में काम करेगा।


2
MacOS उपयोगकर्ताओं के लिए, आप उपयोग करके एक ही व्यवहार प्राप्त कर सकते हैंDYLD_INSERT_LIBRARIES=./isatty.so DYLD_FORCE_FLAT_NAMESPACE=y mycommand
क्रिस्टोफर Shroba

12

कैसे उपयोग करने के बारे में script(1)?

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

script -q -c 'ls -G' out_file

संरक्षित रंग कोड के साथ lsउत्पादन को बचाएंगे out_file


यह यहाँ काम नहीं करता है। रंगों को कैसे संरक्षित किया जाता है? क्या कोई ऐसा उपकरण है जिसे मुझे out_fileअपने रंगों के साथ आउटपुट के लिए उपयोग करना चाहिए ?
किरा

1
@ ANSI रंग से बच दृश्यों के साथ फ़ाइलें देखने के लिए, मैं उपयोग करता हूं less -R। इस मामले में, हालांकि, मैं चाहता था कि आउटपुट पाइपलाइन में जारी रहे, जो अंततः मेरे टर्मिनल में समाप्त हो गया। catचित्रण के लिए उपयोग करना , यह कुछ ऐसा था script -q -c 'ls -G' /dev/null | cat, जो typescriptफ़ाइल को पूरी तरह से दबा देता है , केवल कार्यक्रम के आउटपुट को छोड़कर।
अमीर

एक फ़ाइल बनाने से बचने के लिए, केवल एक डैश ( -) scriptआउटपुट फ़ाइल के रूप में उपयोग करें , छूट के लिए:script -q -c 'ls -G' -
फ्रैंकलिन पिअत

0

@ आमिर के उत्तर के आधार पर , यहाँ एक स्क्रिप्ट है जो उत्पन्न करती है और फिर रनटाइम में लाइब्रेरी शामिल करती है:

#!/bin/bash
set -euo pipefail

function clean_up {
  trap - EXIT # Restore default handler to avoid recursion
  [[ -e "${isatty_so:-}" ]] && rm "$isatty_so"
}
# shellcheck disable=2154 ## err is referenced but not assigned
trap 'err=$?; clean_up; exit $err' EXIT HUP INT TERM

isatty_so=$(mktemp --tmpdir "$(basename "$0")".XXXXX.isatty.so)
echo "int isatty(int fd) { return 1; }" \
  | gcc -O2 -fpic -shared -ldl -o "$isatty_so" -xc -
# Allow user to SH=/bin/zsh faketty mycommand
"${SH:-$SHELL}" -c 'eval $@' - LD_PRELOAD="$isatty_so" "$@"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.