Làm thế nào để Truy tìm dấu vết một chương trình như shell?


1

Tôi hiểu rằng đó dashlà một vỏ "mô hình" - nó được viết gần đây và tốt và nó chỉ thực hiện những gì được yêu cầu của vỏ POSIX. Tôi đã xem mã nguồn dash để hiểu cách "truy tìm" của một chương trình như shell, được thực hiện.

"Truy tìm" dấu gạch ngang được thực hiện bằng cách biên dịch nó với DEBUGđịnh nghĩa và gọi với -o debug. Khi bạn làm điều đó, một tệp traceđược mở ra với fopenthông tin nào được đưa ra về những gì dashđang làm khi nó chạy.

Ngoại trừ toàn bộ cơ chế, xuất hiện với tôi, không hoạt động, ngay cả trong lớp vỏ "được viết hoàn hảo" này. Nếu tôi có cái này trong shell script:

exec 3>&1

ngay lập tức tất cả các thông tin sau đó, rất có thể không còn được đưa vào tập tin tracemà tiếp tục stdout. Đó là bởi vì fopencác cuộc gọi openvà có khả năng trả về mô tả tệp 3.

Đây không phải là một ví dụ giả định. Có những kịch bản trong thế giới thực thường được sử dụng có các dòng như

execcon số>&1

(Tôi thấy rằng trong 2 configuretập lệnh tự động : cho phần mềm IP Infusion và Kerberos).

Vậy làm thế nào một shell có thể được gỡ lỗi / theo dõi, khi nó phải chạy các script như thế này?

(Tôi không tìm kiếm các công cụ bên ngoài shell - Tôi muốn biết đâu là cách chính xác để theo dõi, bên trong một chương trình như shell. Hay nói chung là không thể?


"strace -f" có thể có hoặc không hữu ích
barrycarter

@barrycarter vâng, cảm ơn bạn, điểm tốt, nhưng ... tôi muốn làm điều đó bên trong vỏ - làm rõ câu hỏi. Về cơ bản, tôi muốn biết, nếu Chúa viết một cái vỏ, họ sẽ thực hiện truy tìm như thế nào. Hoặc là nó không thể nói chung do vấn đề trên.
322908

Câu trả lời:


1

Bạn có thể sử dụng một ổ cắm ( ví dụ syslogd làm điều này). Nhưng sau đó, làm thế nào bạn sẽ bảo vệ chống lại các lệnh như

LD_PRELOAD=my_bogus_socket_funcs.so somecommand

Hoặc bạn có thể sử dụng dup2để thay đổi bộ mô tả tệp thành số cao hơn. Nhưng điều đó không có gì đảm bảo, có lẽ chỉ bảo vệ chống lại các lỗi tập lệnh (chẳng hạn như sử dụng 3 thay vì 2 trong các chuyển hướng).

Nếu kịch bản muốn thay đổi hành vi truy tìm mục đích, tôi tin rằng không có nhiều vỏ có thể (hoặc nên) làm.


không phải là "kịch bản muốn thay đổi truy tìm mục đích", những kịch bản này thì không. Tôi không tìm cách để chạy các kịch bản lừa đảo, chỉ là những người viết kém. Kịch bản sử dụng 3 cho một số mục đích khác, nó có mã hóa cứng và không biết rằng ai đó có thể đã mở nó.
322908

vâng, tôi nghĩ rằng dup2một "mô tả tập tin số ma thuật" có lẽ là đặt cược tốt nhất của tôi ... cảm ơn bạn
322908

1
Trong trường hợp cụ thể, một trong hai cách tiếp cận sẽ có hiệu quả. Quan điểm của tôi là trừ khi bạn biết những lỗi trong kịch bản, thực sự không có cách nào để đảm bảo rằng chúng sẽ chạy. Các tập lệnh có thể có lý do hợp lệ để thực hiện những việc như ghi đè các chức năng của ổ cắm (tôi đã tự sử dụng nó).
Krumelur
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.