gpt4 book ai didi

perl - 我可以从 Perl 捕获 shell 调用吗?

转载 作者:行者123 更新时间:2023-12-01 11:04:56 27 4
gpt4 key购买 nike

我有一个调用其他程序的 Perl 脚本,即它调用 system 和/或 exec 和/或 open 使用管道和/或使用反引号运算符。

我能否以打印出上述每个参数的参数的方式运行此脚本,以便我可以看到它正在调用什么?

例如像这样的程序我不能修改

#!/usr/bin/perl
sub get_arg {return "argument$_[0]";}
system "./foo", get_arg(1), get_arg(2);
print `./foo abc def`;

可能调用了这样的东西

perl --shell-trace-on ./myscript.pl

在这种情况下会输出

./foo argument1 argument2
./foo abc def

丢弃 myscript.pl 的正常输出或将其与此跟踪混合是可以接受的。

非常感谢。

最佳答案

这被认为是高级 Perl,但您可以在编译时在 CORE::GLOBAL 命名空间中定义子例程并劫持 Perl 的内置函数。调用 CORE 命名空间中的函数将调用原始内置函数。

BEGIN {
# have to use a BEGIN block so these functions are defined before
# run time
*CORE::GLOBAL::system = sub {
print STDERR "about to invoke system @_\n";
return CORE::system(@_);
};
*CORE::GLOBAL::qx = sub {
print STDERR "about to invoke qx/backticks @_\n";
return CORE::qx(@_);
};
*CORE::GLOBAL::exec = sub { ... };
};
system("sleep 5");
print `ls`;
1;

要将此功能应用于任意独立脚本,您可以将此代码放入一个简单的模块(例如,ShellTrace.pm),然后调用 perl -MShellTrace 开关。 (HT:帕尔曼):

package ShellTrace;
BEGIN {
*CORE::GLOBAL::system = sub { ... };
*CORE::GLOBAL::qx = sub { ... };
*CORE::GLOBAL::exec = sub { ... };
*CORE::GLOBAL::open = sub { ... };
}
1;

$ perl -MShellTrace ./myscript.pl
about to invoke system ./foo argument1 argument2
about to invoke qx/backticks ./foo abc def
...

关于perl - 我可以从 Perl 捕获 shell 调用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6913525/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com