Начнём модуль с изучения команды ps, которая позволяет просматривать список запущенных процессов.
В зависимости от источника, аббревиатура ps расшифровывается либо как «process snapshot» («снимок процессов»), либо как «process status» («состояние процессов») — в любом случае, команда выводит список процессов. По умолчанию ps отображает только те процессы, которые выполняются в Вашем терминале, что само по себе не очень информативно:
hacker@proc:~$ ps
PID TTY TIME CMD
329 pts/0 00:00:00 bash
349 pts/0 00:00:00 ps
hacker@proc:~$
В приведённом примере видны оболочка (bash) и сам процесс ps — больше в данном терминале ничего не выполняется. Обратите внимание: каждому процессу присвоен числовой идентификатор (идентификатор процесса, или PID) — уникальный номер, однозначно идентифицирующий каждый запущенный процесс в среде Linux. Также отображается терминал, в котором выполняются команды (в данном случае — pts/0), и суммарное время работы процессора, затраченное данным процессом (поскольку эти процессы крайне нетребовательны к ресурсам, они ещё не успели потребить даже одной секунды!).
В большинстве случаев именно это Вы и увидите при вызове ps без аргументов. Чтобы команда стала по-настоящему полезной, необходимо передать ей несколько аргументов.
Поскольку ps — очень старая утилита, синтаксис её использования несколько запутан. Существует два способа передачи аргументов.
«Стандартный» синтаксис: в этом режиме флаг -e выводит список «всех» (every) процессов, а -f обеспечивает «полный» (full) формат вывода, включая аргументы командной строки. Их можно объединить в единый аргумент -ef.
«BSD»-синтаксис: в этом режиме флаг a выводит процессы всех пользователей, x — процессы, не связанные ни с одним терминалом, а u формирует вывод, удобный для чтения пользователем (user-readable). Все три флага можно объединить в единый аргумент aux.
Оба варианта — ps -ef и ps aux — дают несколько различающийся, но взаимно узнаваемый результат.
Попробуем это на практике:
hacker@proc:~$ ps -ef
UID PID PPID C STIME TTY TIME CMD
hacker 1 0 0 05:34 ? 00:00:00 /sbin/docker-init -- /bin/sleep 1h
hacker 7 1 0 05:34 ? 00:00:00 /bin/sleep 1h
hacker 571 554 0 05:35 pts/0 00:00:00 /usr/bin/bash --init-file /usr/lib/code-server/lib/vscode/out/vs
hacker 695 571 0 05:35 pts/0 00:00:00 ps -ef
hacker@proc:~$
Здесь видны процессы инициализации среды задания (docker-init), таймер автозавершения для освобождения вычислительных ресурсов (sleep 1h — завершение через 1 час), оболочка (bash) и сам вызов ps -ef.
Примерно то же самое можно увидеть с помощью ps aux:
hacker@proc:~$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
hacker 1 0.0 0.0 1128 4 ? Ss 05:34 0:00 /sbin/docker-init -- /bin/sleep 6h
hacker 7 0.0 0.0 2736 580 ? S 05:34 0:00 /bin/sleep 6h
hacker 571 0.0 0.0 4600 4032 pts/0 Ss 05:35 0:00 /usr/bin/bash --init-file /usr/lib/code-server/li
hacker 1172 0.0 0.0 5892 2924 pts/0 R+ 05:38 0:00 ps aux
hacker@proc:~$
Между ps -ef и ps aux много общего: оба варианта отображают имя пользователя (столбец USER), PID, терминал (TTY), время запуска процесса (STIME/START), суммарное использованное процессорное время (TIME) и команду (CMD/COMMAND).
Команда ps -ef дополнительно выводит идентификатор родительского процесса (PPID) — PID процесса, из которого был запущен данный, тогда как ps aux показывает долю от общего времени ЦПУ и объёма оперативной памяти системы, используемых процессом. Кроме того, в выводе присутствует ряд других полей, которые мы пока не будем рассматривать.
ПРИМЕЧАНИЕ: Обе команды — ps -ef и ps aux — усекают вывод командной строки до ширины Вашего терминала (именно поэтому в примерах выше правый край выглядит таким ровным). Если Вам не удаётся прочитать полный путь к процессу, попробуйте увеличить окно терминала (или перенаправить вывод в файл, чтобы избежать усечения).
Кроме того, можно дважды передать опцию w (например, ps -efww или ps auxww), чтобы полностью отключить усечение.
Приступим к практике!
В данном задании файл /challenge/run снова переименован в случайное имя, причём на этот раз команда ls в каталоге /challenge недоступна! Однако процесс уже запущен, так что Вы можете найти его в списке работающих процессов, узнать имя файла и запустить его напрямую, чтобы получить флаг. Удачи!