Gibt es eine Möglichkeit, alle Aufrufe der Hardlink-Erstellung abzufangen und durch symbolische Links zu ersetzen?

Gibt es eine Möglichkeit, alle Aufrufe der Hardlink-Erstellung abzufangen und durch symbolische Links zu ersetzen?

Angenommen, ich habe ein Programm oder ein Build-Skript (betrachten Sie es als Blackbox), das Hardlinks erstellt und unter Linux (Debian 7.4) läuft. Wenn ich experimentieren und herausfinden möchte, ob das Programm auch mit symbolischen Links funktioniert, ohne es zu berühren, wie würde ich das tun?

Ich stelle mir so etwas vor wie

magicwrapper make

Möglicherweise ist es möglich, Systemaufrufe zur Hardlink-Erstellung abzufangen und durch die Erstellung von Symlinks zu ersetzen.

Antwort1

Ich würde etwas wie das Folgende tun, wodurch ein Wrapper-Skript für die Protokollierung erstellt wird, das ersetzt werden kann ln(kopieren und einfügen Sie es einfach):

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

Jetzt können Sie ausführen make, und Ihr neuer lnwird die Erstellung symbolischer Links protokollieren /tmp/link_log, und esWilledennoch Links erstellen, wie es sollte, da es seine Argumente an diereal ln.

So stellen Sie alles wieder her:

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

Hoffe das hilft!

BEARBEITEN

Wie in den Kommentaren erwähnt, ist dies kein Allheilmittel. Hier ist eine bessere Möglichkeit, es zu tun:

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

Und dann können Sie es <program>wie folgt ausführen: LD_PRELOAD=/tmp/symlink_only.so <program>. Es sollte funktionieren; ich habe es mit getestet ln.

Dann alles wieder zurücksetzen: rm /tmp/symlink_only.{c,so}.

verwandte Informationen