하드링크를 생성하고 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}
.