Проверить, является ли заданное пользователем случайное слово исполняемой командой linux или нет?

Не существует переносимого способа сделать это с помощью ps, но вы можете использовать цикл for с ps, чтобы распечатать все процессы, а затем передать их другой команде для вывода их текущих рабочих каталогов.

Начнем с pwdx, которая выводит текущий рабочий каталог процесса.

Запуск от имени пользователя root:

for i in $(ps aux | awk '{print $2}'); do pwdx $i; done

ps aux | awk '{print $2}'выводит pid для каждого процесса.

pwdx $iПередает переменную i, которая является pid, вpwdx

Вы можете использовать pwdxдля самого pid, но цикл for выполняет их все вместе.

Вы также можете использовать lsof, но вам может потребоваться сначала установить пакет lsofв зависимости от вашей системы. Запуск от root:

for i in $(ps aux | awk '{print $2}'); do lsof -p $i | grep cwd; done

ps aux | awk '{print $2}'выводит PID для каждого процесса.

lsof -p $iПередает переменную i вlsof

grep cwdПечатает строки, содержащие cwdили текущий рабочий каталог.

Что касается команды pgrep, вы можете использовать ее в форме:

pgrep <process-name>

, чтобы также найти pid процесса, но вам все равно придется передать его либо lsof, либо pwdx, чтобы найти текущий рабочий каталог.

Первый for loopработает с Fedora 28, Centos 7.5, RHEL 7.5 и Debian 9, но не с FreeBSD 11.

Второй for loopработает с Fedora 28, Centos 7.5, RHEL 7.5 и Debian 9. Он также работает с FreeBSD 11.1, хотя в моем случае он выводит предупреждающие сообщения о том, что версия lsofпредназначена для FreeBSD 11, а у меня FreeBSD 11.1

0
04.09.2020, 22:02
1 ответ

Попробуйте выполнить конвейерную обработку с помощью команды compgen

0
28.04.2021, 23:07

Теги

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