有没有办法捕获所有硬链接创建的调用并用符号链接替换它们?

有没有办法捕获所有硬链接创建的调用并用符号链接替换它们?

假设我有一个程序或构建脚本(将其视为黑匣子),它正在创建硬链接并在 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}

相关内容