Mac OSX에서 프로세스가 열려 있는 상태에서 삭제된 파일을 여는 방법은 무엇입니까?

Mac OSX에서 프로세스가 열려 있는 상태에서 삭제된 파일을 여는 방법은 무엇입니까?
b2-osx108v8-01:~ bamboo$ lsof -p 264
COMMAND PID   USER   FD     TYPE            DEVICE  SIZE/OFF     NODE NAME
<lines removed>
java    264 bamboo   20w     REG               1,2    240906 14883372 /Users/bamboo/bamboo-agent-home/xml-data/build-dir/ST-SSINR-B2OSML/SimbaProcessManager.log.0
<lines removed>

디렉토리 /Users/bamboo/bamboo-agent-home/xml-data/build-dir/ST-SSINR-B2OSML는 삭제되었지만 파일은 여전히 ​​데몬에 의해 열려 있습니다. 이 로그를 어떻게 볼 수 있나요? Linux에서는 를 사용 /proc/264/fd/20하지만 OSX에서는 사용할 수 없는 것 같습니다.

답변1

<편집>

이것이 Linux라면 gdb트릭을 사용할 수도 있습니다. 그러나 OS X에서는 이 트릭이 Linux 특정 동작 에 의존하기 때문에 배제할 수 있는 것으로 나타났습니다 /dev/fd/( )./proc/self/fd/

그게 내가 아는 전부이고 긍정적인 조언은 없습니다.

</edit>

정말 무서울 수도 있지만 생각해 보셨나요 gdb? 하나의 패키지에 두 가지 놀라운 기능이 있습니다: C 인터프리터와 선택한 프로세스에 코드를 삽입하는 방법! 분명히 디버깅에도 사용할 수 있습니다.

다행히 C 표준 라이브러리에는 스크립트를 해석하는 함수도 포함되어 있습니다. 플랫폼의 스크립팅 언어는 C보다 작성하기가 더 쉬울 수 있습니다.

lessOS X용 스크립트를 생각해 냈습니다 . 이는 로그 파일의 시작 부분을 반환하는 취약한 해킹입니다.OS X, bash: 열린 파일 설명자에서는 덜 작동하지만 cat은 작동하지 않습니다.전체 로그 파일을 읽은 후 lessFD 위치는 파일 끝에 있어야 하며, 이는 개입 전의 원래 위치가 되기를 바랍니다.

<편집>그러나 파일이 읽기용으로 열려 있는 경우에만 작동합니다. 출력 에 따르면 lsof파일은 쓰기용으로만 열려 있습니다. </EDIT>

gdb -p 264 <<EOF
call (int) system("exec </dev/null >/tmp/log 2>&1; less /dev/fd/20")
EOF

반환 유형을 캐스팅하지 않으면 내 시스템이 알지 못하는 반환 유형에 대해 불평할 것이기 때문입니다 system(). 아마도 이것은 또한 매개변수 유형이 확실하지 않다는 것을 의미하므로 이미 좋은 생각처럼 들립니다.

파일 설명자를 조작하기 위해 Linux 상자에서 이를 사용하려고 시도했을 때 system()어떻게든 작동했습니다... 한 번. 나는 그것이 영원히 작동할 것이라고 보장하지 않습니다 :). 예를 들어, 기술적으로 말하면 프로그램이 신호 처리기 또는 system()자체를 실행하는 경우 이것이 안전하다는 보장은 없습니다. ( system()"재진입"이 보장되는 몇 가지 기능 중 하나가 아닙니다).

답변2

icat블록 장치에서 작동할 때 동작이 올바른지, Mac OS에 블록 장치가 있는지, 다음을 수행하면 데이터가 소모되는지 확인하지 않았습니다 .

icat /dev/MY-DEVICE 14883372이 명령 은 icatThe Sleuth Kit®(TSK)에서 제공됩니다.

https://github.com/sleuthkit/sleuthkit/wiki/HFS

(이미 Linux에 대해 언급하셨습니다. 이 아이디어는 debugfsLinux 파일 시스템 ext2/ext3/ext4에 동일한 작업을 수행하는 명령이 있다는 사실에서 영감을 얻었습니다.)

관련 정보