有沒有辦法捕獲硬鏈接創建的所有調用並用符號鏈接替換它們?

有沒有辦法捕獲硬鏈接創建的所有調用並用符號鏈接替換它們?

假設我有一個程式或建置腳本(將其視為黑盒),它正在建立硬連結並在 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}

相關內容