স্ক্রিপ্ট ইউটিলিটি সহ কীভাবে আপনার সমস্ত টার্মিনাল সেশন রেকর্ড করা যায়


28

আমি যা অর্জন করতে চাই তা যখনই আমি ইয়াকুয়াক / কনসোল ব্যবহার করি তখন আমার টার্মিনাল সেশনগুলি স্বয়ংক্রিয়ভাবে ফাইল করতে রেকর্ড করতে সক্ষম হয়।

আমার অধিবেশনটির শুরুতে আমি যদি এটি করি তবে এটি অর্জন করা সহজ:

script -f /home/$USER/bin/shell_logs/$(date +"%d-%b-%y_%H-%M-%S")_shell.log

তবে আমি যখনই ইয়াকুয়াক শুরু করব বা একটি নতুন ট্যাব খুলব তখন আমি স্বয়ংক্রিয়ভাবে উপরেরটি চালাতে চাই।

.Bashrc ব্যবহার করা কার্যকর হয় না কারণ এটি 'স্ক্রিপ্ট' নতুন অধিবেশন খোলার সাথে সাথে অন্তহীন লুপ তৈরি করে, যার ফলে .bashrc পড়ে এবং অন্য 'স্ক্রিপ্ট' ইত্যাদি শুরু হয়।

সুতরাং সম্ভবতঃ নতুন ট্যাবটি চালু হওয়ার সাথে সাথে 'স্ক্রিপ্ট' চালানোর জন্য আমার ইয়াকুকে / কনসোলকে কোনওভাবে স্ক্রিপ্ট করা দরকার। প্রশ্নটা কেমন?


লুপের সমস্যাযুক্ত সমস্যা সমাধানের চেষ্টা করুন execতবে লাইনের শুরুতে প্রিপেন্ড করুন । এটি script -fএকই শেল পিআইডি-তে শুরু করা উচিত ।
হানান এন।

এই প্রশ্নটির আকর্ষণীয় প্রচ্ছদ সংস্করণ হ'ল কীভাবে নন-চাকা ব্যবহারকারীরা তাদের সমস্ত সেশন স্ক্রিপ্টের জন্য রুট হিসাবে জোর করা যায় ...
ইওর্ডান জর্জিভ

উত্তর:


26

কেউ যদি scriptইউটিলিটিটি ব্যবহার করে - এসএসএইচ সেশন (!) সহ স্বয়ংক্রিয়ভাবে তাদের টার্মিনাল সেশনগুলি রেকর্ড করতে চায় তবে কীভাবে তা এখানে রয়েছে।

.bashrcআপনার হোম ডিরেক্টরিতে শেষে নিম্নলিখিত লাইনটি যুক্ত করুন , বা অন্যথায় /etc/bash.bashrcআপনি যদি কেবলমাত্র সমস্ত ব্যবহারকারীর সেশন রেকর্ড করতে চান want আমরা শেলের প্যারেন্ট প্রসেসটি না হওয়ার জন্য পরীক্ষা করি scriptএবং তারপরে চালানো হয় script

লিনাক্সের জন্য:

test "$(ps -ocommand= -p $PPID | awk '{print $1}')" == 'script' || (script -f $HOME/$(date +"%d-%b-%y_%H-%M-%S")_shell.log)

বিএসডি এবং ম্যাকোসের জন্য, এতে পরিবর্তন script -fকরুন script -F:

test "$(ps -ocommand= -p $PPID | awk '{print $1}')" == 'script' || (script -F $HOME/$(date +"%d-%b-%y_%H-%M-%S")_shell.log)

এখানেই শেষ!

এখন আপনি যখন একটি নতুন টার্মিনাল খুলবেন আপনি দেখতে পাবেন:

Script started, file is /home/username/file_name.log

scriptআপনার হোম ডিরেক্টরিতে কোনও ফাইলের জন্য আপনার সেশনগুলি লিখে রাখবে 30-Nov-11_00-11-12_shell.logফলস্বরূপ এমন কিছু নামকরণ করা ।

আরও কাস্টমাইজেশন:

  • আপনি প্রতিটি সেশনের সাথে একটি নতুন তৈরি করার চেয়ে আপনার সেশনগুলিকে একটি বড় ফাইলে সংযুক্ত করতে পারেন script -a /path/to/single_log_file
  • script -f(লিনাক্স) বা script -F(বিএসডি এবং ম্যাকোস) এর পরে পাথ পরিবর্তন করে ফাইলগুলি কোথায় লেখা হয়েছে তা আপনি সামঞ্জস্য করতে পারেন

এই উত্তরটি অবশ্যই ধরে নিয়েছে যে আপনি অবশ্যই scriptইনস্টল করেছেন। ডেবিয়ান-ভিত্তিক বিতরণগুলিতে, প্যাকেজের scriptঅংশ bsdutils


আপনি নিজের প্রশ্ন এবং এর শিরোনাম নিজেই সম্পাদনা করতে পারেন। editএটির ঠিক নীচে প্রদর্শিত বোতামটি ক্লিক করুন ।
মাদুর

8
একে অপরের এক সেকেন্ডের মধ্যে দুটি শেল শুরু করা কোনও ফাইল-নাম সংঘর্ষের কারণ হতে পারে আপনি ফাইলের নাম ${RANDOM}এবং / অথবা যুক্ত করার বিষয়টি বিবেচনা করতে পারেন $$। ব্যক্তিগতভাবে, আমি প্রায়শই script.$(date -u +%Y%m%dt%H%M%S).${HOSTNAME:-$(hostname)}.$$.${RANDOM}.logফাইলগুলি তারিখ / সময় অনুসারে বাছাই করা হয় তা নিশ্চিত করতে ব্যবহার করি এবং তারা টিজেড জুড়ে ধারাবাহিক হয়, আমি যে হোস্টটি এটি সূচনা করেছিলাম তা জানি, আমি নিজস্ব প্রক্রিয়াটি জানি এবং কোনও নাম সংঘর্ষ নেই। আমি খুব কমই ব্যবহার করি ${USER}কারণ এটি সাধারণত আমার জন্য কিছু।
নিকোরোবট

"নিশ্চিত হয়ে নিন যে আপনি আসলে / ভার / লগ / স্ক্রিপ্ট তৈরি করেছেন এবং অন্যদের দ্বারা এটি লিখনযোগ্য করে তুলেছেন" আপনি লিখেছেন। আমি ভাবছিলাম যে এই ক্ষেত্রে "sudo chmod 777 / var / লগ / স্ক্রিপ্ট" ব্যবহার করা সুরক্ষা দৃষ্টিকোণ থেকে নেওয়া উচিত কিনা।
টিও

10

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

আমি আশঙ্কা করি যে মেশিনের ব্যবহারকারীরা তাদের সেশনগুলির রেকর্ডিং তৈরি করতে অনিচ্ছুক হলে scriptসিস্টেম- ওয়াইডের অভ্যন্তরে চালানো bashrcক্ষেত্রে উপযুক্ত নাও হতে পারে।

যেসব ব্যবহারকারী ছদ্মবেশী থাকতে চান তারা লগিংকে বাইশ করতে পারেন sshd কে একটি আলাদা শেল (উদাঃ zsh) খুলতে বা লোড bash --rcfile ___হওয়া /etc/bash.bashrcথেকে রোধ করতে চালাতে ।

একটি বিকল্প পদ্ধতির

২০০৮-এর এই গাইড ( সংরক্ষণাগারভুক্ত ) কোনও ব্যবহারকারী যখন এসএসএস দিয়ে লগ ইন করে তখন চালানোর জন্য বাধ্য করার জন্য একটি পৃথক পদ্ধতি ব্যবহার করে script, যার জন্য ব্যবহারকারীদের পাবলিক / প্রাইভেট কী দিয়ে লগ ইন করতে হবে।

এটি .ssh/authorized_keysকী এর সামনে ব্যবহারকারীর ফাইলে স্ক্রিপ্ট যুক্ত করে করা হয় :

command="/usr/local/sbin/log-session" ssh-dss AAAAB3NzaC1kc3MAAAEBAMKr1HxJz.....

log-session( সংরক্ষন ) স্ক্রিপ্ট তারপর সিদ্ধান্ত নেয় হোক বা না হোক চালানোর জন্য /usr/bin/scriptএই ব্যবহারকারীর অধিবেশন লগইন করুন।

exec script -a -f -q -c "$SSH_ORIGINAL_COMMAND" $LOGFILE

ব্যবহারকারীকে যুক্ত করা কমান্ড অপসারণ থেকে বিরত রাখতে প্রশাসকের ব্যবহারকারীর authorized_keysফাইলটির মালিকানা গ্রহণ করতে হবে।

chown root:root ~user/.ssh/authorized_keys

দুর্ভাগ্যক্রমে, এর অর্থ এই যে ব্যবহারকারী কোনও অতিরিক্ত কীগুলি নিজেকে যোগ করতে সক্ষম হবেন না বা বিদ্যমান কীটি আপোস করা থাকলে আরও গুরুত্বপূর্ণভাবে তা প্রত্যাহার করতে পারবেন না, এটি আদর্শ থেকে দূরে।

আদেশ সহকারে

Sshd- র ডিফল্ট কনফিগারেশনের ক্ষেত্রে ব্যবহারকারীরা তাদের ssh লগইনে SFTP সম্পাদন করতে দেয়। এটি ব্যবহারকারীদের জন্য পরিবর্তনগুলি লগ করা ছাড়াই ফাইল সম্পাদনা করার একটি উপায় সরবরাহ করে। প্রশাসক যদি ব্যবহারকারীরা এটি করতে সক্ষম না হন তবে তার উচিত হয় এসএফটিপি-র জন্য কিছু লগিং সক্ষম করতে হবে, বা পরিষেবাটি অক্ষম করতে হবে। তারপরেও, ব্যবহারকারীরা এখনও তাদের টার্মিনালে এ জাতীয় কিছু চালিয়ে ফাইলগুলিতে অদৃশ্য পরিবর্তন করতে পারে:

curl "http://users.own.server/server/new_data" > existing_file

সমস্ত ফাইলের ইতিহাস রেকর্ড করে এমন অনুলিপি ফাইল সিস্টেম ব্যবহার করে এমন পরিবর্তনগুলি নিরীক্ষণ করা সম্ভব।

তবে অনুরূপ কৌশলটি কোনও ব্যবহারকারীর লগ না করে কমান্ড কার্যকর করতে অনুমতি দেয়:

curl "http://users.own.server/server/secret_commands_824" | sh

আমি এর কোনও সহজ সমাধান জানি না। সম্ভাবনাগুলি হতে পারে:

  • সমস্ত নেটওয়ার্ক ডেটা লগইন করা (এবং এটি পরে আঁকানো)।
  • সমস্ত সিস্টেম কল লগ করা হচ্ছে।

এই ধরণের জিনিসটি নিরীক্ষণের মাধ্যমে সম্ভব হতে পারে ।

তবে যাইহোক ...

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

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

এটি সম্ভবত সম্ভবত প্রশাসক sudoব্যবহারকারীদের সেশনগুলি লগ করতে আগ্রহী হবে । সম্ভবত এটি একটি ভিন্ন উত্তর, বা সত্যই একটি ভিন্ন প্রশ্ন মোকাবেলা করা যেতে পারে।


2

পরিবর্তে:

test "$(ps -ocommand= -p $PPID | awk '{print $1}')" == 'script' ||

আমি ব্যবহার করব:

grep -qx "$PPID" <(pgrep -x "script") ||

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

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