いくつかの調査中です。/bin/sh
(dash
この場合)シェルに入力を実行するプロセスがありますSTDIN
。他のプロセスがこのプロセスを開始(デーモン化)し、このプロセスの機能とスクリプトの外観を知りたいです。
たとえば、次をシェルに送信すると、
echo 'echo ONE; sleep 99; sleep 666; echo TWO' | /bin/sh
いつでもプロセスリストには、sleep 99
スクリプト全体ではなく、現在実行中のコマンド(例:)のみが表示されます。
スクリプト全体の内容をどのように復元できますか?
PSこの質問のポイントは、スクリプトを誰が/何から始めたのか、なぜスクリプトが必要なのかなどを知る方法を見つけることではありません。
ベストアンサー1
Linuxでは、以下を使用してstdinから読み取られるプロセスをbpftrace
報告できます。sh
#! /usr/bin/env bpftrace
tracepoint:syscalls:sys_enter_read /comm == "sh"/ {
/*
* Upon read(2) syscall entry, record whether the read() is on fd 0 (stdin)
* and if yes, where the read goes on a per-task basis
*/
@from_stdin[tid] = (args->fd == 0);
if (@from_stdin[tid]) {
@addr[tid] = args->buf;
}
}
tracepoint:syscalls:sys_exit_read /
comm == "sh" &&
@from_stdin[tid] &&
args->ret > 0
/ {
printf(
"sh process %d read %d bytes from stdin: \"%r\"\n",
tid,
args->ret,
buf(@addr[tid], args->ret)
);
}
これにより、実行がecho 'echo foo | cat' | sh
スクリプト出力に表示されます。bpftrace
$ sudo ./that-bpftrace-script
./that-script:13:16-18: WARNING: Addrspace mismatch
comm == "sh" &&
~~
Attaching 2 probes...
sh process 83359 read 15 bytes from stdin: "echo foo | cat\x0a"
(何がわかりませんが、アドレス空間の不一致警告は無害に見えますが、抑制できます。2つのプローブを接続...そして-q --no-warning
)。