2011-08-25 21 views
5

Tôi đã tự hỏi, không tò mò, nếu có thể viết một tập lệnh bash ghi lại tất cả lệnh chạy trong phiên Bash/SSH. Tôi biết history là giả sử để đăng nhập tất cả các lệnh chạy nhưng nó có vẻ là rất không đáng tin cậy!Bash Command Logger

Tôi đã rối tung vào sáng nay và đã đưa ra tập lệnh bash sau đây ghi lại những gì người dùng chạy trong thiết bị đầu cuối nhưng không chạy tất cả các lệnh một cách chính xác.

prompt_read() { 
    echo -n “$(whoami)@$(hostname):$(pwd)~$ “ 
    read userinput 
} 

prompt_read 

while :; do 
    if [[ $userinput != exit ]]; then 
    logger "logit $userinput" 
    bash -c "$userinput" 
    prompt_read 
    else 
    kill -1 $PPID 
    fi 
done 

Có ai biết về bất cứ điều gì mà các bản ghi lệnh tốt hơn và đáng tin cậy hơn history

Cheers

Trả lời

8

Lý do tại sao lịch sử dường như không đáng tin cậy đối với bạn là bởi vì nó chỉ ghi vào lịch sử vào cuối của một Phiên BASH, vì vậy bạn có thể mất lệnh.

Tôi có một vài điều trong hồ sơ bash của tôi:

HISTFILESIZE=10000 # how many lines of history to store in the history file 

HISTSIZE=10000 # how many lines of history to store in a session (I think) 

HISTCONTROL=ignoredups # ignore duplicate commands 

shopt -s histappend # append history, rather than having sessions obliterate existing history 
PROMPT_COMMAND="history -a;$PROMPT_COMMAND" 

Vài cuối cùng là những người quan trọng, thiết lập của bạn PROMPT_COMMAND với history -a sẽ làm nên lịch sử gắn ngay lập tức, chứ không phải là sau phiên. Và thiết lập shopt -s histappend sẽ làm cho các phiên bash nối thêm vào tệp lịch sử, thay vì ghi đè lên lịch sử hiện có.

Một số thông tin thêm: http://linuxcommando.blogspot.com/2007/11/keeping-command-history-across-multiple.html

Thêm vào đó, nếu điều này là hữu ích cho bạn, bạn có thể thay đổi tên của tập tin lịch sử bạn sử dụng cho một phiên bash đặc biệt với biến HISTFILE môi trường.

+1

+1, btw, Cũng có thể đặt 'HISTFILE' thành, giả sử có mỗi tệp lịch sử ngày. – Hasturkun

+0

@ Hasturkun - cảm ơn vì đã nhắc đến điều đó. – birryree

4

Check-out kịch bản: http://bashshell.net/commands/using-the-script-command/

Nó ghi lại tất cả những gì xuất hiện trên thiết bị đầu cuối vào một tập tin, và iirc nó có thể phát lại phiên được ghi lại.

Bạn có thể đặt cài đặt này làm vỏ của người dùng để làm cho nó ghi lại mọi thứ khi đăng nhập.

+0

Để phát lại, bạn cần ['scriptreplay'] (http://manpages.ubuntu.com/manpages/intrepid/man1/scriptreplay.1.html). – birryree

2

Bạn có thể tìm thấy tập lệnh here để ghi lại tất cả lệnh 'bash'/nội trang vào một tệp văn bản hoặc máy chủ 'syslog' mà không cần sử dụng bản vá hoặc công cụ thực thi đặc biệt.

Bạn cũng có thể viết trực tiếp mà không cần syslog vào nhật ký.

Nó rất dễ triển khai, vì nó là một kịch bản lệnh shell đơn giản cần được gọi một lần khi khởi tạo 'bash'.