LINUX.ORG.RU

Запись выполненых команд

 , , ,


0

2

Привет ЛОР.

Нужно написать скрипт на bash, который будет вести лог запущенных пользователем команд. Именно команд.

Есть замечательная тулза

script

Она, можно сказать, перевыполняет план. Мне нужно записывать только выполненные команды, а последняя записывает и нажатые клавиши. Стрелки там, пробелы, бэкспэйсы. Т.е. перенаправляет весь ввод в консоль. Не надо. Нужно записывать только то, юзер запустил. Ну и перенаправить вывод.

Какие есть другие методы решения задачи кроме

script
history
и готовых утилит.

Нужно записывать только то, юзер запустил.

разве в ~/.bash_history не то, что ты хочешь?

emulek
()
Ответ на: комментарий от Funny_sailor

Честно - я не знаю как распарсить history, чтобы отловить что-то о пользователе который запустил и время. [23:15:25][kisko@home ~]# clear

Saionji
() автор топика
Ответ на: комментарий от Saionji

Плюс history не пишет в лог команду если перед командой есть пробел. Ну, это поведение из коробки конечно.

Saionji
() автор топика
Ответ на: комментарий от Saionji

измени PS1 соответствующим образом, например

\[\033[0;37m\][\[\033[0;32m\]\A\[\033[0;37m\].\[\033[1;32m\]\u\[\033[0;37m\]@\[\033[1;36m\]\h \[\033[1;33m\]\w\[\033[0;37m\]]\[\033[1;31m\]# \[\033[00m\]

не, пардон, проглючило...

metawishmaster ★★★★★
()
Последнее исправление: metawishmaster (всего исправлений: 2)

Настрой audit

sdio ★★★★★
()
exec 4>log.txt
BASH_XTRACEFD=4
set -x
anonymous
()
Ответ на: комментарий от Saionji

Плюс history не пишет в лог команду если перед командой есть пробел. Ну, это поведение из коробки конечно.

Маны мы не читаем, конечно. Выполняй в консоли:

$ echo "$HISTCONTROL"
$ man bash
# поиск по ключевому слову HISTCONTROL

Kroz ★★★★★
()

Да, и еще по теме:

$ man bash
# Поиск HISTTIMEFORMAT
$ export HISTTIMEFORMAT='%F %T '
$ echo Test
Test
$ history
....
502  2014-05-14 00:33:19 export HISTTIMEFORMAT='%F %T '
503  2014-05-14 00:33:24 history

Kroz ★★★★★
()
Ответ на: комментарий от Saionji

Не знаю что это было, но в мане ни слова.

Там написано, что игнорируются команды, начинающиеся с пробела, если в переменной HISTCONTROL есть ignorespace или ignoreboth . То бишь это поведение настраиваемое.

Kroz ★★★★★
()
Ответ на: комментарий от Kroz

Хорошо, это работает. Но зачем. Нужна история ввода команд пользователей и вывод результата в этот же файл лога.

Saionji
() автор топика
Ответ на: комментарий от Kroz

То бишь это поведение настраиваемое.

Да, я знаю =). Я же писал

Ну, это поведение из коробки конечно.

Saionji
() автор топика
Ответ на: комментарий от Saionji

и вывод результата в этот же файл лога

Ну, для нормального варианта, думаю, нужно залазить в исходники терминала.

Не-нормальный вариант - сделать обертку, через которую пропускать команды. Но там будет куча недостатков, как то невозможность показать PS1, заморочки со сменой каталога, невозможность работы с интерактивными командами типа less и т. п. Хотя для простых вещей будет подходить (если для себя лог делаешь, а не снифать за кем-то).

Just for fun:

#!/bin/sh

LOG="log.txt"

HISTFILE="/home/`whoami`/.bash_history"

cat /dev/null > "$LOG"

while true; do
 set -o history
read -p "\$ " -e A
echo "[`date`] \$ $A" >> "$LOG"

[[ "$A" == "exit" ]] && break

bash -c  "$A" | tee -a log.txt
done

Kroz ★★★★★
()
Ответ на: комментарий от Kroz

Спасибо. Пока чего-то не работает. Тестил под Centos по ssh. Завтра буду разбираться.

Saionji
() автор топика

Хорошего способа нет

Ещё можно написать что-то типа

trap 'logger ... "$BASH_COMMAND"' DEBUG
Но это довольно ненадёжный костыль.

DonkeyHot ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.