ハードリンク作成のすべての呼び出しをキャッチし、シンボリック リンクに置き換える方法はありますか?

ハードリンク作成のすべての呼び出しをキャッチし、シンボリック リンクに置き換える方法はありますか?

ハードリンクを作成し、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}

関連情報