Зависит от того, сколько у вас времени. Если вы знаете C, то самый безопасный способ - это подключиться с помощью gdb к процессу ssh-agent (должен быть root) и распечатать ключевые данные. Идентификационные ключи хранятся в массиве под названием idtable, который содержит связанный список идентификационных данных. Таким образом, вы можете вывести BIGNUM данные (как определено в (1)), например:
(gdb) call BN_bn2hex(idtable[2]->idlist->tqh_first->key->rsa->n)
где число 2 - версия (вероятно, вам нужно 2), а последний элемент - один из BIGNUM (остальные - движок, e, d, p, q, dmp1, dmq1, iqmp).
Теперь, чтобы использовать эти данные, вам нужно написать небольшую утилитную программу, в которой вы определяете RSA-структуру (определенную как в (1)) и заполняете их. Возможно, Вы могли бы написать другую утилиту, чтобы сделать это автоматически, но тогда Вам понадобится больше времени, Вы можете просто распечатать данные вручную. Затем вы вызываете функцию PEM_write_RSAPrivateKey (2) с приведенными выше RSA-данными и получаете новый незашифрованный rsa-файл.
Приносим извинения за отсутствие подробностей, но если у вас есть время, то это может быть отправной точкой.
(1) /usr/include/openssl/rsa.h
(2) см. страницу man для pem(3)
.С точки зрения task_struct
потоки процесса имеют одного и того же лидера группы потоков(group_leader
в task_struct
), тогда как дочерние процессы имеют разных лидеров группы потоков (для каждого отдельного дочернего процесса ).
Эта информация предоставляется пользовательскому пространству через файловую систему /proc
. Вы можете отследить родителей и детей, взглянув на поле ppid
в /proc/${pid}/stat
или .../status
(, это дает родительский pid ); вы можете отслеживать потоки, глядя на поле tgid
в .../status
(. Это дает идентификатор группы потоков, который также является pid лидера группы ). Потоки процесса становятся видимыми в каталоге /proc/${pid}/task
:, каждый поток получает свой собственный подкаталог. (Каждый процесс имеет по крайней мере один поток.)
На практике программы, желающие отслеживать свои собственные потоки , будут полагаться на API-интерфейсы, предоставляемые библиотекой потоков, которые они используют, а не на информацию, специфичную для ОС -. Обычно в Unix -подобных системах это означает использование pthreads.
Запускает команду top
с некоторыми дополнительными параметрами:
top -H -b -n 1
-H
указывает top отображать каждый отдельный поток. Обычно top суммирует все потоки родительского процесса. -b
запускает top в пакетном режиме — информация собирается, отображается, а затем выгружается на стандартный вывод, в отличие от запуска в интерактивном режиме и обновления отображаемых данных. -b
пользователь должен сообщить top, сколько раз запускать, это делается с помощью аргумента -n
и последнего аргумента, сколько раз запускать. Итак, top -H -b -n 1
указывает системе «запускать сверху, отображать отдельные потоки, запускать в пакетном режиме и запускать только один раз».
Команда ps
создает снимок текущих запущенных процессов.
ps -eLf
Аргумент -eLf
(можно использовать как -e -L -f
, а )разбивается следующим образом:
e
указывает ps
отображать все процессы независимо от того, кто ими владеет, или их текущего состояния — активны, спящие, приостановлены, ожидают ввода-вывода и т. д.L
указывает ps
показывать отдельные потоки f
указывает ps
форматировать вывод как полный -формат листинга, а в сочетании с аргументом L
число потоков NLWP ()и поток LWP (К выходным данным добавляются столбцы ID ). Рассмотрим процесс с PID p1
Объект task_struct
дочернего процесса будет иметь PPID (родительского PID )как p1, а его PID и TGID установлены, скажем, на p2.
Объект task_struct
потока p1 будет иметь PID, установленный, скажем, p3, но TGID, установленный на p1.