Горячая замена процесса PID 1 внутри контейнера без сбоя

Суть в том, чтобы добавить немного больше контекста в регулярное выражение:

sed -e "s#\\(url(\\\\'\\)\\(test.png\\\\')\\)#\1/navigation/\2#g"

Также обратите внимание, что:

  • Внутри двойных кавычек 'не имеет особого значения.
  • В двойных кавычках вам нужно написать \\, чтобы получить один \.
2
09.11.2020, 21:31
1 ответ

as if it was execve'd from the process itself

Способ состоит в том, чтобы сделать вызов процесса execve.

Это работа отладчика.

У вас должны быть как минимум права пользователя, запускающего процесс. В зависимости от настройкиkernel.yama.ptrace_scopeвам может понадобиться root внутри контейнера, что обычно одно и то же. Я не уверен, какие привилегии применяются снаружи контейнера :Я не знаю, как правила проверки доступа ptrace взаимодействуют с Docker.

Вот сценарий, использующий sh и gdb. Вы можете запустить его из контейнера (передать 1 как PID )или снаружи (передать PID процесса инициализации контейнера ).

#!/bin/sh
set -e

help_and_exit () {
  cat <<EOF
Usage: $0 PID COMMAND [ARG...]
Use gdb to replace the running process PID by the specified command.
EOF
  exit $1
}
if [ "$1" = "--help" ]; then
  help_and_exit
elif [ $# -lt 2 ]; then
  help_and_exit 120 >&2
fi

pid=$1; shift

# Quote the command path and the arguments as a C string.
args=
add_arg () {
  args="$args\""
  while case "$1" in *[\\\"]*) true;; *) false;; esac; do
    set -- "${1#*[\\\"]}" "${1%"${1#*[\\\"]}"}"
    args="$args${2%?}\\${2#"${2%?}"}"
  done
  args="$args$1\", "
}
add_arg "$1"
args="$args$args"; shift
for x; do
  add_arg "$x"
done
args="${args}(char*)0"

gdb -n -pid "$pid" -batch -ex "call execlp($args)"

Если вы не хотите устанавливать gdb, вы можете написать небольшую программу на Python или C (или любом другом предпочитаемом вами языке ), который выполняет необходимыеptraceвызовы.

Учтите, что если PID 1 контейнера является программой, предназначенной для использования в качестве инициализатора, у нее, вероятно, есть способ -указать ему -выполнить exec, и вы должны использовать его. Программа может выполнить очистку перед выполнением -и может передать своему преемнику исполняемые дополнительные данные, например, в файле или в переменной окружения.

2
18.03.2021, 22:51

Теги

Похожие вопросы