সিসাদমিনের পক্ষে কি তার ব্যবহারকারীর টার্মিনালগুলিতে শ্রবণ করা সম্ভব?


17

কোনও মেশিনে লগ ইন করার সময়, আমি প্রতিটি ব্যবহারকারীর সিউডো-টার্মিনাল ডিভাইস (গুলি) এর আউটপুট থেকে বের করতে পারি w। সিসাদমিন হওয়ায়, ব্যবহারকারীকে অবগত না করেই কি আমার পক্ষে এই টার্মিনালে শ্রবণশক্তি সম্ভব? অন্য কথায়, আমি দেখতে চাই যে এই টার্মিনালটিতে আমার নিজের টার্মিনালের আউটপুট হিসাবে সবকিছু করা হচ্ছে।

নিম্নলিখিত নোট করুন:

  • এটি ব্যবহারকারীর ক্রিয়াকলাপ পর্যবেক্ষণের ব্যবহারিক ব্যবহারের ক্ষেত্রে নয়: আমি জানি যে এর জন্য সিস্টেম অডিটিং সরঞ্জাম রয়েছে। এটা করা সম্ভব হলে আমি শুধু কৌতূহলী।
  • আমি এই প্রশ্নটি সম্পর্কে সচেতন এবং এটি যে বিষয়ে জিজ্ঞাসা করছে তা কভার করে বলে মনে হচ্ছে না যে প্রস্তাবিত সমস্ত সমাধান হ'ল আক্রমণাত্মক (ব্যবহারকারী আমি কী করছি সে সম্পর্কে সচেতন হবে) বা খুব বেশি শব্দ তৈরি করবে ( straceসমাধান)। যে সমাধানটি নিকটে আসে তা হ'ল এটি ব্যবহারের পরামর্শ দেয় gdb। তবে এটি আমাকে কেবল অন্য টার্মিনালের স্টাডআউট দেখতে দেয়।

আমি যা চেষ্টা করেছি

আমি আমার টার্মিনাল থেকে এটি চেষ্টা করেছি:

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

এটি টার্মিনাল এমুলেটরের সিউডো-টার্মিনালের মাস্টারের পাশ যা আপনি মনিটরিং করতে চান এটিতে কী প্রদর্শিত হয়েছে তা দেখতে চান। সেই মাস্টার এফডি হ'ল তারের অনুকরণ যা বাস্তব টার্মিনালে যায়। 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কি একটি hexdump আউটপুট xtermতার FD 4. কমান্ড বাকি সার্চ প্রকৃত অক্ষর যে রূপান্তর হয়। আমি চেষ্টা করেছি peekfd -n -8 15173 4কিন্তু কিছু কারণে যা কেবল যা লেখা হচ্ছে তা দিয়েছিল।

আমরা -opostআমাদের মনিটরিং টার্মিনালে কোনও পোস্ট-প্রসেসিং অক্ষম করার জন্য ব্যবহার করছি , যাতে xxdস্লেভ সাইডে লেখা সমস্ত কিছুই এটিকে আমাদের মাস্টার দিকে অপরিবর্তনীয় করে তোলে, যাতে আমাদের তদারকি পর্যবেক্ষণকৃত xtermহিসাবে একই জিনিস পায়। -echoতাই যদি নজরদারি করা টার্মিনালে অ্যাপ্লিকেশনটি যদি একটি টানা টার্মিনাল থেকে একটি উত্তর ক্রমের অনুরোধ করে (যেমন কার্সার অবস্থান বা টার্মিনালের ধরণ বা উইন্ডো শিরোনামের অনুরোধ করে) একটি অনুরোধ প্রেরণ করে, যা আমাদের পর্যবেক্ষণের পথে চলেxterm এবং আমাদের xtermইচ্ছার দিকে এগিয়ে চলে প্রত্যুত্তর আমরা এর স্থানীয় প্রতিধ্বনি চাই না।

writeসেই একই এফডিতে সিস্টেম কলগুলি অনুসরণ করে যা টাইপ করা হচ্ছে তা আপনিও নিরীক্ষণ করতে পারেন ( উপরের readসাথে প্রতিস্থাপন write)। নোট করুন যে টিপে দেওয়ার পরে Enter, টার্মিনাল এমুলেটরটি এলএফ নয়, একটি সিআর অক্ষর প্রেরণ করে। এছাড়াও, যেহেতু আমরা মাস্টার সাইডে ট্রেস করছি, যদি ব্যবহারকারী টাইপ করে a<Backspace>bতবে টার্মিনাল ডিভাইসটি ক্যানোনিকাল মোডে থাকা সত্ত্বেও আমরা সমস্ত 3 টি কীস্ট্রোক দেখতে পাব।

কেন আপনার কাজ করে না:

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

টার্মিনাল ডিভাইস থেকে পড়া হ'ল ব্যবহারকারীর ইনপুট পড়ছে এবং তাতে লেখাটি এটি ব্যবহারকারীর কাছে প্রদর্শিত হয়।

আপনি teeটার্মিনাল ডিভাইস থেকে পড়তে বলছেন । সুতরাং এটি যা পড়ে (ব্যবহারকারীর ইনপুট) readটার্মিনালটিতে চলমান অ্যাপ্লিকেশনগুলি (এবং এর বিপরীতে হবে না , teeএবং applicationএটি টার্মিনাল ইনপুটটির জন্য লড়াই করবে)। টার্মিনাল ডিভাইসে লিখন, সেখানে প্রদর্শন করার জন্য, এটি এখানে ইনপুট হিসাবে রাখার জন্য নয়। যখন তুমি কর

echo test

( echoস্ট্যাডআউটটি টার্মিনাল হওয়ার সাথে সাথে ), আপনি টাইপ করেছেন এমনটি হয় না test

অক্ষরগুলিকে ইনপুট হিসাবে ফিরিয়ে আনার জন্য একটি ioctl( TIOCSTI) রয়েছে, তবে এটি সত্যিই কাজ করবে না কারণ আপনি অ্যাপ্লিকেশনটির পরে ইতিমধ্যে আরও কিছু পড়ার পরে এটি ফিরিয়ে রাখতে পারেন , সুতরাং অ্যাপ্লিকেশনটি ইনপুট পড়ার ক্রমটি পরিবর্তন করবে এবং যে কোনও উপায়ে, এর অর্থ হ'ল আপনি বারবার এটি পড়বেন।


1
+1 ব্যাখ্যার জন্য এবং বাহ্যিক সরঞ্জাম ব্যবহার না করার জন্য। আপনার উত্তরের অনেকগুলি অংশ বোঝার জন্য আমার কিছুটা পড়া দরকার, তবে আমি এটি যা চাই তার লাইনের সাথে অনুভব করছি।
জোসেফ আর।

5

যদি আপনার ওএস ডিট্রেসকে সমর্থন করে, তবে একটি সরল স্ক্রিপ্ট, শেলসনুপ আপনাকে দেওয়া টাইটির উপর টাইপ করা / মুদ্রিত সমস্ত কিছু পর্যবেক্ষণ করার অনুমতি দেয়।

আপনি যদি লিনাক্স চালাচ্ছেন তবে tysysop অনুরূপ কাজ করত তবে পূর্বশর্ত হিসাবে একটি অনুপ্রবেশকারী কনফিগারেশন প্রয়োজন এবং এএফএইচ আর কোনওভাবে বর্তমান কার্নেলগুলির সাহায্যে সমর্থিত নয় তাই আপনার ক্ষেত্রে সহায়তা করবে না। লিনাক্স, সিস্টেমট্যাপ, কেটিপ এবং এমনকি ডিট্রেস দিয়ে গতিশীল ট্রেসিং দেওয়ার আরও বা কম উন্নত প্রচেষ্টা রয়েছে যাতে আপনি সেগুলি তদন্ত করতে পারেন।

সম্পাদনা করুন: পিকফিড থেকে সাবধান থাকুন , এর ম্যানুয়াল পৃষ্ঠাতে বলা হয়েছে:

বাগ:

সম্ভবত প্রচুর। আপনি যে প্রক্রিয়াটি পর্যবেক্ষণ করছেন তা যদি মারা যায় তবে অবাক হবেন না।


3

এই পদ্ধতির সাথে কিছুটা জিডিবি এবং টি জড়িত। আহ, এবং এটি সিউডো-টার্মিনাল অনুকরণ করতে সকেট ব্যবহার করে। এটি এটি ছাড়া কাজ করতে পারে তবে ব্যবহারকারী লক্ষ্য করবেন যে তার আউটপুট আর টার্মিনাল নয় (vi এর মতো প্রোগ্রামগুলি অভিযোগ করবে)।

এটি নিম্নলিখিতগুলি করে:

  1. সকেট ব্যবহার করে একটি ইন্টারসেপ্টর তৈরি করুন, যা নিজেকে প্রতিজ্ঞা হিসাবে প্রকাশ করে।
  2. ইন্টারসেপ্টর টিয়ের সাথে সংযুক্ত, যা both সিএস টার্মিনাল এবং $ usr টার্মিনাল উভয় প্রবাহকে সদৃশ করে।
  3. D usr টার্মিনালের পরিবর্তে ইন্টারসেপ্টারের দিকে নির্দেশ করতে stdout / stderr ফাইল বর্ণনাকারী প্রতিস্থাপন করতে Gdb ব্যবহার করা হয়।

আমি লক্ষ্য করেছি যে বাশ স্ট্যাডারকে যা লিখছে বলে মনে হচ্ছে, অন্যান্য প্রোগ্রামগুলিও এটি করে কিনা তা আমি নিশ্চিত নই। যদি এটি হয় তবে স্টিডিনকে বাধা দেওয়া হবে না।

এটা ভালো কল করুন: 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

এক্স 11 এর ব্যবহার দেখানোর জন্য xkey.c নামে একটি সাধারণ সি প্রোগ্রাম রয়েছে। আমি আপনাকে গুগল করব। আপনি এটি ব্যবহারকারীর সম্পর্কে অবগত না হয়ে xterm এ কীস্ট্রোকগুলি ক্যাপচার করতে পারেন।


আমি আসলে একটি টার্মিনাল-এমুলেটর-অজোনস্টিক সমাধানের জন্য আশা করছিলাম।
জোসেফ আর।

xkey আপনাকে এক্স ডিসপ্লেতে কীস্ট্রোক দেবে। এটি হ'ল সমস্ত এক্সটার্ম এবং অন্য কোনও ইউটিলিটি যা কীবোর্ড ইনপুট প্রয়োজন।
অবিচ্ছিন্ন

ঠিক। আমি ভেবেছিলাম আপনি xtermবিশেষভাবে বোঝানো হয়েছে ।
জোসেফ আর।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.