8

おそらく別のユーザーのコンテキストで(たとえば、sudo -u ...を介して)中断されたプロセスを生成し、生成されたプロセスにいくつかのiptablesルールを設定し、プロセスの実行を継続し、プロセスが停止したときにiptableルールを削除したいと思います存在します。

上記を達成できる標準的な手段(bash、corutilsなど)はありますか?特に、サスペンド状態のプロセスを生成し、その pid を取得するにはどうすればよいですか?

4

5 に答える 5

5

start-stopped.sh次のようなラッパー スクリプトを記述します。

#!/bin/sh
kill -STOP $$                                    # suspend myself 
                                                 # ... until I receive SIGCONT
exec $@                                          # exec argument list

そして、次のように呼び出します。

sudo -u $SOME_USER start-stopped.sh mycommand &  # start mycommand in stopped state
MYCOMMAND_PID=$!
setup_iptables $MYCOMMAND_PID                    # use its PID to setup iptables
sudo -u $SOME_USER kill -CONT $MYCOMMAND_PID     # make mycommand continue
wait $MYCOMMAND_PID                              # wait for its termination
MYCOMMAND_EXIT_STATUS=$?                         
teardown_iptables                                # remove iptables rules
report $MYCOMMAND_EXIT_STATUS                    # report errors, if necessary

ただし、これはすべてやり過ぎです。ジョブを完了するために、プロセスを中断状態で生成する必要はありません。ラッパースクリプトを作成するだけsetup_iptables_and_startです:

#!/bin/sh
setup_iptables $$             # use my own PID to setup iptables
exec sudo -u $SOME_USER $@    # exec'ed command will have same PID

そして、それを次のように呼び出します

setup_iptables_and_start mycommand || report errors
teardown_iptables
于 2011-04-24T21:06:16.690 に答える
3

次のようなことを行うプログラムの C ラッパーを作成できます。

  1. fork子pidを出力します。
  2. 子で、ユーザーが Enter を押すのを待ちます。これにより、子がスリープ状態になり、pid を使用してルールを追加できます。
  3. ルールが追加されたら、ユーザーは Enter キーを押します。exec子は、またはを使用して元のプログラムを実行しますsystem

これは機能しますか?

編集:実際には、シェルスクリプトを使用して上記の手順を実行できます。次のbashスクリプトを試してください:

#!/bin/bash

echo "Pid is $$"
echo -n "Press Enter.." 
read 
exec $@

これを次のように実行できます/bin/bash ./run.sh <your command>

于 2011-04-24T20:31:24.613 に答える
0

これを行う 1 つの方法gdbは、メイン関数の開始時にプログラムを一時停止するように参加させることです (コマンド「break main」を使用)。これにより、プロセスが十分に速く中断されることが保証されます (一部の初期化ルーチンは の前mainに実行できますが、おそらく関連することは何もしません)。ただし、このためには、中断を開始したいプログラムのデバッグ情報が必要になります。

最初にこれを手動で試し、どのように機能するかを確認してから、行ったことをスクリプト化する方法を考えることをお勧めします。

または、 iptables を使用せずに、代わりに SELinux または sydbox のような ptrace ベースのツールを使用して、プロセスを制限することもできます (実際にそれがあなたがしようとしているのであれば!) 。

于 2011-04-24T20:13:21.220 に答える
0

プログラムが実際に実行を開始する前に、おそらくPID開始するプログラムの が必要です。このようにできます。

  • 単純なスクリプトを開始する
  • スクリプトを強制的に待機させる
    • おそらくsuspendbash のビルドを使用できますが、最悪の場合、シグナルで停止させることができます
  • PIDあらゆる方法で bash プロセスを使用する
  • 停止した bash プロセスを再起動し ( SIGCONT)、exec別のビルトインを実行して、実際のプロセスを開始します ( PID を継承します) 。
于 2011-04-24T20:17:02.363 に答える
0

フォークするユーティリティを自分で書くことができ、フォークの子がexecを実行する直前に一時停止する可能性があると思います。それ以外の場合は、LD_PRELOAD ライブラリを使用して「カスタム」ビジネスを行うことを検討してください。

それを安全にすることに関心がある場合は、おそらくより大きな銃を検討する必要があります(chroot、おそらく準仮想化、ユーザーモードLinuxなど)。

最後のヒント: コーディングをさらに行うことを気にしない場合は、ptrace インターフェースを使用して、説明したことを実行できるようにする必要があります (デバッガーの実装に使用されるため)。

于 2011-04-24T20:17:49.150 に答える