LINUX.ORG.RU

Алиас для rm


0

0

Подскажите, пожалуйста, как создать для rm алиас, чтобы при вызове rm из любого скрипта инфа откуда вызвано и что планировалось удалить заносилась в лог.

mv /bin/rm /bin/real_rm

cat > /bin/rm <<_EOF_
#!/bin/sh
echo `pwd` "$@" >> /var/log/rm_log
/bin/real_rm "$@"
_EOF_

chmod +x /bin/rm

Ну, думаю, примерная суть ясна.

Laz ★★★★★
()

Не знаю, насчет алиаса при условии что из любого скрипта, вроде здесь только заменить rm на скрипт, что то типа

mv /bin/rm -> /bin/rm.bin

а сам файл rm как то типа:

#!/bin/bash
echo "$@" >> /var/log/rm.log
exec /bin/rm.bin "$@"


mky ★★★★★
()

IMO очевидно, что никакой alias тут не поможет.

Поможет переименование оригинального /bin/rm в скажем /bin/rm.original
и создание скрипта-обертки (или бинарника-обертки) /bin/rm,
которая будет писать в лог и затем вызывать /bin/rm.original.

Ну или удалить оригинальный /bin/rm и поставить свой, с logging'ом,
блекджеком и шлюхами.

HTH

Onanim
()
Ответ на: комментарий от cavia_porcellus

то есть вызвавшего скрипт - обертку. Грубо говоря, имеется куча make'ов и нужно при выполнении их всех отследить, в каком что затирается.

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

> Спасибо. А можно ли как-нибудь вывести имя вызвавшего rm скрипта?

например, echo $BASH_SOURCE если это баш.

// wbr

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

> то есть вызвавшего скрипт - обертку. Грубо говоря, имеется куча make'ов и нужно при выполнении их всех отследить, в каком что затирается.

AFAIU не получится бо во всех случаях "вызывающим" будет не конкретный Makefile но сам make.

// wbr

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

> Грубо говоря, имеется куча make'ов и нужно при выполнении их всех отследить, в каком что затирается.

А не проще ли использовать strace?

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

> А не проще ли использовать strace?

а что это даст на проекте, в котором, допустим, тысячи файлов сценариев :-?

проще пофиксить сам проект, заменив, если необходимо, [/bin/]rm на $(RM) и назначить $(RM) в свой врапер и уже в нем анализировать что и как.

// wbr

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

Так есть $PPID --- pid родителя, его можно превратить в строку с помощью команды ps, допустим так

ps h --pid $PPID >> /var/log/rm.log

В случае с кучей MAKEFILE'ов может поможет $PWD --- текущий рабочий каталог, он вроде изменяется когда make идет по дереву каталогов.

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

> а что это даст на проекте, в котором, допустим, тысячи файлов сценариев :-?

а в чём проблема? strace -f -F. Ну и ключик -e поможет.

anonymous
()
Ответ на: комментарий от klalafuda

>> А не проще ли использовать strace?

>а что это даст на проекте, в котором, допустим, тысячи файлов сценариев :-?

И что?

> проще пофиксить сам проект

Для меня это неочевидно. ИМХО, проще прошерстить grep вывод strace.

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

> ИМХО, проще прошерстить grep вывод strace.

+1 :). strace более универсальный метод. Он отловит даже если прога сама unlink сделает.

anonymous
()
Ответ на: комментарий от mky

Я бы сделал так:

### -- кусь -- кусь -- кусь -- ###
#!/bin/sh -e

rm ()
{
logger -t $$ -p user.debug "rm $@"
/bin/rm $@
}
source /the/original/script
### -- кусь -- кусь -- кусь -- ###

> Не знаю, насчет алиаса при условии что из любого скрипта,
> вроде здесь только заменить rm на скрипт,

Идея рабочая, но вот этого

> что то типа mv /bin/rm -> /bin/rm.bin

лучше таки не делать. Проще (и безопаснее) положить такой скрипт в ~/bin,
и поставить ~/bin первым в PATH.

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

> Грубо говоря, имеется куча make'ов и нужно при выполнении их всех отследить, в каком что затирается.

посмотреть make -n|tee make.log && grep rm make.log какие команды он собирается выполнить

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


> посмотреть make -n |tee make.log && grep rm make.log
> какие команды он собирается выполнить

Тоже хорошо. Но есть одна загвоздка: rm может косвенно запускаться. Например,
make запускает libtool, libtool запускает rm, или что-нибудь еще в таком же
духе.

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

скрипт для Dtrace написать :) или через LD_PRELOAD подменить на логгинг, как это для malloc в Firefox делали.

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

Стесняюсь спросить ... а откуда такая уверенность, что для удаления используется именно команда rm, а не соответствующая функция perl, libcшный unlink, прямое обращение к API файловой системы или что-нибудь еще более низкоуровневое?

anonymous
()

А вот во FreeBSD есть аудит. И для подобных вещей его просто нужно правильно настроить.

Имхо, то что вы предлагаете - зло. Слишком хардкодно.

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

Да и - насчёт скриптовых языков - tru.

Предложенные методы на sh - работать не будут.

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

> Стесняюсь спросить ... а откуда такая уверенность, что для удаления
> используется именно команда rm, а не соответствующая функция perl,
> libcшный unlink,

Ниоткуда. Не помогло бы -- тогда strace -f -e unlink

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