如何使用 shell 脚本拦截 perl 脚本的执行,然后实际执行它们?

Posted

技术标签:

【中文标题】如何使用 shell 脚本拦截 perl 脚本的执行,然后实际执行它们?【英文标题】:How to intercept execution of a perl script using a shell script and then actually execute them? 【发布时间】:2017-03-09 19:54:33 【问题描述】:

这个问题有点复杂,首先我要给你介绍一下情况。 我有一个包含许多域的 Web 服务器,我想知道哪些 perl 脚本在每个域中运行用户以及使用哪些参数。

为此,我想重命名 perl,并创建一个名为 perl 的脚本,将环境保存在日志中,然后在 perl 中执行脚本

脚本很简单,但明显有问题

#!/bin/sh 

when=`date "+%Y%m%d%H%M%S"`
log_file="/var/logs/perl/$when"
env > log_file
parameters=$@
echo "Parameters: $parameters" >> $log_file
/usr/local/bin/perl_bin $parameters

我用一个简单的perl脚本来测试:

#!/usr/bin/perl

print "Working\n\n";

现在,问题 如果我像这样从 shell 运行 perl 脚本:

perl script.pl

工作正常

但是如果我像这样从 shell 运行 perl 脚本:

./script.pl

不工作,错误看起来:

./script.pl:第 3 行:打印:找不到命令

我错过了什么?

【问题讨论】:

“我想知道哪些 perl 脚本在每个域中运行用户以及使用哪些参数” 这似乎是您的网络服务器可能已经记录在其日志中的内容。您使用的是哪个网络服务器? (例如 Apache、nginx 【参考方案1】:

正如 cmets 中所提到的,这对于您的目的来说可能是多余的,并且您可能会巧妙地破坏服务器上的每个 Perl 程序(例如,您传递参数不正确)。你最好使用你的服务器日志或者像lsof这样的内核级别的东西。或者问问自己,为什么您需要知道您的用户正在运行哪些程序。

但了解发生了什么很方便。


#! 中的程序必须是已编译的可执行文件。无法解释。例如...

$ cat /Users/schwern/tmp/notperl 
#!/bin/sh

perl "$@"

$ cat /Users/schwern/tmp/test.pl 
#!/Users/schwern/tmp/notperl

print "Hello, world!\n";

$ /Users/schwern/tmp/notperl /Users/schwern/tmp/test.pl
Hello, world!

$ /Users/schwern/tmp/test.pl
/Users/schwern/tmp/test.pl: line 3: print: command not found

正在发生的事情是test.pl 被执行并且program loader 看到shebang line。然后它会检查这是否是可执行程序的绝对路径。不仅仅是任何可执行文件,而是可由内核直接执行的文件

由于/Users/schwern/tmp/notperl 被解释,内核忽略#! 行并将其交给shell 执行。 shell 没有print 函数并告诉你。


通常使用/usr/bin/env 来解决这个问题。这是一个在修改后的环境中执行另一个程序的小程序。没有选项,它只是执行程序。

$ cat /Users/schwern/tmp/test.pl 
#!/usr/bin/env /Users/schwern/tmp/notperl

print "Hello, world!\n";

$ /Users/schwern/tmp/test.pl
Hello, world!

在这种情况下,内核使用参数/Users/schwern/tmp/notperl 执行/usr/bin/env/usr/bin/env 然后执行/Users/schwern/tmp/notperl

【讨论】:

感谢您的解释!我还有很多东西要学!真正的问题不是用户“使用”什么,问题是“黑客在用户不知情的情况下使用什么”我有所有日志,但什么也没有最后,我想我从哪里找到了攻击,不是来自 Web 服务器 (Apache),来自 Dovecot

以上是关于如何使用 shell 脚本拦截 perl 脚本的执行,然后实际执行它们?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 shell 脚本翻译成 Perl?

如何在perl脚本中忽略shell命令的退出状态

我的 perl 脚本如何调用和执行并后处理它

如何使用 shell/perl 脚本获取一个月的第二个星期六? [关闭]

写个脚本使用perl或shell对比oracle表数据,急啊,高分悬赏!

为啥 ncat -exec 可以与 shell 脚本一起使用,但不能与 perl 脚本一起使用?