स्क्रिप्ट उपयोगिता के साथ अपने सभी टर्मिनल सत्रों को स्वचालित रूप से रिकॉर्ड कैसे करें


28

मैं जो भी हासिल करना चाहता हूं वह अपने टर्मिनल सत्रों को स्वचालित रूप से फ़ाइल करने में सक्षम करने में सक्षम है जब भी मैं याकूके / कोंसोल का उपयोग करता हूं।

अगर मैं अपने सत्र की शुरुआत में यह हासिल करना आसान है:

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

लेकिन जब भी मैं याकूके को शुरू करता हूं या एक नया टैब खोलता हूं, तो मैं स्वचालित रूप से ऊपर चलाना चाहता हूं।

.Bashrc का उपयोग करने से काम नहीं होता है क्योंकि यह अंतहीन लूप बनाता है क्योंकि 'स्क्रिप्ट' एक नया सत्र खोलता है, जो बदले में .bashrc पढ़ता है और एक और 'स्क्रिप्ट' शुरू करता है।

इसलिए संभवतः मुझे एक नया टैब खुलते ही 'स्क्रिप्ट' चलाने के लिए किसी तरह याकुके / कोंसोल को स्क्रिप्ट करने की आवश्यकता है। सवाल यह है कि कैसे?


लूप की समस्या के साथ समस्याग्रस्त समाधान का प्रयास करें, लेकिन execलाइन की शुरुआत में पूर्वसर्ग करें । इसे script -fउसी शेल पीआईडी ​​में शुरू करना चाहिए ।
एन

इस quesion के अलावा दिलचस्प etended संस्करण कैसे-बल रूट के रूप में गैर-पहिया स्क्रिप्ट के उपयोगकर्ताओं को अपने सभी सत्रों के साथ-साथ है ...
योर्डन जॉर्जियेव

जवाबों:


26

यदि कोई अपने टर्मिनल सत्रों को स्वचालित रूप से रिकॉर्ड करना चाहता है - जिसमें SSH सत्र (!) शामिल हैं - scriptउपयोगिता का उपयोग करते हुए , यहां बताया गया है कि कैसे।

.bashrcअपने होम डायरेक्टरी के अंत में निम्न पंक्ति जोड़ें , या अन्यथा /etc/bash.bashrcयदि आप केवल सभी उपयोगकर्ताओं के सत्र रिकॉर्ड करना चाहते हैं। हम शेल की मूल प्रक्रिया के लिए परीक्षण नहीं करते हैं scriptऔर फिर चलाते हैं script

लिनक्स के लिए:

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

BSD और macOS के लिए, इसमें परिवर्तन 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(Linux) या script -F(BSD और macOS) के बाद पथ को बदलकर जहाँ फ़ाइल लिखी जाती हैं, उसे आप समायोजित कर सकते हैं

यह उत्तर मानता है कि आपने scriptस्थापित किया है, निश्चित रूप से। डेबियन-आधारित वितरण पर, पैकेज scriptका हिस्सा है bsdutils


आप अपने प्रश्न और उसके शीर्षक को स्वयं संपादित कर सकते हैं। इसके editठीक नीचे दिखाई देने वाले बटन पर क्लिक करें ।
मैट '

8
आप एक फ़ाइल को एक दूसरे के भीतर दो गोले शुरू करने के बाद से फ़ाइल नाम जोड़ने के कारण एक ${RANDOM}/ और या $$फ़ाइल नाम जोड़ने पर विचार करना चाह सकते हैं । व्यक्तिगत रूप से, मैं अक्सर script.$(date -u +%Y%m%dt%H%M%S).${HOSTNAME:-$(hostname)}.$$.${RANDOM}.logयह सुनिश्चित करने के लिए उपयोग करता हूं कि फाइलें स्वचालित रूप से दिनांक / समय के अनुसार क्रमबद्ध हो जाएं और वे लगातार एबीएस के अनुरूप हों, मुझे पता है कि मेजबान ने इसे शुरू किया था, मुझे पता है कि मालिक की प्रक्रिया है, और कोई नाम टक्कर नहीं है। मैं शायद ही कभी उपयोग करता हूं ${USER}क्योंकि यह आमतौर पर केवल मेरे लिए कुछ है।
nicerobot

"सुनिश्चित करें कि आपने वास्तव में / var / log / script बनाई है और इसे दूसरों द्वारा लिखने योग्य बनाया है" आपने लिखा है। मैं सोच रहा था कि क्या इस मामले में "sudo chmod 777 / var / log / script" का उपयोग करना सुरक्षा दृष्टिकोण से उचित है।
तेओ

10

यद्यपि यह सवाल एक व्यक्ति अपने स्वयं के सत्रों को रिकॉर्ड करना चाहता था, लेकिन एक वैकल्पिक उपयोग मामला एक सिस्टम प्रशासक हो सकता है जो विभिन्न उपयोगकर्ताओं को क्या कर रहा है, इसका ट्रैक रखना चाहता है।

मुझे डर scriptहै कि सिस्टम-वाइड के अंदर चलने bashrcकी स्थिति में उपयुक्त नहीं हो सकता है जब मशीन के उपयोगकर्ता अपने सत्र से बनी रिकॉर्डिंग के लिए अनिच्छुक हों।

जो उपयोगकर्ता गुप्त रहना चाहते हैं, वे sshd को एक अलग शेल खोलने के लिए कहकर लॉगिंग को बायपास कर सकते हैं (उदा zsh) या लोड होने से bash --rcfile ___रोकने के लिए चलाएँ /etc/bash.bashrc

एक वैकल्पिक दृष्टिकोण

2008 ( संग्रहीत ) से यह गाइड उपयोगकर्ता को ssh के साथ लॉग इन करने के लिए चलने के लिए बाध्य करने के लिए एक अलग विधि का उपयोग करता है 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 करने की अनुमति देने के लिए आम है। यह उपयोगकर्ताओं को लॉग इन किए बिना फ़ाइलों को संपादित करने का एक तरीका प्रदान करता है। यदि व्यवस्थापक नहीं चाहता है कि उपयोगकर्ता ऐसा करने में सक्षम हों, तो उसे या तो 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") ||

इस मामले में दोहरे उद्धरण आवश्यक नहीं हैं, लेकिन मैं मानक अभ्यास के रूप में वैसे भी उनका उपयोग करता हूं। मैं निश्चित रूप से "x" स्विच का उपयोग करने की सलाह देता हूं grep और pgrep दोनों, सब्सट्रेट के साथ एक दुर्लभ-लेकिन-समस्यात्मक मैच से बचने के लिए।

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