यह एक sysadmin के लिए अपने / अपने उपयोगकर्ताओं के टर्मिनलों पर छिपकर देखना संभव है?


17

जब एक मशीन में लॉग इन किया जाता है, तो मैं आउटपुट के प्रत्येक उपयोगकर्ता के छद्म टर्मिनल डिवाइस (एस) का पता लगा सकता हूं w। एक sysadmin होने के नाते, क्या यह संभव है कि उपयोगकर्ता को जागरूक किए बिना इस टर्मिनल पर छिपकर देखा जाए? दूसरे शब्दों में, मैं इस टर्मिनल पर सब कुछ अपने स्वयं के टर्मिनल पर आउटपुट के रूप में देखना चाहूंगा।

कृपया निम्नलिखित ध्यान दें:

  • यह उपयोगकर्ता गतिविधियों की निगरानी के व्यावहारिक उपयोग के मामले के लिए नहीं है: मुझे पता है कि इसके लिए सिस्टम ऑडिटिंग उपकरण हैं। मैं बस उत्सुक हूँ अगर यह किया जा सकता है।
  • मैं इस प्रश्न से अवगत हूँ और यह कवर नहीं करता कि मैं क्या पूछ रहा हूँ क्योंकि सभी समाधान सुझाए गए हैं या तो आक्रामक हैं (उपयोगकर्ता को पता होगा कि मैं क्या कर रहा हूं) या बहुत अधिक शोर उत्पन्न करता हूं ( straceसमाधान)। एक समाधान जो करीब आता है वह है जो उपयोग करने का सुझाव देता है gdb। लेकिन यह केवल मुझे दूसरे टर्मिनल के stdout को देखने देता है।

मैंने क्या कोशिश की है

मैंने अपने टर्मिनल से यह कोशिश की:

tee /dev/pts/user_pts </dev/pts/user_pts

यह मुझे प्रत्येक वर्ण को दूसरे छद्म टर्मिनल में उपयोगकर्ता प्रकार देखने की अनुमति देता है क्योंकि वे इसे टाइप करते हैं। समस्या यह है कि हर कुछ वर्ण, यह "स्किप" करेगा: यह एक टर्मिनल डिवाइस पर एक दुष्ट चरित्र दिखाएगा, लेकिन दूसरा नहीं। यह उपयोगकर्ता के छद्म टर्मिनल डिवाइस से किसी भी कमांड के निष्पादन को भी रोकता है। मुझे वास्तव में यकीन नहीं है कि ऐसा क्यों हो रहा है और क्या इसमें सुधार करने का कोई तरीका है।

मैं क्या देखना चाहूंगा

USER TERMINAL        |    MY TERMINAL
$ echo "Test"        |    # slick_command_here
Test                 |    echo "Test"
$                    |    Test

1
आप चाहते हैं ttysnoopया शायद peekfd
एन। 'सर्वनाम' मी।

जवाबों:


11

यह टर्मिनल एमुलेटर में छद्म टर्मिनल के मास्टर पक्ष के लिए एफडी है जिसे आप मॉनिटर करना चाहते हैं यदि आप यह देखना चाहते हैं कि इस पर क्या प्रदर्शित होता है। वह मास्टर fd वह तार है जो एक वास्तविक टर्मिनल पर जाता है। इस xtermपर क्या लिखा जाता है कि आपके द्वारा दबाए गए कुंजी से उत्पन्न वर्ण हैं। जो इसे पढ़ता है, वही इसे प्रदर्शित करता है।

उदाहरण के लिए, लिनक्स पर:

$ lsof -ac xterm /dev/ptmx
COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
xterm   15173 chazelas    4u   CHR    5,2      0t0 2131 /dev/ptmx

और फिर उदाहरण के लिए दौड़ें:

stty -echo -opost
strace -e read -e read=4 -p15173 2>&1 | stdbuf -o0 sh -c '
  grep "^ |" | cut -b11-60 | tr -d " " | xxd -r -p'

बेशक, यह बेहतर काम करता है यदि आप उसी प्रकार और आकार के टर्मिनल में चलते हैं जिस पर आप निगरानी करने की कोशिश कर रहे हैं। आप के साथ आकार प्राप्त कर सकते हैं:

stty size < /dev/pts/that-terminal

यह डंप करता है कि टर्मिनल के मास्टर साइड से क्या पढ़ा जाता xtermहै, इसलिए वहां क्या प्रदर्शित किया जाता है, जिसमें स्थानीय echoटाइप किया जा रहा है।

इसके बाद के -e read=4संस्करण के लिए straceहै जो xtermअपने fd 4 पर पढ़ता है के एक हेक्सडम्प को आउटपुट करने के लिए है । बाकी कमांड को वास्तविक वर्णों में बदलना है। मैंने कोशिश की peekfd -n -8 15173 4लेकिन किसी कारण के लिए केवल वही दिया जो लिखा जा रहा था।

हम -opostअपने मॉनिटरिंग टर्मिनल में किसी भी पोस्ट-प्रोसेसिंग को अक्षम करने के लिए उपयोग कर रहे हैं , ताकि xxdदास पक्ष को सब कुछ लिखकर हमारे मास्टर साइड पर अपरिवर्तित कर दिया जाए, ताकि हमारी निगरानी xtermको मॉनिटर के समान ही मिल जाए। -echoऐसा इसलिए है कि यदि मॉनिटर किए गए टर्मिनल में एप्लिकेशन एक एस्केप सीक्वेंस भेजता है जो टर्मिनल से जवाब मांगता है (जैसे कि जो कर्सर स्थिति या टर्मिनल प्रकार या विंडो शीर्षक का अनुरोध करता है), जो हमारी निगरानी xtermऔर हमारी xtermइच्छा के लिए अपना रास्ता बना देगा। साथ ही जवाब दो। हम उस की स्थानीय गूंज नहीं चाहते हैं।

आप यह भी निगरानी कर सकता है क्या पता लगाने के द्वारा टाइप किया जा रहा है writeकि एक ही एफडी के लिए सिस्टम कॉल (की जगह readके साथ writeऊपर)। ध्यान दें कि दबाने पर Enter, टर्मिनल एमुलेटर CR वर्ण भेजता है, LF नहीं। इसके अलावा, जब से हम मास्टर साइड पर ट्रेस कर रहे हैं, यदि उपयोगकर्ता टाइप करता है a<Backspace>b, तो हम सभी 3 कीस्ट्रोक्स देखेंगे भले ही टर्मिनल डिवाइस कैनोनिकल मोड में हो।

क्यों तुम्हारा काम नहीं करता है:

tee /dev/pts/user_pts </dev/pts/user_pts

टर्मिनल डिवाइस से पढ़ना उपयोगकर्ता इनपुट पढ़ रहा है, और इसे लिखना उपयोगकर्ता को प्रदर्शित करना है।

आप teeटर्मिनल डिवाइस से पढ़ने के लिए कह रहे हैं। तो यह क्या पढ़ता है (उपयोगकर्ता इनपुट) readटर्मिनल में चल रहे एप्लिकेशन (एस ) से नहीं होगा (और विज वर्सा, teeऔर वह applicationटर्मिनल इनपुट के लिए लड़ेंगे)। टर्मिनल डिवाइस के लिए लेखन, वहाँ प्रदर्शन के लिए है, यह इनपुट के रूप में इसे वहां वापस डालने के लिए नहीं है। जब तुम करोगे

echo test

( echoटर्मिनल के stdout होने के साथ ), यह वैसा ही नहीं है जैसा आपने टाइप किया था test

वर्णों को इनपुट के रूप में वापस रखने के लिए एक ioctl( TIOCSTI) है, लेकिन यहां तक ​​कि यह वास्तव में काम नहीं करेगा क्योंकि आप इसे आवेदन के बाद वापस रख सकते हैं क्योंकि पहले से ही कुछ और पढ़ा गया है, इसलिए यह उस क्रम को बदल देगा जिस पर एप्लिकेशन इनपुट पढ़ रहा है, और किसी भी तरह से, इसका मतलब है कि आप इसे बार-बार पढ़ेंगे।


1
+1 स्पष्टीकरण के लिए और बाहरी उपकरणों का उपयोग नहीं करने के लिए। मुझे आपके उत्तर के कई हिस्सों को समझने के लिए थोड़ा पढ़ने की आवश्यकता होगी, लेकिन मुझे लगता है कि मैं जो चाहता हूं, उसकी तर्ज पर यह भी है।
जोसफ आर।

5

यदि आपका OS dtrace को सपोर्ट कर रहा है, तो यह एक साधारण स्क्रिप्ट, शेल्सनोप , आपको दिए गए tty पर टाइप किए गए / मुद्रित सभी चीज़ों पर नज़र रखने की अनुमति देनी चाहिए।

यदि आप लिनक्स चला रहे हैं, तो ttysnoop एक समान काम करता था, लेकिन एक पूर्वापेक्षा के रूप में एक घुसपैठ की जरूरत थी और AFAIK वर्तमान कर्नेल के साथ और अधिक समर्थित नहीं है, वैसे भी आपके मामले में मदद नहीं करेगा। लिनक्स के साथ डायनेमिक ट्रेसिंग प्रदान करने के लिए अधिक या कम उन्नत प्रयास हैं, सिस्टमटैप, केटैप और यहां तक ​​कि डीट्रेस ताकि आप उनकी जांच कर सकें।

संपादित करें: पीकएफएफ से सावधान रहें , इसका मैनुअल पेज बताता है:

कीड़े:

शायद बहुत सारे। यदि आप जिस प्रक्रिया की निगरानी कर रहे हैं वह मर जाती है तो आश्चर्यचकित न हों।


3

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

यह निम्न कार्य करता है:

  1. सोसाइटी का उपयोग करके एक इंटरसेप्टर बनाएं, जो खुद को एक कीट के रूप में उजागर करता है।
  2. इंटरसेप्टर टी से जुड़ा हुआ है, जो $ sys टर्मिनल और $ usr टर्मिनल दोनों धाराओं को डुप्लिकेट करता है।
  3. Gdb का उपयोग $ usd टर्मिनल के बजाय इंटरसेप्टर को इंगित करने के लिए stdout / stderr फ़ाइल डिस्क्रिप्टर को बदलने के लिए किया जाता है।

मैंने देखा कि बैश लिखने से लगता है कि आप किस प्रकार का स्टैडर है, मुझे यकीन नहीं है कि अन्य प्रोग्राम भी ऐसा ही करते हैं। अगर ऐसा है तो स्टड को इंटरसेप्ट करने की जरूरत नहीं है।

इसे इस तरह कॉल करें: chmod +x /path/to/script; sudo /path/to/script <usr> <sys-adm>usrऔर sys-admटर्मिनलों के नाम, उदाहरण के लिए, कर रहे हैं /dev/pts/1। तो एक नमूना कॉल इस तरह दिखेगा sudo /path/to/script /dev/pts/1 /dev/pts/2:। आप ttyकमांड के साथ अपने टर्मिनल का पता लगा सकते हैं । और उपयोगकर्ता टर्मिनल के साथ wया ps

#!/bin/sh

[ "$1" ] || exit 1
[ "$2" ] || exit 1

usr=$1
sys=$2
utty=${1#/dev/}

ps -e -o tty= -o pid= -o user= | { 
    found_it=

    while read -r tty pid_sh owner; do
        if [ "$utty" = "$tty" ]; then
            found_it=y
            break;
        fi
    done

    [ "$found_it" ] || exit 1

    tmp=$(mktemp)
    tmp_gdb=$(mktemp)

    trap 'rm "$tmp" "$tmp_gdb"' EXIT

    socat PTY,link="$tmp",echo=0,raw,openpty,user="$owner",mode=0600 SYSTEM:"tee $sys > $usr"      &

    printf 'call dup2(open("%s", 1), 1)\ncall dup2(open("%s", 1), 2)
            detach\nquit\n' "$tmp" "$tmp" > "$tmp_gdb"
    gdb -p "$pid_sh" -x "$tmp_gdb" >/dev/null 2>&1 &

    wait
}

2

X11 के कारनामे दिखाने के लिए xkey.c नामक एक साधारण सी प्रोग्राम है। मैं आपको इसे गूगल करने दूंगा। आप उपयोगकर्ता के बारे में पता किए बिना इसका उपयोग करके एक xterm पर कीस्ट्रोक्स को कैप्चर कर सकते हैं।


मैं वास्तव में एक टर्मिनल-एमुलेटर-अज्ञेय समाधान की उम्मीद कर रहा था।
जोसेफ आर।

xkey आपको एक्स डिस्प्ले पर कीस्ट्रोक्स देगा। यह सभी xterms और किसी भी अन्य उपयोगिता होगी जो कीबोर्ड इनपुट की आवश्यकता है।
unxnut

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