需要 perl 程序帮助

发布于 2024-11-01 11:27:16 字数 2865 浏览 1 评论 0原文

好的,所以我尝试采用哈希值,如果数组中的任何字符串包含哈希值中的键(不是值实际键名称),则丢弃它。否则打印出字符串。此问题与 findHidden 子例程的一部分有关。我尝试了很多不同的事情,我会在下面评论我遇到的问题。我确信有人有答案,总是在堆栈溢出时得到一个答案:)

#!/usr/bin/perl
# Configure
use strict;
use warnings;
use Data::Dumper;
#
sub findHidden;
sub GetInfo; 
sub defineHash;
##############

$passwd = '/etc/passwd';
%info = ();

sub GetInfo {
        die "Cannot open: $passwd"
        unless (open(PW,$passwd));
        while(<PW>) {
                chomp;
                my ($uname,$junk1,$junk2,$junk3,$domain,$home) = split(':', $_);
                next unless ($home =~ /vs/);
                %info = (
                        domain  => $domain,
                        home    => "$home/",
                        tmp     => "$home/tmp",
                        htdocs  => "$home/www/htdocs",
                        cgibin  => "$home/www/cgi\-bin",
                );
                print "\n" . $info{domain} . "\n";
                print "+"x40,"\n\n";
                findHidden($info{tmp});
        }
}
sub findHidden {
        defineHash;
        print "Searching " . $_[0] . "\n";
        print "-"x30,"\n\n";
        @hidden = `find $_[0] -iname ".*"`;
        for(@hidden) {
                foreach $key (keys % hExcludes) {
                        if ($_ =~ /$key/){    #
                                last;         # This portion is 
                        }else{                # Only an issue when using more
                                print "$_";   # than 2 keys in my hash.
                                last;
                        }
                }
        }
}
sub defineHash {
        %hExcludes = ();
        %hExcludes = map { $_, 1 } (
                'spamd','.nfs'     # If I add another key here, it breaks.
        );

        %knownExploits = 
                ( );
        print Dumper \%hExcludes;
}
GetInfo;

这有效,并打印出如下内容:

/somedir/tmp/.testthis
/somedir/tmp/.sdkfbsdif
/somedir/tmp/.asdasdasd

我明白为什么它不起作用,因为它循环遍历一些键,其中有些是假的,有些是正的,我只是想不出如何让它做我想要的事情想要,请假设我可能想要你10把钥匙。我知道有一些方法可以在不使用排除的哈希键值的情况下做到这一点,但这正是我想要完成的。

我也尝试过如下所示的shift @hidden,但无济于事。

                foreach $key (keys % hExcludes) {
                        if ($_ =~ /$key/){    #
                                last;         #
                                shift @hidden;# This portion is 
                        }else{                # Only an issue when using more
                                print "$_";   # than 2 keys in my hash.
                                last;
                        }

另外,请记住,只有当我添加第三个...或更多键时,事情才会停止工作。

        %hExcludes = map { $_, 1 } (
                'spamd','.nfs','key3'     # If I add another key here, it breaks
        );

Ok, so I am trying take a hash and if any string in an array contains the key(not value actual key name) in the hash discard it. Else print out the string. This issue is with a portion of the findHidden sub routine. I have tried a lot of different things, I will comment below where I have issues. I'm sure someone has an answer, always get one on stack overflow :)

#!/usr/bin/perl
# Configure
use strict;
use warnings;
use Data::Dumper;
#
sub findHidden;
sub GetInfo; 
sub defineHash;
##############

$passwd = '/etc/passwd';
%info = ();

sub GetInfo {
        die "Cannot open: $passwd"
        unless (open(PW,$passwd));
        while(<PW>) {
                chomp;
                my ($uname,$junk1,$junk2,$junk3,$domain,$home) = split(':', $_);
                next unless ($home =~ /vs/);
                %info = (
                        domain  => $domain,
                        home    => "$home/",
                        tmp     => "$home/tmp",
                        htdocs  => "$home/www/htdocs",
                        cgibin  => "$home/www/cgi\-bin",
                );
                print "\n" . $info{domain} . "\n";
                print "+"x40,"\n\n";
                findHidden($info{tmp});
        }
}
sub findHidden {
        defineHash;
        print "Searching " . $_[0] . "\n";
        print "-"x30,"\n\n";
        @hidden = `find $_[0] -iname ".*"`;
        for(@hidden) {
                foreach $key (keys % hExcludes) {
                        if ($_ =~ /$key/){    #
                                last;         # This portion is 
                        }else{                # Only an issue when using more
                                print "$_";   # than 2 keys in my hash.
                                last;
                        }
                }
        }
}
sub defineHash {
        %hExcludes = ();
        %hExcludes = map { $_, 1 } (
                'spamd','.nfs'     # If I add another key here, it breaks.
        );

        %knownExploits = 
                ( );
        print Dumper \%hExcludes;
}
GetInfo;

This Works, and prints out something like this:

/somedir/tmp/.testthis
/somedir/tmp/.sdkfbsdif
/somedir/tmp/.asdasdasd

I understand why It is not working, because it is looping through the keys where some are false and some are positive, I just cannot think of how to make it do what I want, please assume I might want to you 10 keys. I know there are ways to do it without using hash key values for my excludes but it is what I want to accomplish.

I have also tried shift @hidden as below to no avail.

                foreach $key (keys % hExcludes) {
                        if ($_ =~ /$key/){    #
                                last;         #
                                shift @hidden;# This portion is 
                        }else{                # Only an issue when using more
                                print "$_";   # than 2 keys in my hash.
                                last;
                        }

Also, keep in mind that things only stop working when I add the third...or more keys.

        %hExcludes = map { $_, 1 } (
                'spamd','.nfs','key3'     # If I add another key here, it breaks
        );

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

在你怀里撒娇 2024-11-08 11:27:16

你需要的是这样的:

    @hidden = `find $_[0] -iname ".*"`;
    for(@hidden) {
        undef $isExcluded;
        foreach $key (keys % hExcludes) {
            if ($_ =~ /$key/){
                $isExcluded=1;
                last;
            }
        }
        if( ! $isExcluded ) {
            print "$_";
        }
    }

无论你通过 hExcludes 的键进行扫描时发生了什么,代码在第一个键上遇到了 last 并且不再处理。您需要设置一个标志并继续迭代,直到没有更多的键可以设置,或者找到匹配项。然后你可以打印出不匹配的值。

What you need is this:

    @hidden = `find $_[0] -iname ".*"`;
    for(@hidden) {
        undef $isExcluded;
        foreach $key (keys % hExcludes) {
            if ($_ =~ /$key/){
                $isExcluded=1;
                last;
            }
        }
        if( ! $isExcluded ) {
            print "$_";
        }
    }

Whatever happened in your scan through the keys of hExcludes, the code encountered a last on the first key and did not process any more. You need to set a flag and continue iterating until either there are no more keys to set, or a match is found. Then you can print out the values that were not matched.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文