зеркало из https://github.com/github/putty.git
45 строки
1.6 KiB
Perl
Executable File
45 строки
1.6 KiB
Perl
Executable File
#!/usr/bin/perl
|
|
|
|
# Process a PuTTY SSH packet log that has gone through inappropriate
|
|
# line wrapping, and try to make it legible again.
|
|
#
|
|
# Motivation: people often include PuTTY packet logs in email
|
|
# messages, and if they're not careful, the sending MUA 'helpfully'
|
|
# wraps the lines at 72 characters, corrupting all the hex dumps into
|
|
# total unreadability.
|
|
#
|
|
# But as long as it's only the ASCII part of the dump at the end of
|
|
# the line that gets wrapped, and the hex part is untouched, this is a
|
|
# mechanically recoverable kind of corruption, because the ASCII is
|
|
# redundant and can be reconstructed from the hex. Better still, you
|
|
# can spot lines in which this has happened (because the ASCII at the
|
|
# end of the line is a truncated version of what we think it should
|
|
# say), and use that as a cue to remove the following line.
|
|
|
|
use strict;
|
|
use warnings;
|
|
|
|
while (<>) {
|
|
if (/^ ([0-9a-f]{8}) ((?:[0-9a-f]{2} ){0,15}(?:[0-9a-f]{2}))/) {
|
|
my $addr = $1;
|
|
my $hex = $2;
|
|
my $ascii = "";
|
|
for (my $i = 0; $i < length($2); $i += 3) {
|
|
my $byte = hex(substr($hex, $i, 2));
|
|
my $char = ($byte >= 32 && $byte < 127 ? chr($byte) : ".");
|
|
$ascii .= $char;
|
|
}
|
|
$hex = substr($hex . (" " x 48), 0, 47);
|
|
my $old_line = $_;
|
|
chomp($old_line);
|
|
my $new_line = " $addr $hex $ascii";
|
|
if ($old_line ne $new_line and
|
|
$old_line eq substr($new_line, 0, length($old_line))) {
|
|
print "$new_line\n";
|
|
<>; # eat the subsequent wrapped line
|
|
next;
|
|
}
|
|
}
|
|
print $_;
|
|
}
|