
Supongamos que tengo un programa o script de compilación (considérelo una caja negra) que crea enlaces duros y se ejecuta en Linux (Debian 7.4). Si quiero experimentar y descubrir si el programa funciona también con enlaces simbólicos sin tocarlos, ¿cómo lo haría?
Me imagino algo como
magicwrapper make
Tal vez sea posible interceptar llamadas al sistema para la creación de enlaces físicos y reemplazarlas con la creación de enlaces simbólicos.
Respuesta1
Haría algo como esto, que crea un script contenedor de registro para reemplazar ln
(siga adelante, cópielo y péguelo):
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
Ahora puede ejecutarlo make
y su nuevo ln
registro registrará la creación del enlace simbólico /tmp/link_log
yvoluntadtodavía crea enlaces tal como debería, ya que pasa sus argumentos alreal ln
.
Para devolver todo:
l=$(which ln)
mv $l.bak $l
¡Espero que esto ayude!
EDITAR
Como se señaló en los comentarios, esto no es un comodín. Aquí hay una mejor manera de hacerlo:
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
Y luego puedes ejecutarlo <program>
así: LD_PRELOAD=/tmp/symlink_only.so <program>
. Deberia de funcionar; Lo he probado con ln
.
Luego para volver a poner todo: rm /tmp/symlink_only.{c,so}
.