han*_*ans 7 linux iptables spawn
我想生成一个暂停的进程,可能在另一个用户的上下文中(例如通过sudo -u ...),为生成的进程设置一些iptables规则,继续运行进程,并在进程时删除iptable规则存在.
是否有任何标准手段(bash,corutils等)可以让我实现上述目标?特别是,如何在暂停状态下生成进程并获取其pid?
写一个这样的包装脚本start-stopped.sh:
#!/bin/sh
kill -STOP $$ # suspend myself
# ... until I receive SIGCONT
exec $@ # exec argument list
Run Code Online (Sandbox Code Playgroud)
然后像这样调用它:
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
Run Code Online (Sandbox Code Playgroud)
然而,这一切都太过分了。您不需要在暂停状态下生成您的进程来完成工作。只需制作一个包装脚本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
Run Code Online (Sandbox Code Playgroud)
然后称之为
setup_iptables_and_start mycommand || report errors
teardown_iptables
Run Code Online (Sandbox Code Playgroud)
一种方法是gdb在程序的主函数开始时暂停程序(使用命令“break main”)。这将保证进程足够快地挂起(尽管某些初始化例程可以在 之前运行main,但它们可能不会执行任何相关操作)。但是,为此,您将需要要启动挂起的程序的调试信息。
我建议您先手动尝试一下,看看它是如何工作的,然后弄清楚如何编写您所做的事情的脚本。
或者,也可以不使用 iptables,而是使用 SELinux 或基于 ptrace 的工具(如 sydbox)来限制进程(如果这确实是您想要做的!)。