Надежный способ заключить в тюрьму дочерние процессы с помощью 'nsenter':

Необходимо сделать файл читаемым для копирования его. Это не связано с выбором инструмента: каждая программа не откроет файл для чтения, так как у Вас нет разрешения считать его.

Если ACLs включены (с ext2/ext3/ext4, это требует опции монтирования acl) и Вы не интересуетесь копированием их, добавляете ACL, который позволяет пользователю, делающему копию читать файл.

setfacl -R -m u:username:rX sourcedirectory

Иначе необходимо будет или изменить полномочия файла заранее и восстановить их (с обеих сторон) впоследствии или сделать копию как корень.

15
11.04.2014, 01:27
1 ответ
[1133201]Создать пространство имен PID

Правильная команда для использования здесь - [1133596]unhare[1133597]. Обратите внимание, что необходимые для этого опции доступны только в [1133598]util-linux 2.23[1133599]. Идея состоит в том, чтобы создать новое [1133600]PID пространство имён [1133601] для запускаемой программы таким образом, чтобы все ее дочерние элементы также создавались в этом пространстве имён. Вы можете запустить команду в новом пространстве имён PID, просто сделав:

Чтобы запустить оболочку, просто опустите эту команду. Это создаст процесс, который вместе с любым из своих дочерних процессов будет иметь PID, как обычно, в родительском (системном) пространстве имён. Однако, внутри нового пространства имен он будет иметь PID [1133602]1[1133603] вместе с некоторыми специальными характеристиками процесса [1133604]init[1133605]. Возможно, наиболее релевантной характеристикой с точки зрения мониторинга является то, что если кто-либо из его потомков осиротел, то они будут повторно включены в этот процесс, а не в реальный процесс [1133606]init[1133607].

Просто сделать это может быть достаточно для большинства случаев мониторинга. Как уже упоминалось ранее, все процессы в пространстве имен имеют PID в родительском пространстве имен, поэтому для мониторинга их активности можно использовать обычные команды. Мы также уверены, что если какой-нибудь процесс в пространстве имён остаётся без внимания, он не выпадает из ветвей дерева процессов под PID программы верхнего уровня, что означает, что его всё ещё можно легко отследить.

Сочетание с пространством имён mount[12125]Однако, что мы не можем сделать, так это следить за процессом относительно PID, который он [1133608]думает[1133609]. Для этого, и в частности для того, чтобы иметь возможность использовать команду [1133610]ps[1133611] в новом пространстве имён, необходимо смонтировать отдельную [1133612]procfs[1133613] файловую систему для пространства имён. Это, в свою очередь, приводит к другой проблеме, поскольку единственное место, которое [1133614]ps[1133615] принимает для [1133616]procfs[1133617] - это [1133618]/proc[1133619]. Одним из решений было бы создание [1133620]chroot[1133621] тюрьмы и установка там новых [1133622]procfs[1133623]. Но это громоздкий подход, так как, как минимум, нам нужно будет скопировать (или, по крайней мере, жесткую ссылку) любые двоичные файлы, которые мы собираемся использовать вместе с любыми библиотеками, от которых они зависят, в новый корень.[12126]Решение также заключается в использовании нового пространства имён [1133624]смонтированного[1133625]. В этом случае мы можем смонтировать новое [1133626]procfs[1133627] таким образом, чтобы использовать истинный корень [1133628]/proc[1133629] каталога, который может быть использован в пространстве имен PID и не мешать больше ничему. Чтобы сделать этот процесс очень простым, команда [1133630]unshare[1133631] дает возможность [1133632]--mount-proc[1133633]:[12127]Теперь при выполнении [1133634]ps[1133635] внутри объединенных пространств имен будут показаны только процессы с пространством имен ПИД, а процесс верхнего уровня будет показан как имеющий ПИД на [1133636]1[1133637]. [12128] А как же [1133638]nsenter[1133639]? [12129] Как следует из названия, [1133640]nsenter[1133641] можно использовать для входа в пространство имен, которое уже было создано с [1133642]unhare[1133643]. Это полезно, если мы хотим получить информацию, доступную только изнутри пространства имен, от другого, не связанного с этим, скрипта. Самый простой способ - дать PID любой программы, запущенной в пространстве имен. Для ясности это должен быть PID целевой программы в пространстве имен, из которого выполняется [1133644]nsenter[1133645] (так как пространства имен могут быть вложены, то один процесс может иметь много PID). Чтобы запустить оболочку в целевом пространстве имён PID/mount, просто сделайте:[12130]Если это пространство имён настроено так, как описано выше, то [1133646]ps[1133647] теперь будет перечислять только процессы в этом пространстве имён.[1133222].
19
27.01.2020, 19:50

Теги

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