1

Я понимаю, что dash - это "модельная" оболочка - она была написана недавно и хорошо, и она реализует только то, что требуется от оболочки POSIX. Я посмотрел на исходный код тире, чтобы понять, как выполняется "трассировка" такой программы, как shell.

"Отслеживание" дефиса выполняется путем его компиляции с определенным DEBUG и вызова -o debug . Когда вы делаете это, открывается файл trace с fopen в который выводится информация о том, что делает dash при запуске.

За исключением всего механизма, как мне кажется, не работает даже в этой "отлично написанной" оболочке. Если у меня есть это в сценарии оболочки:

exec 3>&1

сразу вся информация после этого, скорее всего, больше не будет выгружаться в trace файла, но переходит на стандартный stdout . Это потому, что fopen вызывает open и это, вероятно, возвращает дескриптор файла 3.

Это не надуманный пример. Существуют широко используемые сценарии реального мира, в которых есть такие строки, как

номер exec >&1

(Я видел, что в 2 autotools configure скрипты: для программного обеспечения IP Infusion и Kerberos).

Итак, как можно отладить / отследить оболочку, когда она должна запускать подобные сценарии?

(Я не ищу инструменты вне оболочки - я хочу знать, как правильно отслеживать трассировку внутри такой программы, как оболочка. Или это вообще не возможно?)

1 ответ1

1

Вы можете использовать сокет (например, syslogd делает это). Но тогда как бы вы защитились от таких команд, как

LD_PRELOAD=my_bogus_socket_funcs.so somecommand

Или вы можете использовать dup2 чтобы изменить дескриптор файла на большее число. Но это не гарантия, может быть, только защита от ошибок скрипта (например, использование 3 вместо 2 в перенаправлениях).

Если сценарий хочет изменить поведение трассировки преднамеренно, я полагаю, что оболочка не может (или должна) делать что-то особенное.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .