這是課堂上練習的程式,可以掃瞄某主機哪些 Port 有開放。
利用 Perl::Socket 建立 socket 後 connent() 主機,如果回應 true 表示連線正確 (Port 有開啟)。
使用方法:
portscan.pl <主機名稱>
#!/usr/bin/perl
use strict;
use Socket;
my $host = shift;
print "Enter scan port start:";
my $port = <>;
print "Enter scan port end:";
my $port_end = <>;
my $protocol = getprotobyname('tcp');
$host = inet_aton($host) or die "$host failed";
for (my $i = $port; $i <= $port_end; $i++) {
socket(SOCK , AF_INET , SOCK_STREAM , $protocol) or die "socket() failed: $!";
my $dest_addr = sockaddr_in($i , $host);
if (connect(SOCK , $dest_addr)) {
print "Port: $i is open\n";
}
close SOCK;
}
Other, 程式筆記
perl
詳情請看這篇討論串
真是服了這位高人,讓 Perl 可以用文言文寫
目前這個 module 已經放上 CPAN,名稱為「Lingua::Sinica::PerlYuYan」
有興趣的可以試看看。
不過我想對現代人來說,英文應該是比文言文好懂吧!
Other, 程式筆記
perl
功能說明:
讀取成績檔內容並計算平均,最後寫入新檔。
成績資料檔:testdata.txt (檔名改為 testdata)
實作:
#!/usr/bin/perl
use strict;
open FILE, "testdata" or die "Can not open file: $!";
my @lines;
foreach (<FILE>) {
chomp;
split(/__/);
my @grades = split(/,/, $_[1]);
my $total = 0;
my $average = 0;
foreach my $grade (@grades) {
$total += $grade;
}
$average = $total/@grades;
my $line = $_[0].'__'.$_[1].'=>'.$average."\n";
push @lines, $line;
}
open OUT_FILE, ">testdata2" or die "Can not open file: $!";
print OUT_FILE @lines;
close FILE;
close OUT_FILE;
筆記:
chop 和 chomp 的差異。
這兩個都可以刪除尾端的換行字元,但使用 chomp 是比較安全的,因為 chop 會把尾端是 0 的一併刪除,造成錯誤結果。
Other, 程式筆記
perl
題目:
1. 試著把串列 (24, 33, 65, 42, 58, 24, 87) 放入陣列中,並讓使用者輸入索引值 (0…6),然後印出陣列中相對應的值。
2. 把剛剛的陣列進行排序,並且印出排序後的結果。
3. 取出陣列中大於40的所有值。
4. 將所有陣列中的值除以 10 後印出。
實作:
#!/usr/bin/perl
use strict;
my @array = (24, 33, 65, 42, 58, 24, 87);
while (1) {
print "1) Select No.1 \n";
print "2) Select No.2 \n";
print "3) Select No.3 \n";
print "4) Select No.4 \n";
print 'Please enter a number: '; chomp($_ = <>);
if ($_ == 1) {
while (1) {
print "Please enter 0-6 ('q' to exit): ";
chomp($_ = <>);
last if ($_ eq 'q');
print $array[$_]."\n";
}
} elsif ($_ == 2) {
my @array_sort = sort(@array);
print "$_\t" for @array_sort;
print "\n";
} elsif ($_ == 3) {
my @sift = grep {$_ > 40} @array;
print "$_\t" for @sift;
print "\n"
} elsif ($_ == 4) {
my @answer = map {$_ / 10} @array;
print "$_\t" for @answer;
print "\n";
}
}
Other
perl
近期迴響