提取私钥并写入perl

时间:2015-12-07 18:25:11

标签: perl

简单地说,我想从trust.pem中提取下面列出的整个私钥,并使用Perl将该文本保存到新文件(tmp6.pem)。我目前的实现只给了我第一个关键字母。

-----BEGIN CERTIFICATE-----
MIIDazCCAtSgAwIBAgIBCDANBgkqhkiG9w0BAQQFADA8MQ8wDQYDVQQDEwZoMjFk
Y2ExDTALBgNVBAsTBFdJTlQxDTALBgNVBAoTBFdJTlQxCzAJBgNVBAYTAlVTMB4X
DTE1MDQxNjA0MTYyNloXDTI1MDQxMzA0MTYyNlowQjELMAkGA1UEBhMCVVMxDTAL
BgNVBAoTBFdJTlQxDTALBgNVBAsTBFdJTlQxFTATBgNVBAMTDGgyMWRjYS1vY3Nw
NDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMCVRB8NpRhOZIpPk2qb
xqPS/X6odDsGVxHofnLJBRLBjOPQgUpa9FsXZ5//ZMMSSpudRN5N0eIcnAzPED78
FgLWbAm+D0j+OsE+1DLr+qwputxhz2Fm7f6snb/MH3JqGpioyREkY8yxNHDrN7nP
hp2fpZojlaow/Bpxg9iPZZm+J8C9NY9vun7/vLx3O5BOdH0A/qWlo4qmxH0d1vTi
KTGNE9hKE2Fl1KtZhsrJRKgOu6B0ATYL75NPKANOzNKLZmxlF2HKd3FIEOAEzSFS
/ZaJHwPD4SyLapFwqxMVfDF+MPb2Tvs9YEHBraNxWx8OiB27nAss1zfF7JeKnpck
ApsCAwEAAaOB8jCB7zAJBgNVHRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NM
IEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUY+cf2lJ6EZhgAy/rQU8f
Z4FGNLcwZgYDVR0jBF8wXYAU2Q1ss1/VO6fejshKp0XizESFEB6hQqRAMD4xETAP
BgNVBAMTCHdpbnRyb290MQ0wCwYDVQQLEwRXSU5UMQ0wCwYDVQQKEwRXSU5UMQsw
CQYDVQQGEwJVU4IBDzALBgNVHQ8EBAMCBeAwIAYDVR0lAQH/BBYwFAYIKwYBBQUH
AwEGCCsGAQUFBwMJMA0GCSqGSIb3DQEBBAUAA4GBAEETJk/Jt0/JNpKjhU6QbYhy
UNErAJyclyrrbC4JyKbTABzLyubYZz2g0VM+YKHmhHliGosjx4yqKqUc44zvYqzW
o0EpuOWDTnj7yXUZjDozVDSJiZcr27I2R3aOxvF4PGw2bk/sWRcs7QMhgT2z5RRE
vXIYrGIjW2jFz1oKHGGT
-----END CERTIFICATE-----

到目前为止,这是我的代码:

use warnings;
use strict;
use FileHandle;

use Fcntl qw(:DEFAULT :flock :seek); # import LOCK_* constants

my $F_IN = FileHandle->new("<trust.pem");
my $F_OUT = FileHandle->new(">tmp6.pem");

while (my $line = $F_IN->getline) {
    if ($line =~ m|(MIID)|) {
        $F_OUT->print("$1\n");
    }
}

$F_IN->close();
$F_OUT->close();

1 个答案:

答案 0 :(得分:0)

这将跳过输入文件的第一行和最后一行,使用input line number检测第一行并检查下一次读取是否会返回end of file以检测最后一行:

use strict;
use warnings;

open(my $in, '<', 'trust.pem') or die $!;
open(my $out, '>', 'tmp6.pem') or die $!;

while (<$in>) {
    next if $. == 1;
    last if eof($in);
    print $out $_;
}

close($in);
close($out);

如果您不介意将整个文件读入内存 - 在这种情况下完全没问题 - 您可以使用shiftpop删除第一个和最后一个数组中的行:

use strict;
use warnings;

open(my $in, '<', 'trust.pem') or die $!;
my @lines = <$in>;
close($in);

shift(@lines);
pop(@lines);

open(my $out, '>', 'tmp6.pem') or die $!;
print $out @lines;
close($out);

请注意,如果您有任何前导或尾随空白行,则前面的示例将无法正常工作。在这种情况下,我可能会做这样的事情,它跳过PEM文件页眉/页脚和只包含空格的行:

use strict;
use warnings;

open(my $in, '<', 'trust.pem') or die $!;
open(my $out, '>', 'tmp6.pem') or die $!;

while (<$in>) {
    next unless /\S/;
    next if /^-----/;
    print $out $_;
}

close($in);
close($out);