Определить источник запуска исполняемого Perl - PullRequest
1 голос
/ 13 февраля 2012

Меня это интересует больше с точки зрения администратора сервера, чем со стороны разработчиков.

В качестве примера из реальной жизни, скажем, у меня есть строка в ps aux, которая показывает:

usercom  1696  0.1  0.2  34104  4556 ?        Ss   07:33   0:20 ./mail

Не очевидно, что это скрипт на perl, но я могу определить его, выполнив «lsof -p 1696», который отображает (в дополнение к другим вещам):

COMMAND  PID     USER   FD   TYPE     DEVICE    SIZE       NODE NAME

perl    1693 usercom  txt    REG       0,49   17326   99846241 /home/virtfs/usercom/usr/local/bin/perl

Итак, это говорит мне, что это скрипт, выполняющийся в интерпретаторе perl для этого пользователя (в openvz).

Если я посмотрю на cwd для этого скрипта, то получится каталог, в котором нет исполняемого файла «mail».

Вопрос Какие существуют методы для определения «происхождения» perl-кода, который выполняется в данный момент (с точки зрения администратора сервера). Я пришел к выводу, что на самом деле не существует способа абсолютно точно определить «источник» запущенного сценария Perl, поскольку $ 0 очень легко манипулировать. Кроме того, можно передать код в perl или проверить его. Тем не менее, кто-нибудь знает какие-либо хорошие способы отслеживания корня сценария Perl?

1 Ответ

0 голосов
/ 13 февраля 2012

Найдите строку 'cwd' (текущий рабочий каталог) в выводе 'lsof'.

localhost proc # ps ax | grep test
 4751 pts/18   S+     0:00 sh test.sh

localhost proc # lsof +p 4751
COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF     NODE NAME
sh      4751 user  cwd    DIR    8,3    12288  4964356 /home/user
<CLIP>
localhost proc #    

Просто чтобы убедиться, что я переместил скрипт и попробовал его снова.

user@localhost ~ $ mv test.sh bin/
user@localhost ~ $ cd bin
user@localhost ~/bin $ sh test.sh

localhost proc # ps ax | grep test
 4848 pts/18   S+     0:00 sh test.sh

localhost proc # lsof +p 4848
COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF     NODE NAME
sh      4848 user  cwd    DIR    8,3     4096  4965757 /home/user/bin
<CLIP>
localhost proc # 

Если вы не хотите полагаться на 'lsof', вы можете заглянуть в каталог '/ proc / $ pid /' и посмотреть, куда ссылаются 'cwd' на:

localhost 4848 # ls -l
total 0
<CLIP>
lrwxrwxrwx 1 user user 0 Feb 13 18:51 cwd -> /home/user/bin
<CLIP>
localhost 4848 # 

Надеюсь, это поможет ...

Редактировать: Протестировано это с помощью Perl-скрипта, который меняет '$ 0'

user@localhost ~/bin $ ./test.pl 

localhost 4848 # ps ax | grep test
 5004 pts/17   S+     0:00 grep --colour=auto test

localhost 4848 # ps ax | grep bogus
 5002 pts/18   S+     0:00 bogus.pl
 5006 pts/17   R+     0:00 grep --colour=auto bogus

localhost 5002 # lsof +p 5002
COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF     NODE NAME
test.pl 5002 user  cwd    DIR    8,3     4096  4965757 /home/user/bin
<CLIP>
localhost 5002 # 


localhost ~ # cd /proc/5002/
localhost 5002 # ls -l
total 0
<CLIP>
lrwxrwxrwx 1 user user 0 Feb 13 19:12 cwd -> /home/user/bin
<CLIP>

Файл '/ proc / $ pid / status' содержит оригинальное имя скрипта:

localhost 5002 # cat status
Name:   test.pl
<CLIP>
localhost 5002 # 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...