我试图从/dev/fd/0
这就是我写的,我只想打印我在命令shell上输入的每个命令。我用Perl写了这个,但还不够好:
#!/usr/bin/perl
use strict;
use warnings;
open my $fh, "<", "/dev/fd/0" or die "bububububu";
while (<$fh>) {
print $_."\n";
}
close $fh;
因此它虽然卡住了但它不会打印任何东西。有谁知道怎么做??? 如果这不可能,我可以将所有命令放在一个文件中,然后以某种方式从'0'文件句柄中读取它们。我只想捕获进入系统的每个命令。
示例文件:
#!/usr/bin/perl
use strict;
use warnings;
system("./.file2");
然后file2是:
echo this is hard!!!
所以我希望我的程序运行第一个文件。当我读取'0'文件句柄时,我希望以某种方式存储在数组中运行的所有行。
主要编辑:我认为你错过了我。我知道STDIN和它的工作原理。事情是我不想要书写从STDIN读取输入。我希望这篇文章可以从我在SHELL PROMPT中输入的内容中阅读。所以说我运行文件,然后我打开另一个TEMINAL,然后我在终端输入命令。我希望这篇文章能够识别出这些线索并在阵列中保存它们。
答案 0 :(得分:2)
/dev/fd/0
句柄对于每个进程都是不同的(当你打开它时,你基本上复制/复制了父进程继承的fh
),所以你在perl中打开的文件句柄不会是和你的bash一样。
我相信你在这里有(至少)两种选择:
while( <STDIN> )
方法读取命令,然后将它们存储到您的文件中并将它们传递给system()
或$qx()
以由shell执行,但是,因为这会启动一个shell对于每个命令,这仅适用于简单的应用程序。您可以通过在子子中打开shell并将其STDIN / STDOUT文件句柄与perl文件句柄连接来解决此问题,但是您可以管理新命令并读取其输入。有关详细信息,请参阅perldoc perlopentut
(管道打开部分)和/或IPC::Open2
(http://search.cpan.org/~rjbs/perl-5.18.0/ext/IPC-Open3/lib/IPC/Open2.pm)。结合Term::ReadLine
,您可以模拟shell的完整输入方法,并且在记录所有命令时不会发现太多差异。~/.bash_history
中,您可以使用`history。如果您的应用程序与安全性相关,并且您尝试记录系统上root
所执行的所有内容,那么您可能还需要查看sudo
。
希望这可以帮到你, 基督教
答案 1 :(得分:0)
有一个特殊的Perl文件描述符与标准输入相关联。您可以将代码重写为:
use strict;
use warnings;
while( <STDIN> ) {
print;
last if /^QUIT/; #Exit loop if QUIT was typed
}
#<-- Note: no open neither close