Existe uma maneira de capturar todas as invocações da criação do hardlink e substituí-las por links simbólicos?

0

Suponha que eu tenha um programa ou script de construção (considere-o um blackbox) 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á-lo, como eu faria isso?

Eu imagino algo como

magicwrapper make

Talvez seja possível interceptar chamadas do sistema para criação de hardlinks e substituí-las pela criação de links simbólicos.

    
por Karl Richter 10.07.2014 / 14:26

1 resposta

1

Eu faria algo assim, que cria um script wrapper de log para substituir ln (vá em frente e copie-o e cole-o):

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 como /tmp/link_log , e ainda criará links exatamente como deveria, já que ele passa seus argumentos para o real ln .

Para colocar tudo de volta:

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

Espero que isso ajude!

EDITAR

Como apontado nos comentários, isso não é um resumo. 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 seu <program> assim: LD_PRELOAD=/tmp/symlink_only.so <program> . Deve funcionar; Eu testei com ln .

Em seguida, coloque tudo de volta: rm /tmp/symlink_only.{c,so} .

    
por 11.07.2014 / 05:12