대시 쉘에 대한 DEBUG 신호를 트랩하시겠습니까?

대시 쉘에 대한 DEBUG 신호를 트랩하시겠습니까?

Bash 쉘을 사용하면 합성 DEBUG신호에 트랩을 설치할 수 있습니다. 이는 유용하며 모든 쉘 명령에서 함수 또는 코드 비트를 실행합니다. 예를 들어:

$ trap 'logger -t shell "${BASH_COMMAND}"' DEBUG

여기서 아이디어는 예를 들어 드롭된 파일에 트랩을 설치하고 /etc/profile.d/bash-logger사용자 셸 세션 명령이 발생할 때마다 자동으로 syslog에 기록되도록 하는 것입니다. 이는 다음에도 유용합니다.원격 명령을 쉽게 추적.

대시 쉘 소스 코드를 보면 그러한 DEBUG신호를 사용할 수 없다는 것을 이해하는 것 같습니다.

대시 셸을 사용하여 동일한 결과를 얻을 수 있는 해결 방법이나 대안이 있습니까?

답변1

가장 철저한 접근 방식은 syslog 지원을 활성화하여 셸을 다시 컴파일하는 것입니다. 이는 또한 (어떤 이유로든) ~/를 로드하지 않는 쉘을 우회합니다.무엇이든-프로필 또는 ~/.무엇이든-rc.

이는 Bash의 표준 소스에 옵션으로 포함되어 있지만 다른 셸의 경우 패치를 찾거나 작성해야 할 수도 있습니다.

명령은 여러 줄에 걸쳐 있을 수 있고 명령의 절반이 실패하거나 잘못된 작업을 수행하기 eval때문에 한 줄씩 읽고 쓰는 것을 권장하는 것을 주저합니다 . eval영향을 받는 명령 유형에는 파이프라인 및 조건부 명령(각 줄이 &&, ||또는 로 끝나는 경우 |), 복합 명령(괄호로 묶인 그룹 포함), 백슬래시로 이어지는 줄, 여러 줄로 인용된 문자열 및 <<here-docs가 포함됩니다. (아마 제가 생각하지 못한 것보다 더 많을 것 같습니다.)

제한된 경우에는 stderr를 파이프로 리디렉션하여 로거로 리디렉션하는 것과 결합하여 유용 set -v할 수 있습니다. set -x그러나 실행하는 프로그램에서 stderr을 리디렉션하므로 불완전합니다. (Bash에서는 set -x쓸 다른 파일 설명자를 선택하여 해당 문제를 해결할 수 있습니다.)

ssh host some_command 만약 당신이 간다면 대화식 또는 로그인 쉘이 관련되어 있지 않으므로 rc 파일이 로드되지 않아 로깅을 우회할 수 있다는 점을 지적하고 싶습니다 .

관련 정보