如何使用 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 脚本获取一个月的第二个星期六? [关闭]