URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9939
[ Назад ]

Исходное сообщение
"C-shell history"

Отправлено Shinma , 18-Ноя-14 15:52 
Помогите написать скрипт который будет сохранять историю ввода команд.
я создал в каталоге /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 чтобы вести хистори команд отдельно от возможностей системы.


Содержание

Сообщения в этом обсуждении
"C-shell history"
Отправлено skb7 , 18-Ноя-14 18:02 
Хм, а зачем это всё? Историю логинов можно посмотреть например командой "last имя_пользователя", история каждого пользователя в домашних каталогах (~/.bash_history). Вроде это та же самая информация, что вы хотите собрать своим скриптом?

Если всё же надо свой скрипт -- то вот еще предложения.
Можно сделать задание для cron (скрипт на баше, запускаемый кроном). Раз в день проходить по каталогам всех пользователей и сохранять .bash_history в нужном формате в нужный файл.

Ну или вот еще хакообразная идея: подменить /bin/sh (или какой у вас шелл используется) на свой скрипт, который будет вначале сохранять команду в историю (и нужные дополнительные параметры), а потом выполнять её настоящим шелом?


"C-shell history"
Отправлено Shinma , 18-Ноя-14 20:28 
в виду специфичности системы стандартная хистори не работает. Баша вообще нет и не будет. только чистый csh. и выследить кто вводил команды можно только если была запись вида:

date >> $HIS
echo “who am i” >> $HIS
who am i >> $HIS
echo “who -R” >> $HIS
who -R >> $HIS
history >> $HIS


"C-shell history"
Отправлено skb7 , 19-Ноя-14 00:15 
> в виду специфичности системы стандартная хистори не работает. Баша вообще нет и
> не будет. только чистый 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 повесить.


"C-shell history"
Отправлено Shinma , 19-Ноя-14 06:51 
>     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 повесить.

Очень жаль, но я не разу не вешал хуки и пока слабо понимаю, что тут написано.
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. чтобы записывать в файл каждый раз когда вводится команда.


"C-shell history"
Отправлено Pahanivo , 19-Ноя-14 07:47 
мда, а что за "специфичная" система у вас можно узнать?


"C-shell history"
Отправлено Shinma , 19-Ноя-14 08:18 
> мда, а что за "специфичная" система у вас можно узнать?

это из-за sap, у них работа системы построена на csh, разрешено навешивать свои прибамбасы сверху, но трогать существующее запрещено.


"C-shell history"
Отправлено skb7 , 19-Ноя-14 15:57 
вующий файл.

> в вашем случае
> как я понимаю эта штука срабатывает только один раз на входе
> в систему. Но в этом случае пользователь еще не работал и
> его истории нету и записывать нечего. Или я совсем ничего не
> понимаю.

Я исходил из того, что на выполнение каждой команды шела вызывается шел. По-ходу это не так и шел вызывается один раз на сессию, так что мой вариант нерабочий. К тому же ниже вы пишите, что ничего существующее менять нельзя в системе, только добавлять, так что в любом случае метод, который я предложил выше, нерабочий.


"C-shell history"
Отправлено pavlinux , 21-Ноя-14 21:58 

#!/bin/bash --posix

LOG=/tmp/ccsh.log

while true
     do
       echo -n '$> ';
       while read line
            do
                echo `date`:$line >> $LOG;
                sh -c $line;
                break;
        done
done



"C-shell history"
Отправлено Shinma , 25-Ноя-14 13:24 
повторюсь - на системе баща нет и не будет. но я попробовал видоизменить код под  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 history"
Отправлено pavlinux , 26-Ноя-14 11:18 
> В итоге код работает

У тя точно C-shell ? :D

Потому как "while expr do ... done" - это Bourne Shell (может ещё Korn).
В сsh это будет: while (expr) .... end;


#!/bin/csh

set LOG="/tmp/ccsh.log"

while (1)
       echo -n '$> ';
       set line = "$< ";
       if ( "$line" == "" ) then
            break
       endif

       echo `date`:"$line";
       csh -c "$line";
       break;
end



"C-shell history"
Отправлено Shinma , 03-Дек-14 13:24 
Последний вариант, но в нем косяк. если юзер понажимает ктрл+с то собственно хистори писаться не будет. обидно.

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



"C-shell history"
Отправлено pavlinux , 04-Дек-14 03:26 
> ... но в нем косяк. если юзер понажимает ктрл+с то ...


#!/bin/csh

set LOG="$HOME/.his"

onintr -; # вы мануалы ваще читаете?

while (1)
    while (1)
          echo -n `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

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

hostname $> kill -9 `ps -o ppid=`;

9, 11, и 18 сигналы не перехватываются ничем, кроме ядра.
Парсер писать замучаешься, ибо вариантов тонна.

А ещё можно бэкспейсами закидать лог,
А ещё можно тупа обнулить $> echo > $HOME/.his;

Вариант (не геморройный) только один - прописать этот скрипт, как shell в /etc/passwd;

От обнуления и затирания нужно подымать pipe/fifo, в него кидать логи и считывать другим демоном.
Мож на вашей машине придётся терминал крутить, дабы упр. символы не пропускал. (stty)