从Perl或Ruby中捕获管道脚本的bash历史记录?

时间:2013-09-20 06:42:39

标签: ruby perl bash pipe

如果我在bash shell中运行此命令:

script1 -i foo | script2 -i bar | script3 -i foobar

是否有一种强大的方法来获取该命令,因为它将出现在script1-3中的bash_history中?

据我所知,从.bash_history文件获取信息是不行的,因为写入该文件是缓冲的,因此可能不同步。

1 个答案:

答案 0 :(得分:0)

您可以将OS级别跟踪器附加到您的程序,然后查找exec系统调用。

通过shell的内容显示为["sh", "-c", "$cmd"]$cmd正是您要找的。

例如,在Linux上,使用strace

#!/usr/bin/perl

my $parent = $$;
my $pid = fork;

unless ($pid) {
    defined $pid or die "fork failed: $!\n";
    open STDOUT, '>&STDERR'; # redirect stdout to stderr
    do { exec('strace',
              -p => $parent,
              -e => 'trace=clone,execve',
              -e => 'signal=none',
              -s => 32000,
              -b => 'execve',
              '-f', '-qq') };
    warn "exec failed: $!\n";
    POSIX::_exit(1);
}

sleep 2; # wait for strace to attach to me

system 'ls $HOME';
system 'echo /*';

END {
    kill TERM => $pid;
}