सवाल बैश में निष्पादित आदेशों का लॉगिंग


कुछ समय पहले, हमें बैश खोल में टर्मिनल पर चलने वाले आदेशों को लॉग करने की आवश्यकता थी। यह अनिवार्य रूप से निम्नलिखित सामग्री के साथ स्टार्टअप स्क्रिप्ट के माध्यम से हल किया गया था:

#!/bin/bash

SESSION_LAST_COMMAND=

log_last_command() {
    local command

    command=$(history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//")

    if [[ -n "$SESSION_LAST_COMMAND" ]]; then
        logger -p local3.notice "shell user [$$]: Executed command: $command"
    fi

    SESSION_LAST_COMMAND="$command"
}

export PROMPT_COMMAND=log_last_command

यह ठीक काम करता है सिवाय इसके कि ENTER दबाकर अंतिम कमांड को दोबारा लॉग करें। यह कई बार होता है क्योंकि एंटर कुंजी दबाया जाता है। और कुछ उपयोगकर्ताओं के पास यह आदत है! क्या इन अतिरिक्त लॉग से बचने का कोई तरीका है? इसके अलावा, समाधान से एक स्पष्ट उम्मीद यह होगी कि केवल दबाने के बीच एक अंतर कुछ बार दर्ज करें और वास्तव में कमांड को फिर से चलाने के लिए संभव हो।


1
2017-12-20 17:02


मूल


आपका मतलब है कि $ इतिहास की तरह है? आपको जो करना है वह रिक्त रीडलाइन की प्रक्रिया नहीं है। मैं बाद में इसे देख लूंगा। - j0h
वह स्क्रिप्ट ठीक काम करने की तरह लग सकती है, लेकिन ऐसा नहीं है। यदि उपयोगकर्ता कमांड से पहले लाइन पर एक स्थान डालता है, तो वह आदेश इतिहास में लॉग नहीं होगा, और इसके कारण यह आपकी स्क्रिप्ट में भी लॉग नहीं होगा। - falconer


जवाब:


मैंने "इतिहास-ए> (टीई-ए $ HISTFILE)" द्वारा "इतिहास 1" आमंत्रण को प्रतिस्थापित करके ENTER कुंजी द्वारा ट्रिगर किए गए दोहराए गए कमांड लॉगिंग की समस्या को हल करने में कामयाब रहे। इसके बाद, अंतिम आदेश पाया गया और लॉग इन करने के बाद, "इतिहास-सी; इतिहास -आर" को बैश की इन-मेमोरी कमांड सूची से सभी प्रविष्टियों को निकालने के लिए चलाया जाता है और इतिहास फ़ाइल में जो कुछ भी सहेजा गया है, उससे सूची को पुन: उत्पन्न करता है। अगली बार "इतिहास-ए" निष्पादित होने पर केवल एक ही आदेश प्राप्त करना आवश्यक है। यहां समाधान है:

session_log_command() {
    local status=$?
    local command
    local cwd

    cwd=$PWD

    command=$(history -a >(tee -a $HISTFILE))

    if [[ -n "$command" ]]; then
        logger -p local3.notice "shell user [$$]: Executing command [CWD=$cwd ; $status]: $command"
        history -c; history -r
    fi
}

export PROMPT_COMMAND=session_log_command

2
2018-03-05 15:23





यदि आप प्रत्येक उपयोगकर्ता की होम निर्देशिका में देखते हैं, तो उन्हें एक फ़ाइल कहा जाना चाहिए .bash_history। यह एक छिपी हुई फाइल है, इसलिए नॉटिलस में आपको प्रेस करने की आवश्यकता है Ctrl+एच इसे देखने के लिए, या साथ ls आपको इसका उपयोग करने की ज़रूरत है -a विकल्प। इसमें उपयोगकर्ता द्वारा दर्ज किए गए अंतिम 1000 आदेश होंगे। तो मुझे लगता है कि आप बस उस फ़ाइल को नियमित रूप से लॉग इन कर सकते हैं, इसका उपयोग करने के बजाय history आदेश ...


0
2017-12-20 17:28



"लॉगर" के माध्यम से कमांड लॉगिंग की विधि संदेश को आखिरकार / var / log / संदेशों में प्राप्त करती है, जो किसी उपयोगकर्ता की होम निर्देशिका में फ़ाइल से हटाए जाने के लिए कम संवेदनशील होती है। साथ ही, यह विधि सभी उपयोगकर्ताओं के लिए लॉग कमांड में मदद करती है, न केवल मेरे लिए। - pdp