【问题标题】:Determine source of running perl executable确定运行 perl 可执行文件的来源
【发布时间】:2012-02-14 03:27:41
【问题描述】:

我更感兴趣的是服务器管理员而不是开发人员。

作为一个现实世界的例子,假设我在 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,它会生成一个不包含“邮件”可执行文件的目录。

问题 有哪些技术可以确定当前正在执行的 perl 代码的“来源”(从服务器管理员的角度来看)。我已经接受,实际上没有办法绝对确定正在运行的 perl 脚本的“来源”,因为 $0 很容易被操纵。此外,可以将代码通过管道传输到 perl 或对其进行评估。尽管如此,有没有人知道追踪 perl 脚本根目录的好方法?

【问题讨论】:

    标签: perl


    【解决方案1】:

    在“lsof”的输出中查找“cwd”(当前工作目录)行。

    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 # 
    

    希望对您有所帮助...

    编辑:使用更改“$0”的 Perl 脚本对此进行了测试

    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 # 
    

    【讨论】:

    • 我很感激,但是当用户将 $0 从“sh test.sh”更改为“bogusfile.sh”时你会怎么做?
    • 您仍然可以查看 'bogus.sh' 的 pid,并且可以使用相同的信息(使用 perl 脚本测试和验证)。如果该 $pid 的 'cwd' 中有多个脚本,您可以 grep 'bogus' 的脚本或 grep 以查看哪些脚本更改了 '$0'(对于 Perl)。如果我遗漏了什么,我深表歉意。
    • 我又看了一些;在 '/proc/$pid/' 中,文件 'sched'、'stat' 和 'status' 包含脚本的原始名称。我针对更改了“$0”的脚本对此进行了测试。
    • 有趣,我会在几个小时后打开此人的帐户,如果它有助于缩小范围,我会通知您。谢谢!
    • 我看不到任何可以在这里私信的方法,所以...运气好吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-16
    • 1970-01-01
    • 2015-01-24
    • 1970-01-01
    • 1970-01-01
    • 2021-10-21
    相关资源
    最近更新 更多