ELF 파일이 실행될 때 명령이 실행되어야 합니다.
예: /usr/bin/file
이 컴파일된 ELF 바이너리를 실행하고 다음 명령을 실행합니다.touch /tmp/file_is_executed
가능하다면 코드를 다시 컴파일하고 소스 파일에 원하는 명령을 추가하겠습니다. 하지만 소스코드가 없어서 컴파일된 버전을 처리해야 합니다.
답변1
빠른 수정으로 이런 일이 발생해야 하는 경우 함수를 사용하여 대상 명령을 재정의할 수 있습니다.
file() { touch /tmp/file_is_executed; command file "$@"; }
그러나 불투명한 애플리케이션에서 명령 실행을 추적하려는 경우 또는 다른 사람이 명령을 실행할 때 필요할 때 해당 기능을 반드시 사용할 수 있는 것은 아닙니다. 마찬가지로 /usr/bin/file
대상 실행 파일이 전체 경로(즉, 대신)로 호출되는 경우 file
이 방법을 사용할 수 없습니다 . 이러한 경우 대상 실행 파일의 자체 구현을 만들 수 있습니다.
귀하의 질문에 설명된 ELF 실행 파일을 변경하는 솔루션은 없습니다. (바이너리 패치는 중요한 작업입니다.)
당신을위한 실제 예 /usr/bin/file
:
스크립트를 작성하십시오
~/bin/file.sh
(mkdir ~/bin
이것이 먼저 필요할 수 있습니다):#!/bin/sh touch /tmp/file_is_executed exec /usr/bin/file "$@"
스크립트를 읽기 가능하고 실행 가능하게 만들기
chmod a+rx ~/bin/file.sh
설치 스크립트는진짜
cp -p ~/bin/file.sh ~/bin/file
~/bin이 있는지 확인하십시오.
$PATH
앞으로/usr/bin
export PATH="$HOME/bin:$PATH"
모든 사람을 위한 실제 예제 (이 작업을 수행하려면 루트 액세스 권한이 필요하므로 , 또는 /usr/bin/file
와 같은 이름 ):sudo
doas
su
다음과 같이 스크립트를 작성하십시오.
/usr/bin/file.sh
#!/bin/sh touch /tmp/file_is_executed exec "$0.bin" "$@"
스크립트를 읽기 가능하고 실행 가능하게 만들기
chmod a+rx /usr/bin/file.sh
설치 스크립트는진짜
mv /usr/bin/file /usr/bin/file.bin && cp -p /usr/bin/file.sh /usr/bin/file