Suponha que eu tenha um programa ou script de construção (considere uma caixa preta) que está criando hardlinks e rodando no Linux (Debian 7.4). Se eu quiser experimentar e descobrir se o programa também funcionaria com links simbólicos sem tocá-los, como faria isso?
Eu imagino algo como
magicwrapper make
Talvez seja possível interceptar chamadas do sistema para criação de hardlink e substituí-las pela criação de link simbólico.
Responder1
Eu faria algo assim, que cria um script wrapper de registro para substituir ln
(vá em frente e copie e cole):
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
Agora você pode executar make
, e seu novo ln
registrará a criação do link simbólico /tmp/link_log
evaiainda cria links como deveria, pois passa seus argumentos para oreal ln
.
Para colocar tudo de volta:
l=$(which ln)
mv $l.bak $l
Espero que isto ajude!
EDITAR
Conforme apontado nos comentários, isso não é um problema. Aqui está uma maneira melhor de fazer isso:
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
E então você pode executar <program>
assim: LD_PRELOAD=/tmp/symlink_only.so <program>
. Deve funcionar; Eu testei com ln
.
Depois para colocar tudo de volta: rm /tmp/symlink_only.{c,so}
.