쉘과 같은 프로그램을 "추적"하는 방법?


1

나는 이해 dash "모델"셸입니다 - 최근에 잘 작성되었으며 POSIX 셸에 필요한 것만 구현합니다. 쉘과 같은 프로그램의 "추적"이 어떻게 수행되는지를 이해하기 위해 대시 소스 코드를 살펴 보았습니다.

대시의 "추적"은 ​​다음과 같이 컴파일하여 수행됩니다. DEBUG 정의되고 호출되는 -o debug. 그렇게하면 파일 trace ~와 함께 열린다. fopen 무엇에 관한 정보가 쏟아져 나오는지 dash 그것이 달릴 때하고있다.

전체 메카니즘을 제외하면 나에게는 "완벽하게 쓰여진"껍질에서도 작동하지 않는 것처럼 보입니다. 쉘 스크립트에서 이것을 가지고 있다면 :

exec 3>&1

그 이후의 모든 정보는 즉시 더 이상 파일에 덤프되지 않습니다. trace 그러나 위로 감는다. stdout. 그 이유는 fopen 전화 open 아마도 파일 기술자 3을 반환 할 것입니다.

이것은 인위적인 사례가 아닙니다. 실세계에서 일반적으로 사용되는 스크립트가 있습니다.

exec 번호 >&1

(나는 2 개의 autotools에서 그것을 보았다. configure 스크립트 : IP Infusion 및 Kerberos 소프트웨어 용).

그렇다면 쉘을 어떻게 디버깅 / 추적 할 수 있습니까?

(나는 셸 외부의 도구를 찾고 있지 않다. 셸과 같은 프로그램 내에서 추적 할 올바른 방법이 무엇인지 알고 싶다. 일반적으로 가능하지 않은가?)


"strace -f"는 도움이 될 수도 있고 도움이되지 않을 수도 있습니다.
barrycarter

@ barrycarter 예, 감사합니다, 좋은 지적이지만, ... 나는 껍질 안에서 그것을하고 싶습니다 - 질문을 명확히했습니다. 기본적으로, 나는 하나님이 껍데기를 쓴다면 어떻게 추적을 구현할 것인지 알고 싶다. 또는 위의 문제로 인해 일반적으로 불가능합니다.
user322908

답변:


1

소켓 ( syslogd 예를 들어 이것을 수행합니다.) 그렇다면 다음과 같은 명령으로부터 어떻게 보호 할 수 있습니까?

LD_PRELOAD=my_bogus_socket_funcs.so somecommand

또는 사용할 수 있습니다. dup2 파일 설명자를 더 높은 번호로 변경하십시오. 그러나 이는 스크립트 실수 (예 : 리디렉션에서 2 대신 3 사용)에 대한 보호 일 뿐이라는 보장은 아닙니다.

스크립트가 의도적으로 추적 동작을 변경하려는 경우, 쉘이 많거나 적을 수 없다고 생각합니다.


"스크립트가 의도적으로 추적 기능을 변경하려고합니다."는 것은 아니며,이 스크립트는 그렇지 않습니다. 나는 불량 스크립트를 실행하지 않을 것이며, 잘못 작성된 스크립트 만 실행하려고합니다. 이 스크립트는 다른 목적으로 3을 사용합니다. 하드 코드 된 것으로, 누군가가 이미 열어 놓았을 수도 있습니다.
user322908

그래, 나는 생각한다. dup2 "매직 넘버 파일 디스크립터"로 아마도 가장 좋은 내기 일 것입니다 ... 고맙습니다.
user322908

1
그 특별한 경우에는 두 가지 방법 모두 효과가있었습니다. 제 요점은 당신이 알고있다 대본에있는 실수는 실제로 실행될 것이라는 보장 할 수있는 방법이 아닙니다. 스크립트는 소켓 함수를 무시하는 것과 같은 일을 할 수있는 타당한 이유가있을 수 있습니다.
Krumelur
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.