Linux: приостановить процесс при запуске - PullRequest
7 голосов
/ 25 апреля 2011

Я хотел бы порождать процесс, приостановленный, возможно, в контексте другого пользователя (например, с помощью sudo -u ...), установить некоторые правила iptables для порожденного процесса, продолжить выполнение процесса и удалить правила iptable когда процесс существует.

Существуют ли какие-либо стандартные средства (bash, corutils и т. Д.), Которые позволяют мне достичь вышеуказанного? В частности, как я могу запустить процесс в приостановленном состоянии и получить его pid?

Ответы [ 5 ]

4 голосов
/ 25 апреля 2011

Напишите скрипт-обертку 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
3 голосов
/ 25 апреля 2011

Вы можете написать обертку C для вашей программы, которая будет делать что-то вроде этого:

  1. fork и печатать дочерний pid.
  2. В дочернем процессе, дождитесь, пока пользовательнажмите Ввод.Это усыпляет ребенка, и вы можете добавлять правила с помощью pid.
  3. После добавления правил пользователь нажимает клавишу ввода.Ребенок запускает вашу оригинальную программу, используя exec или system.

Будет ли это работать?

Редактировать: Фактически вы можете выполнить описанную выше процедуру с помощью сценария оболочки.Попробуйте следующий bash-скрипт:

#!/bin/bash

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

Вы можете запустить это как /bin/bash ./run.sh <your command>

0 голосов
/ 25 апреля 2011

Вам, вероятно, понадобится PID запускаемой программы, до , когда программа действительно запустится.Вы можете сделать это следующим образом.

  • Запустить простой скрипт
  • Принудительно заставить скрипт ждать
    • Возможно, вы можете использовать suspend, который представляет собой bash builitin, но в худшем случае вы можете остановить его с помощью сигнала
  • Использовать PID процесса bash любым способом, которым выхотите
  • Перезапустите остановленный процесс bash (SIGCONT) и выполните exec - еще одну встроенную функцию - запускающую ваш реальный процесс ( он унаследует)ПИД )
0 голосов
/ 25 апреля 2011

Полагаю, вы могли бы написать утилиту, которая разветвляется и в которой дочерний элемент вилки приостанавливает себя непосредственно перед выполнением exec.В противном случае рассмотрите возможность использования библиотеки LD_PRELOAD для ведения своего «нестандартного» бизнеса.

Если вы заботитесь о том, чтобы сделать это безопасным, вам, вероятно, стоит взглянуть на оружие большего размера (с chroot, возможно, паравиртуализацией, пользовательским режимом linux и т. Д.);

Последний совет: если вы этого не сделаетеНе забывайте делать больше кодирования, интерфейс ptrace должен позволять вам делать то, что вы описываете (поскольку он используется для реализации отладчиков с помощью)

0 голосов
/ 25 апреля 2011

Один из способов сделать это - подключить gdb для приостановки программы при запуске ее основной функции (с помощью команды "break main").Это гарантирует, что процесс будет приостановлен достаточно быстро (хотя некоторые подпрограммы инициализации могут выполняться до main, они, вероятно, не будут делать что-либо релевантное).Однако для этого вам понадобится отладочная информация для программы, запуск которой вы хотите приостановить.

Я предлагаю вам сначала попробовать это вручную, посмотреть, как это работает, а затем поработать над сценарием того, что вы сделали.

В качестве альтернативы возможно ограничение процесса (если это действительно то, что вы пытаетесь сделать!) без с использованием iptables, с использованием SELinux или инструмента на основе ptrace, такого как sydboxвместо этого.

...