Есть ли способ перехватить все вызовы создания жестких ссылок и заменить их символическими ссылками?

Есть ли способ перехватить все вызовы создания жестких ссылок и заменить их символическими ссылками?

Предположим, у меня есть программа или скрипт сборки (считайте его черным ящиком), который создает жесткие ссылки и работает на Linux (Debian 7.4). Если я хочу поэкспериментировать и выяснить, будет ли программа работать с символическими ссылками, не трогая ее, как мне это сделать?

Я представляю себе что-то вроде

magicwrapper make

Возможно, можно перехватывать системные вызовы создания жестких ссылок и заменять их созданием символических ссылок.

решение1

Я бы сделал что-то вроде этого, создав скрипт-оболочку для ведения журнала, который нужно заменить ln(скопируйте и вставьте его):

l=$(which ln)
mv $l $l.bak
cat <<'EOF' >$l
#!/bin/bash
if grep -Eqw -- -s <<<"$@"
  echo "Symbolic link created by command: ln $@" >>/tmp/link_log
fi
<sed>
EOF
sed "s/<sed>/$l.bak/" -i $l
chmod +x $l

Теперь вы можете запустить make, и ваш новый файл lnбудет регистрировать создание символической ссылки на /tmp/link_log, и этоволявсе равно создает ссылки так, как и должно быть, поскольку передает свои аргументынастоящий ln.

Чтобы вернуть все на место:

l=$(which ln)
mv $l.bak $l

Надеюсь это поможет!

РЕДАКТИРОВАТЬ

Как указано в комментариях, это не всеобъемлющий подход. Вот лучший способ сделать это:

cat <<'EOF' >/tmp/symlink_only.c
#include <unistd.h>
int link(const char *path1, const char *path2)
{
    return symlink(path1, path2);
}
int linkat(int olddirfd, const char *oldpath, int newdirfd, const char *newpath, int flags)
{
    return symlink(oldpath, newpath);
}
gcc -Wall -fPIC -shared -o /tmp/symlink_only.so /tmp/symlink_only.c -ldl

И затем вы можете запустить его <program>так: LD_PRELOAD=/tmp/symlink_only.so <program>Это должно работать; я проверил это с помощью ln.

Затем вернуть все на место: rm /tmp/symlink_only.{c,so}.

Связанный контент