Bash и HISTTIMEFORMAT в нём (как вытащить время в скрипте.)

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Ответить
Аватара пользователя
FoXKa
Сообщения: 214
ОС: ОкнаXP

Bash и HISTTIMEFORMAT в нём

Сообщение FoXKa »

Привет всем.у меня ред хет.
вопрос в следующем.
в самом bash есть интересная команда которая выводит список того что вы делали на сервере.
пример такой:

Код: Выделить всё

1016  09/12/10 11:08:42 cat /etc/fstab
 1017  09/12/10 11:33:04 df -h
 1018  09/12/10 11:33:14  chkconfig --list |grep "3:on"
 1019  09/12/10 11:33:29 chkconfig kudzu off
 1020  09/12/10 11:33:35  chkconfig --list |grep "3:off"
 1021  09/12/10 11:34:21 netstat -rn |grep 80
 1022  09/12/10 11:34:26 netstat -an |grep 80
 1023  09/12/10 11:34:31 netstat -an
 1024  09/12/10 11:34:41 rpm -qa |grep http
 1025  09/12/10 11:34:54 rpm -e httpd-2.0.52-41.ent.7 httpd-suexec-2.0.52-41.ent.7
 1026  09/12/10 11:35:18 ps auxw |grep http
 1027  09/12/10 11:35:21 ps auxw
 1028  09/12/10 11:35:34 ps auxw |grep otpserv
 1029  09/12/10 11:35:43 ps auxw |grep authserv

я прописал у себя в

Код: Выделить всё

/etc/profile
след. код

Код: Выделить всё

export HISTTIMEFORMAT="%d/%m/%y %T "
что бы у меня в хисторях выводилось время когда пользователь вводил команду.
так вот - когда человек пишет команду history под bashем то всё коректно отображается, а когда это дело запускается из под скрипта, то ни чего не выводится. как заставить систему выдовать хистори из баша со временем и с командами как выводит она человеку ?

вот мой кусок скрипта:

Код: Выделить всё

#!/bin/bash
echo '======================================================'
echo "                  History of root's comands"
echo
echo `history `
#echo history |grep `date '+%d/%m/%y'``
echo
echo '======================================================'

и вот что я виду на выходе:

Код: Выделить всё

======================================================
                  History of root's comands



======================================================

т.е пустоту.
помогите плз победить данную проблемку. а то я уже в тупик зашёл.
Спасибо сказали:
allez
Сообщения: 2223
Статус: Не очень злой админ :-)
ОС: SuSE, CentOS, FreeBSD, Windows

Re: Bash и HISTTIMEFORMAT в нём

Сообщение allez »

Не надо искать тупиков там, где их нет. ;) Если в окружении скрипта переменная HISTTIMEFORMAT не установлена, значит ее надо... правильно, установить. :)
Для этого либо запускайте свой скрипт командой вида HISTTIMEFORMAT="%d/%m/%y %T " script.sh либо добавьте в свой скрипт эту строчку:

Код: Выделить всё

HISTTIMEFORMAT="%d/%m/%y %T "
Спасибо сказали:
Аватара пользователя
FoXKa
Сообщения: 214
ОС: ОкнаXP

Re: Bash и HISTTIMEFORMAT в нём

Сообщение FoXKa »

allez писал(а):
09.12.2010 10:10
Не надо искать тупиков там, где их нет. ;) Если в окружении скрипта переменная HISTTIMEFORMAT не установлена, значит ее надо... правильно, установить. :)
Для этого либо запускайте свой скрипт командой вида HISTTIMEFORMAT="%d/%m/%y %T " script.sh либо добавьте в свой скрипт эту строчку:

Код: Выделить всё

HISTTIMEFORMAT="%d/%m/%y %T "

вы наверное меня не поняли. у меня не отрабатывает команда history в скрпипте. а про время я написал для того что бы описать задачу в целом! - вытаскивать историю команд не через файл /root/.bash_history а на прямую - т.е как видит человек при отрабатывании команды history с переменной HISTTIMEFORMAT.

теперь ясен вам мой вопрос ? :rolleyes:
Спасибо сказали:
Аватара пользователя
oper777
Сообщения: 411
ОС: gentoo
Контактная информация:

Re: Bash и HISTTIMEFORMAT в нём

Сообщение oper777 »

Добавьте в shebang параметр -i:

Код: Выделить всё

#!/bin/bash -i


Кстати, использовать эти кавычки - `` - уже deprecated, сейчас используют $(command) вместо `command`
Но у вас не нужно использовать их вообще, как и команду echo.
Спасибо сказали:
allez
Сообщения: 2223
Статус: Не очень злой админ :-)
ОС: SuSE, CentOS, FreeBSD, Windows

Re: Bash и HISTTIMEFORMAT в нём

Сообщение allez »

FoXKa писал(а):
09.12.2010 10:56
теперь ясен вам мой вопрос ?
Теперь ясен. :) Собственно, Вам на него уже ответили.
Спасибо сказали:
Аватара пользователя
FoXKa
Сообщения: 214
ОС: ОкнаXP

Re: Bash и HISTTIMEFORMAT в нём

Сообщение FoXKa »

oper777 писал(а):
09.12.2010 12:22
Добавьте в shebang параметр -i:

Код: Выделить всё

#!/bin/bash -i


Кстати, использовать эти кавычки - `` - уже deprecated, сейчас используют $(command) вместо `command`
Но у вас не нужно использовать их вообще, как и команду echo.

не работает. вы сами то пробовали?

allez писал(а):
09.12.2010 12:54
FoXKa писал(а):
09.12.2010 10:56
теперь ясен вам мой вопрос ?
Теперь ясен. :) Собственно, Вам на него уже ответили.

не рабочий вариант он дал :(
Спасибо сказали:
Аватара пользователя
oper777
Сообщения: 411
ОС: gentoo
Контактная информация:

Re: Bash и HISTTIMEFORMAT в нём

Сообщение oper777 »

FoXKa писал(а):
09.12.2010 13:27
не работает. вы сами то пробовали?


Конечно. И всё работает.

Код: Выделить всё

$ cat ./new.sh
#!/bin/bash -i

echo ===== begin =====
history
echo ==== end ====

$ ./new.sh
===== begin =====
    1  ls -la
    2  chmod +X *
    3  ls -la
ВЫРЕЗАНО
  497  cd /net/anna/
  498  cd Int_Ed/
  499  ls
  500  mc
==== end ====

$


Работает даже ваш вариант с echo `history`, правда вывод получается без переносов строк.

На всякий случай, у меня bash 4.1.7

UPD: В RedHat же bash древний, сейчас проверил в Centos в bash 3.2.25 - там действительно не работает..

UPD2: может тогда просто делать "cat -n $HISTFILE" ?
Спасибо сказали:
Аватара пользователя
FoXKa
Сообщения: 214
ОС: ОкнаXP

Re: Bash и HISTTIMEFORMAT в нём

Сообщение FoXKa »

oper777 писал(а):
09.12.2010 13:49
FoXKa писал(а):
09.12.2010 13:27
не работает. вы сами то пробовали?


Конечно. И всё работает.

Код: Выделить всё

$ cat ./new.sh
#!/bin/bash -i

echo ===== begin =====
history
echo ==== end ====

$ ./new.sh
===== begin =====
    1  ls -la
    2  chmod +X *
    3  ls -la
ВЫРЕЗАНО
  497  cd /net/anna/
  498  cd Int_Ed/
  499  ls
  500  mc
==== end ====

$


Работает даже ваш вариант с echo `history`, правда вывод получается без переносов строк.

На всякий случай, у меня bash 4.1.7

UPD: В RedHat же bash древний, сейчас проверил в Centos в bash 3.2.25 - там действительно не работает..

UPD2: может тогда просто делать "cat -n $HISTFILE" ?

да там дата в юниксом формате :( переводить нормально не нашёл как. только приблизительное время получается...
Спасибо сказали:
Аватара пользователя
oper777
Сообщения: 411
ОС: gentoo
Контактная информация:

Re: Bash и HISTTIMEFORMAT в нём

Сообщение oper777 »

Ну дату можно переводить командой

Код: Выделить всё

$ date -d @1291876304
Чтв Дек  9 11:31:44 YEKT 2010


Пока не сообразил, как форматировать вывод, ведь в файле дата хранится на отдельной строке... Каким-нибудь awk или sed.... Надо подумать...

UPD: родилось следующее:

Код: Выделить всё

cat ./.bash_history| while read data; do data=$(date -d @${data/\#/}); read command; echo "Команда $command выполнена $data"; done


Ну или попробовать поставить zsh, мож там history работает как надо..
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU
Контактная информация:

Re: Bash и HISTTIMEFORMAT в нём

Сообщение sash-kan »

если шелл не интерактивный, то
1. в нём не установлена переменная HISTFILE
2. в нём не включена builtin функция history. включить:
set -o history
после этого команда history заработает как и в интерактивном шелле.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
FoXKa
Сообщения: 214
ОС: ОкнаXP

Re: Bash и HISTTIMEFORMAT в нём

Сообщение FoXKa »

sash-kan писал(а):
09.12.2010 16:16
если шелл не интерактивный, то
1. в нём не установлена переменная HISTFILE
2. в нём не включена builtin функция history. включить:
set -o history
после этого команда history заработает как и в интерактивном шелле.

Спасибо. вы были совершено правы.
теперь у меня всё работает как надо:

Код: Выделить всё

#!/bin/bash -i
echo '======================================================'
echo "                  History of root's comands"
set -o history
history |grep `date '+%d/%m/%y'` |grep -v "#"
echo
echo '======================================================'



oper777 писал(а):
09.12.2010 14:40
Ну дату можно переводить командой

Код: Выделить всё

$ date -d @1291876304
Чтв Дек  9 11:31:44 YEKT 2010


Пока не сообразил, как форматировать вывод, ведь в файле дата хранится на отдельной строке... Каким-нибудь awk или sed.... Надо подумать...

UPD: родилось следующее:

Код: Выделить всё

cat ./.bash_history| while read data; do data=$(date -d @${data/\#/}); read command; echo "Команда $command выполнена $data"; done


Ну или попробовать поставить zsh, мож там history работает как надо..

Ваш вариант тоже рабочий. спасибо и вам!
Спасибо сказали:
Аватара пользователя
FoXKa
Сообщения: 214
ОС: ОкнаXP

Re: Bash и HISTTIMEFORMAT в нём

Сообщение FoXKa »

возникла новая напастия.
по какой-то не понятной мной причине скрип не работает ч\з кронтаб. т.е если ручками его запустить он отрабатывает так как мне надо, а если по расписанию то данных нет. что делать? помогите пожалуйста. маны почитал - ни чего не нашёл такого.
Спасибо сказали:
allez
Сообщения: 2223
Статус: Не очень злой админ :-)
ОС: SuSE, CentOS, FreeBSD, Windows

Re: Bash и HISTTIMEFORMAT в нём

Сообщение allez »

Ну, начнем с сакраментального вопроса, связанного с кронтабами. :)
Ко всем ли командам, использованным в скрипте, указаны полные пути? Если нет, то нужно будет либо указать их, либо прописать в переменной PATH.
Спасибо сказали:
Аватара пользователя
FoXKa
Сообщения: 214
ОС: ОкнаXP

Re: Bash и HISTTIMEFORMAT в нём

Сообщение FoXKa »

вот мои скрипты:

Код: Выделить всё

# cat  /home/pavelkr/net/log2.sh
#!/bin/bash -i
if [ ! -d /var/log/mon ]; then
        mkdir -p -m 755 /var/log/mon
fi

if [ ! -d /var/log/mon/old ]; then
        mkdir -p -m 755 /var/log/mon/old
fi

if [ ! -d /net/server_logs/`hostname |cut -d '.' -f1` ]; then
        mkdir -p -m 755 /home/pavelkr/net/server_logs/`hostname |cut -d '.' -f1`
fi

LOG_FILE=`hostname |cut -d '.' -f1`_`date '+%d.%m.20%y_%H-%M.log'`
cd /var/log/mon
/home/pavelkr/net/log1.sh >> $LOG_FILE
cp $LOG_FILE /home/pavelkr/net/server_logs/`hostname |cut -d '.' -f1`
mail `cat /home/pavelkr/net/mail_list` -s "`hostname |cut -d '.' -f1` linux server log e-mail notification" < $LOG_FILE
mv /var/log/mon/$LOG_FILE /var/log/mon/old

Код: Выделить всё

# cat  /home/pavelkr/net/log1.sh
#!/bin/bash -i
curdate=`date '+%d.%m.20%y-%H:%M'`
echo '======================================================'
echo "Date: $curdate"
echo "System information for `hostname`"
echo
echo "Host configuration of $curdate"
echo '======================================================'
echo "                  SYSTEM NAME"
/bin/uname -a
echo
echo "                  SYSTEM MEMORY"
/bin/grep MemTotal /proc/meminfo
echo
echo "                  CPU "
/bin/grep 'processor' /proc/cpuinfo
echo '_____________________________________________________________'
echo "CPU phisical TOTAL = " `grep 'processor' /proc/cpuinfo | wc -l`
echo
echo '======================================================'
echo "                  Network configuration"
echo
/sbin/ifconfig
echo
/bin/netstat -rn
echo
echo '======================================================'
echo "                  Disk configuration"
echo
echo "                  /etc/mtab"
/bin/cat /etc/mtab
echo
echo "                  df -h"
echo
/bin/df -h
echo
echo "                  ===/etc/fstab==="
echo
/bin/cat /etc/fstab
echo
echo "                  RAID"
/bin/cat /proc/mdstat
echo
echo '======================================================'
echo "                  Last autification by date" `date '+%b %e'`":"
echo
echo "                  cat /var/log/secure"
echo
/bin/cat /var/log/secure |grep "`date '+%b %e'`"
echo
echo "                  cat /var/log/messages"
echo
/bin/cat /var/log/messages |grep "`date '+%b %e'`"
echo
echo "                 Who is found on `hostname` presently"
echo
/usr/bin/who
echo
echo "                 Who entered at on `hostname` in past"
echo
/usr/bin/last
echo
echo '======================================================'
echo "                  dmesg"
echo
/bin/dmesg -c
echo
echo '======================================================'
echo "                  History of root's comands"
echo
echo $HISTFILE
echo
set -o history
history |grep `date '+%d/%m/%y'` |grep -v "#"
echo
echo '======================================================'
echo "                  Process in up:"
echo "                  IPTABLES :"
echo
/etc/init.d/iptables status
echo
echo "                  Oracle instances"
echo
/bin/ps auwx  |grep way4
echo
echo
/bin/ps auwx  |grep smon
echo
echo '======================================================'
echo '                  Proccess apache'
echo
/bin/ps auwx | grep http
echo
echo '                  SAMBA'
echo
/bin/ps auwx |grep smbd
echo
echo '======================================================'
echo '##########################'
/bin/cat /etc/redhat-release
echo
/bin/uname -a
echo
echo '                  UPTIME'
/usr/bin/uptime
echo
echo '##########################'
echo  $curdate

и собственно сам крон:

Код: Выделить всё

# crontab -l
58 23 * * * /home/pavelkr/net/log2.sh >/dev/null 2>&1


я повторюсь - если запускаешь ручками скрип - то он отрабатывает на хисторях нормально. а если по crontabу идёт скипт то хистори не печатается.
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Bash и HISTTIMEFORMAT в нём

Сообщение watashiwa_daredeska »

FoXKa писал(а):
14.12.2010 13:49
и собственно сам крон:
Уберите ">/dev/null 2>&1" и смотрите, что на почту присылает.
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4455
Статус: GNU generation
ОС: Debian GNU/Linux

Re: Bash и HISTTIMEFORMAT в нём

Сообщение Rootlexx »

FoXKa писал(а):
14.12.2010 13:49
если запускаешь ручками скрип - то он отрабатывает на хисторях нормально. а если по crontabу идёт скипт то хистори не печатается

(man bash) писал(а):When bash is invoked as an interactive login shell, or as a non-interactive shell with the --login option, it first reads and executes commands from the file /etc/profile, if that file exists. After reading that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in that order, and reads and executes commands from the first one that exists and is readable.
...
When an interactive shell that is not a login shell is started, bash reads and executes commands from ~/.bashrc, if that file exists.

Оболочка, в которой выполняется /home/pavelkr/net/log2.sh, является интерактивной (благодаря опции "-i"), но не начальной, а только начальная оболочка включает /etc/profile, в котором переменной окружения HISTTIMEFORMAT присваивается заданное значение. В результате вывод history в /home/pavelkr/net/log1.sh не содержит дату, и потому не подходит под шаблон grep.
При ручном же запуске оболочка, в которой выполняется скрипт, является дочерним процессом начальной оболочки, в которой значение переменной окружения HISTTIMEFORMAT установлено и экспортируется, поэтому всё работает так, как ожидалось.
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Bash и HISTTIMEFORMAT в нём

Сообщение watashiwa_daredeska »

Rootlexx писал(а):
14.12.2010 17:55
значение переменной окружения HISTTIMEFORMAT установлено и экспортируется

localhost

$ env | grep ^HIST $

Не экспортируется. Другое дело, что $HOME cron'ом не устанавливается, а именно по ней bash ищет HISTFILE.
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4455
Статус: GNU generation
ОС: Debian GNU/Linux

Re: Bash и HISTTIMEFORMAT в нём

Сообщение Rootlexx »

watashiwa_daredeska писал(а):
14.12.2010 18:25
Rootlexx писал(а):
14.12.2010 17:55
значение переменной окружения HISTTIMEFORMAT установлено и экспортируется

localhost

$ env | grep ^HIST $

Не экспортируется.

Так у автора в /etc/profile:
FoXKa писал(а):
09.12.2010 08:58

Код: Выделить всё

export HISTTIMEFORMAT="%d/%m/%y %T "

watashiwa_darede... писал(а):
14.12.2010 18:25
Другое дело, что $HOME cron'ом не устанавливается, а именно по ней bash ищет HISTFILE.

(man 5 crontab) писал(а):Several environment variables are set up automatically by the cron(8) daemon. SHELL is set to /bin/sh, and LOGNAME and HOME are set from the /etc/passwd line of the crontab's owner.
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Bash и HISTTIMEFORMAT в нём

Сообщение watashiwa_daredeska »

Rootlexx писал(а):
14.12.2010 18:55
Цитата(man 5 crontab)
Да, обшибся. С чем-то, видимо, перепутал.

Rootlexx писал(а):
14.12.2010 18:55
Так у автора в /etc/profile
cron разве выполняет /etc/profile?
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4455
Статус: GNU generation
ОС: Debian GNU/Linux

Re: Bash и HISTTIMEFORMAT в нём

Сообщение Rootlexx »

watashiwa_darede... писал(а):
14.12.2010 19:47
cron разве выполняет /etc/profile?

При чём здесь cron?
Мои слова, на которые ты ответил, относились к ручному запуску скрипта:
Rootlexx писал(а):
14.12.2010 17:55
При ручном же запуске оболочка, в которой выполняется скрипт, является дочерним процессом начальной оболочки, в которой значение переменной окружения HISTTIMEFORMAT установлено и экспортируется, поэтому всё работает так, как ожидалось.

О том, что запущенная cron оболочка, в которой выполняется скрипт, не включает /etc/profile, я писал в первом абзаце.
Спасибо сказали:
Аватара пользователя
FoXKa
Сообщения: 214
ОС: ОкнаXP

Re: Bash и HISTTIMEFORMAT в нём

Сообщение FoXKa »

watashiwa_daredeska писал(а):
14.12.2010 15:26
FoXKa писал(а):
14.12.2010 13:49
и собственно сам крон:
Уберите ">/dev/null 2>&1" и смотрите, что на почту присылает.

всё тоже(без хисторей) + ещё вот такое информационное письмо:
bash: no job control in this shell


2 Rootlexx & watashiwa:
вы меня запутали что то :)
скажите пожалуйста что конкретно надо сделать что бы скрипт отрабатывал по полной (с хисторями) по средствам crontab ?
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU
Контактная информация:

Re: Bash и HISTTIMEFORMAT в нём

Сообщение sash-kan »

FoXKa писал(а):
15.12.2010 06:00
bash: no job control in this shell
что-то, начинающееся с процента, попадает шеллу на выполнение.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU
Контактная информация:

Re: Bash и HISTTIMEFORMAT в нём

Сообщение sash-kan »

минимальный тестовый файл:

Код: Выделить всё

#!/bin/bash
export HISTFILE=/absolute/path/to/file/with/history
set -o history
history | wc -l
по идее, должен работать в любой gnu с достаточно дефолтными настройками cron-а. т.е., отправлять письмо примерно такого содержания:
QUOTE писал(а):From: Cron Daemon <root@blablabla>
To: al@blablabla
Subject: Cron <al@blablabla> /tmp/file
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/home/al>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=al>

500
/tmp/file — это сам тестовый скрипт, 500 — это количество команд в тестовом histfile, al — пользователь.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4455
Статус: GNU generation
ОС: Debian GNU/Linux

Re: Bash и HISTTIMEFORMAT в нём

Сообщение Rootlexx »

FoXKa писал(а):
15.12.2010 06:00
скажите пожалуйста что конкретно надо сделать что бы скрипт отрабатывал по полной (с хисторями) по средствам crontab ?

Можно добавить к опциям bash "--rcfile /etc/profile" или "--login", но тогда будет выполнен весь /etc/profile, что мне представляется излишним, так что лучше сделайте так:
  • Переместите установку значения переменной HISTTIMEFORMAT из /etc/profile в /etc/profile.d/histtimeformat.sh.
  • В начале вашего скрипта включите файл /etc/profile.d/histtimeformat.sh:

    Код: Выделить всё

    if [ -r /etc/profile.d/histtimeformat.sh ]; then
      source /etc/profile.d/histtimeformat.sh;
    fi
Спасибо сказали:
Аватара пользователя
FoXKa
Сообщения: 214
ОС: ОкнаXP

Re: Bash и HISTTIMEFORMAT в нём

Сообщение FoXKa »

oper777 писал(а):
09.12.2010 14:40
UPD: родилось следующее:

Код: Выделить всё

cat ./.bash_history| while read data; do data=$(date -d @${data/\#/}); read command; echo "Команда $command выполнена $data"; done


Ну или попробовать поставить zsh, мож там history работает как надо..

а как это дело грепануть по такому принципу grep `date '+%a %b %d'`?
что то у меня не получается - не могу понять куда вставить данный запрос.
помогите пожалуйста

sash-kan писал(а):
15.12.2010 11:57
минимальный тестовый файл:

Код: Выделить всё

#!/bin/bash
export HISTFILE=/absolute/path/to/file/with/history
set -o history
history | wc -l
по идее, должен работать в любой gnu с достаточно дефолтными настройками cron-а. т.е., отправлять письмо примерно такого содержания:
From: Cron Daemon <root@blablabla>
To: al@blablabla
Subject: Cron <al@blablabla> /tmp/file
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/home/al>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=al>

500
/tmp/file — это сам тестовый скрипт, 500 — это количество команд в тестовом histfile, al — пользователь.

количество строк выводит. если без подсчёта строк делать то он выведет просто содержимое файла. а мне нужно корректно дату этих команд отобразить, что и не получается по крону сделать
Спасибо сказали:
Аватара пользователя
FoXKa
Сообщения: 214
ОС: ОкнаXP

Re: Bash и HISTTIMEFORMAT в нём

Сообщение FoXKa »

Rootlexx писал(а):
15.12.2010 12:00
Можно добавить к опциям bash "--rcfile /etc/profile" или "--login", но тогда будет выполнен весь /etc/profile, что мне представляется излишним, так что лучше сделайте так:
  • Переместите установку значения переменной HISTTIMEFORMAT из /etc/profile в /etc/profile.d/histtimeformat.sh, не забыв сделать последний исполняемым.
  • В начале вашего скрипта включите файл /etc/profile.d/histtimeformat.sh:

    Код: Выделить всё

    if [ -x /etc/profile.d/histtimeformat.sh ]; then
      source /etc/profile.d/histtimeformat.sh;
    fi

такой вариант тоже не пойдёт. так так на момент экспорта переменной HISTTIMEFORMAT он присваевает всем командам в хиторях текущую дату.
остаётся вариант только от oper777. вот только надо понять как сделать выборку.
одна задумка есть - выгружать в файл а потом с файла грепать, но хотелось бы понять как всё делать на лету.
есть у кого идеи?
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Bash и HISTTIMEFORMAT в нём

Сообщение watashiwa_daredeska »

sash-kan писал(а):
15.12.2010 11:41
что-то, начинающееся с процента, попадает шеллу на выполнение.
Можно использовать shebang #!/bin/bash -ix для отладки что когда и как запускается. Учитывая незаквоченые backticks, всякая лабуда может вылезти много где.
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4455
Статус: GNU generation
ОС: Debian GNU/Linux

Re: Bash и HISTTIMEFORMAT в нём

Сообщение Rootlexx »

FoXKa писал(а):
15.12.2010 13:37
на момент экспорта переменной HISTTIMEFORMAT он присваевает всем командам в хиторях текущую дату.

Не всем, а только тем, для которых в файле истории нет записи о времени.
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU
Контактная информация:

Re: Bash и HISTTIMEFORMAT в нём

Сообщение sash-kan »

FoXKa писал(а):
15.12.2010 13:30
sash-kan писал(а):
15.12.2010 11:57
минимальный тестовый файл:

Код: Выделить всё

#!/bin/bash
export HISTFILE=/absolute/path/to/file/with/history
set -o history
history | wc -l
по идее, должен работать в любой gnu с достаточно дефолтными настройками cron-а. т.е., отправлять письмо примерно такого содержания:
QUOTE писал(а):From: Cron Daemon <root@blablabla>
To: al@blablabla
Subject: Cron <al@blablabla> /tmp/file
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/home/al>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=al>

500
/tmp/file — это сам тестовый скрипт, 500 — это количество команд в тестовом histfile, al — пользователь.

количество строк выводит. если без подсчёта строк делать то он выведет просто содержимое файла. а мне нужно корректно дату этих команд отобразить, что и не получается по крону сделать
так добавьте экспорт нужного histtimeformat-а.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Ответить