STDINを介してシェルに入力されたスクリプトの内容を表示します。

STDINを介してシェルに入力されたスクリプトの内容を表示します。

いくつかの調査中です。/bin/shdashこの場合)シェルに入力を実行するプロセスがあります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)。

答え2

シェルを消臭しようとするかもしれませんが、これは潜在的な問題を引き起こす可能性があり、さらに私はこれをまったく正しくテストしていない可能性があります。

  1. シェルをからに移動します/bin/sh/bin/sh.bin
  2. /bin/shキャプチャ用に呼び出されるスクリプトの作成標準入力ファイルに保存して呼び出して/bin/sh.bin実行します。
  3. スクリプトが実行可能で、次のものを使用していることを確認してください。/bin/sh.bin

スクリプトは次のとおりです。

#!/bin/sh.bin

# If it looks interactive run the real shell directly
[ -t 0 ] && exec /bin/sh.bin "$@"

# Otherwise grab stdin and then execute it
tee /tmp/sh_stdin.$$ | /bin/sh.bin "$@"

一部のルートウィンドウで他のシェルが開いていることを確認してください。たとえば、sudo bashスクリプトハックが機能していることを確認するまでセッションを閉じないでください。そして変更を元に戻しました。

関連情報