Câu hỏi Ghi nhật ký các lệnh được thực hiện trong Bash


Đôi khi trở lại, chúng tôi đã có một yêu cầu để đăng nhập các lệnh chạy trên thiết bị đầu cuối trong vỏ Bash. Điều này đã được giải quyết bằng phương tiện của một kịch bản khởi động với các nội dung cơ bản sau đây:

#!/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

Nó hoạt động tốt ngoại trừ việc nhấn ENTER ghi lại lệnh cuối cùng một lần nữa. Điều này xảy ra nhiều lần khi nhấn phím enter. Và một số người dùng có thói quen này! Có cách nào để tránh các nhật ký bổ sung này không? Ngoài ra, một mong đợi rõ ràng từ các giải pháp sẽ là một sự phân biệt giữa chỉ cần nhấn nhập một vài lần và thực sự tái chạy lệnh có thể.


1
2017-12-20 17:02


gốc


Bạn có nghĩa là như $ lịch sử không? những gì bạn cần làm là không xử lý các readlines trống. Tôi sẽ xem xét điều này sau. - j0h
Kịch bản đó có thể trông giống như làm việc tốt, nhưng nó có khả năng không. Nếu người dùng đặt một khoảng trống trên dòng trước lệnh, thì lệnh đó sẽ không được ghi lại trong lịch sử và do đó nó sẽ không được ghi lại trong tập lệnh của bạn nữa. - falconer


Các câu trả lời:


Tôi quản lý để giải quyết vấn đề ghi lại lệnh lặp lại được kích hoạt bởi phím ENTER bằng cách thay thế lời gọi "lịch sử 1" bằng "history -a> (tee -a $ HISTFILE)". Sau đó, sau khi lệnh cuối cùng được tìm thấy và ghi lại, "history -c; history -r" được chạy để loại bỏ tất cả các mục từ danh sách lệnh trong bộ nhớ của Bash và tạo lại danh sách từ bất cứ điều gì đã được lưu trong tệp lịch sử. Điều này là cần thiết để chỉ nhận được một lệnh duy nhất vào lần tiếp theo "history -a" được thực hiện. Đây là giải pháp:

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





Nếu bạn nhìn vào thư mục chính của mỗi người dùng, chúng phải là một tệp có tên .bash_history. Đây là một tập tin ẩn, vì vậy trong Nautilus bạn cần phải bấm Ctrl+H để xem nó, hoặc với ls bạn cần sử dụng -a Tùy chọn. Điều này sẽ chứa 1000 lệnh cuối cùng mà người dùng đã nhập. Vì vậy, tôi sẽ nghĩ rằng bạn chỉ có thể thường xuyên đăng nhập tập tin đó, thay vì sử dụng history chỉ huy...


0
2017-12-20 17:28



Phương thức ghi lại các lệnh thông qua "logger" nhận được thông báo cuối cùng đến / var / log / messages, điều này ít dễ bị xóa hơn một tệp trong thư mục chính của người dùng. Ngoài ra, phương pháp này giúp các lệnh đăng nhập cho tất cả người dùng và không chỉ là lệnh của tôi. - pdp