Câu chuyện dài: Tôi muốn theo dõi cách thức mà một số thực thi được gọi để theo dõi một số hành vi hệ thống. Hãy nói rằng tôi có một thực thi:
/usr/bin/do_stuff
Và nó thực sự được gọi bằng một số tên khác nhau thông qua symlink:
/usr/bin/make_tea -> /usr/bin/do_stuff
/usr/bin/make_coffee -> /usr/bin/do_stuff
và như thế. Rõ ràng, do_stuff
sẽ sử dụng đối số đầu tiên mà nó nhận được để xác định hành động nào thực sự được thực hiện và phần còn lại của các đối số sẽ được xử lý theo hướng đó.
Tôi muốn ghi lại bao giờ gọi đến /usr/bin/do_stuff
(và danh sách đầy đủ các đối số). Nếu không có liên kết tượng trưng, tôi chỉ cần chuyển do_stuff
đến do_stuff_real
và viết một kịch bản
#!/bin/sh
echo "$0 $@" >> logfile
/usr/bin/do_stuff_real "$@"
Tuy nhiên, như tôi biết rằng nó sẽ kiểm tra tên mà nó được gọi bởi, điều này sẽ không hoạt động. Làm thế nào để một người viết một kịch bản để đạt được điều tương tự nhưng vẫn chuyển sang do_stuff
đúng 'tên được sử dụng thực thi'?
Đối với bản ghi, để tránh câu trả lời trên các dòng này:
- Tôi biết rằng tôi có thể làm điều đó trong C (sử dụng execve), nhưng sẽ dễ dàng hơn rất nhiều nếu tôi có thể, trong trường hợp này, chỉ cần sử dụng một tập lệnh shell.
- Tôi không thể đơn giản thay thế
do_stuff
bằng một chương trình đăng nhập.