Помогите написать скрипт который будет сохранять историю ввода команд.
я создал в каталоге /home/user/ файл .logout:set HIS="$HOME/.his"
if (! -e $HIS ) then
touch $HIS
endif
echo "##################################" >> $HIS
date >> $HIS
echo “who am i” >> $HIS
who am i >> $HIS
echo “who -R” >> $HIS
who -R >> $HIS
history >> $HISОн он работает только пока люди правильно выходят. А если Putty закрыть через крестик, то хистори никто не записывает.
Вариант set history=20 savehistory - отпадает сразу.
на машине еще стоит perl может есть у кого идеи как запустить скрипт через .cshrc написанный на perl или чистом csh чтобы вести хистори команд отдельно от возможностей системы.
Хм, а зачем это всё? Историю логинов можно посмотреть например командой "last имя_пользователя", история каждого пользователя в домашних каталогах (~/.bash_history). Вроде это та же самая информация, что вы хотите собрать своим скриптом?Если всё же надо свой скрипт -- то вот еще предложения.
Можно сделать задание для cron (скрипт на баше, запускаемый кроном). Раз в день проходить по каталогам всех пользователей и сохранять .bash_history в нужном формате в нужный файл.Ну или вот еще хакообразная идея: подменить /bin/sh (или какой у вас шелл используется) на свой скрипт, который будет вначале сохранять команду в историю (и нужные дополнительные параметры), а потом выполнять её настоящим шелом?
в виду специфичности системы стандартная хистори не работает. Баша вообще нет и не будет. только чистый csh. и выследить кто вводил команды можно только если была запись вида:date >> $HIS
echo “who am i” >> $HIS
who am i >> $HIS
echo “who -R” >> $HIS
who -R >> $HIS
history >> $HIS
> в виду специфичности системы стандартная хистори не работает. Баша вообще нет и
> не будет. только чистый csh. и выследить кто вводил команды можно
> только если была запись вида:
> date >> $HIS
> echo “who am i” >> $HIS
> who am i >> $HIS
> echo “who -R” >> $HIS
> who -R >> $HIS
> history >> $HISНу тогда:
# mv /bin/csh /bin/csh_real
# echo <<EOF >/bin/csh
date >> $HIS
echo “who am i” >> $HIS
who am i >> $HIS
echo “who -R” >> $HIS
who -R >> $HIS
history >> $HIS
/bin/csh_real $*
EOF
# chmod +x /bin/cshНадеюсь идея ясна -- хук на csh повесить.
> echo “who am i” >> $HIS
> who am i >> $HIS
> echo “who -R” >> $HIS
> who -R >> $HIS
> history >> $HIS
> /bin/csh_real $*
> EOF
> # chmod +x /bin/csh
>
Очень жаль, но я не разу не вешал хуки и пока слабо понимаю, что тут написано.
mv /bin/csh /bin/csh_real #Переместить /bin/csh в /bin/csh_real и на месте /bin/csh уже ничего не будет
echo <<EOF >/bin/csh #Направляете на экран а с него в несуществующий /bin/csh команды до указанного маркера EOF. Вы же убрали этот шел используя команду выше . И я не разу не пользовался EOF пока мало понимаю смысл его работы тут.
> date >> $HIS
> echo “who am i” >> $HIS
> who am i >> $HIS
> echo “who -R” >> $HIS
> who -R >> $HIS
history >> $HIS ## выводит ВСЮ хистори, Текущей сессии, Текущего пользователя, Только данного терминала,
> /bin/csh_real $*
> EOF конец команды
# chmod +x /bin/csh # даем права на несуществующий файл.
В общем я ничего не понял, что вы сделали. Но в моем скрипте я использовал команду history так как она записывает всю историю которую ввел пользователь за сессию в файл. а в вашем случае как я понимаю эта штука срабатывает только один раз на входе в систему. Но в этом случае пользователь еще не работал и его истории нету и записывать нечего. Или я совсем ничего не понимаю.
Или подскажите как можно повесить хук на ввод каждой команды пользователем под csh. чтобы записывать в файл каждый раз когда вводится команда.
мда, а что за "специфичная" система у вас можно узнать?
> мда, а что за "специфичная" система у вас можно узнать?это из-за sap, у них работа системы построена на csh, разрешено навешивать свои прибамбасы сверху, но трогать существующее запрещено.
вующий файл.> в вашем случае
> как я понимаю эта штука срабатывает только один раз на входе
> в систему. Но в этом случае пользователь еще не работал и
> его истории нету и записывать нечего. Или я совсем ничего не
> понимаю.Я исходил из того, что на выполнение каждой команды шела вызывается шел. По-ходу это не так и шел вызывается один раз на сессию, так что мой вариант нерабочий. К тому же ниже вы пишите, что ничего существующее менять нельзя в системе, только добавлять, так что в любом случае метод, который я предложил выше, нерабочий.
#!/bin/bash --posixLOG=/tmp/ccsh.log
while true
do
echo -n '$> ';
while read line
do
echo `date`:$line >> $LOG;
sh -c $line;
break;
done
done
повторюсь - на системе баща нет и не будет. но я попробовал видоизменить код под shell.#!/bin/sh
LOG="$HOME/.his"while true
do
echo `hostname` '$> ';
while read line
do
echo `date`:$line >> $LOG;
sh -c $line;
break;
done
doneВ итоге код работает но до момента пока не воспользуюсь командами с опциями. ll -a он обрабатывает как просто ll. и так далее
ll -ltr
-ltr: A specified flag is not valid for this command.
$>
ls -ltr
-ltr: A specified flag is not valid for this command.
$>
> В итоге код работаетУ тя точно C-shell ? :D
Потому как "while expr do ... done" - это Bourne Shell (может ещё Korn).
В сsh это будет: while (expr) .... end;
#!/bin/cshset LOG="/tmp/ccsh.log"
while (1)
echo -n '$> ';
set line = "$< ";
if ( "$line" == "" ) then
break
endifecho `date`:"$line";
csh -c "$line";
break;
end
Последний вариант, но в нем косяк. если юзер понажимает ктрл+с то собственно хистори писаться не будет. обидно.#!/bin/csh
set LOG="$HOME/.his"while (1)
while (1)
echo `hostname` '$> ';
set line = "$< ";
if ( "$line" == "" ) then
break
endif
who am i >> $LOG;
who -R >> $LOG;
echo `date "+ %m/%d/%y %H:%M:%S"`:" $line" >> $LOG;
csh -c "$line";
break;
end
end
> ... но в нем косяк. если юзер понажимает ктрл+с то ...
#!/bin/cshset LOG="$HOME/.his"
onintr -; # вы мануалы ваще читаете?
while (1)
while (1)
echo -n `hostname` '$> ';
set line = "$< ";
if ( "$line" == "") then
break
endifwho am i >> $LOG;
who -R >> $LOG;
echo `date "+ %m/%d/%y %H:%M:%S"`:" $line" >> $LOG;
csh -c "$line";
break;
end
endНо если юзеры продвинутые, то можно по колдовать с троянчиком, типа
hostname $> kill -9 `ps -o ppid=`;
9, 11, и 18 сигналы не перехватываются ничем, кроме ядра.
Парсер писать замучаешься, ибо вариантов тонна.А ещё можно бэкспейсами закидать лог,
А ещё можно тупа обнулить $> echo > $HOME/.his;Вариант (не геморройный) только один - прописать этот скрипт, как shell в /etc/passwd;
От обнуления и затирания нужно подымать pipe/fifo, в него кидать логи и считывать другим демоном.
Мож на вашей машине придётся терминал крутить, дабы упр. символы не пропускал. (stty)