![Cytat](images/metro/blue/misc/quote_icon.png)
Napisał
TQM
w sumie to bedzie tego hmmm... strzelam na oko 25 linii kodu
![Smile](images/smilies/smile.png)
no moze ciutke wiecej...
No dobra... 30 linii (wliczajac puste dodane dla czytelnosci) nie uzywajac zadnych modulow do obslugi HTTP tylko jadac po surowych socketach ![Big Grin](images/smilies/biggrin.png)
Kod:
use IO::Socket;
use strict;
sub getPID {
my ($proto, $peer) = @_;
return undef if !defined $proto or !defined $peer;
chomp(my @netstat = `netstat -nao`);
@netstat = grep(/$proto.*?$peer/i, @netstat);
my @PIDs = map { /(\d+)$/ } @netstat;
return $PIDs[0] || undef;
}
my $sock = IO::Socket::INET->new(Listen => 5,
LocalPort => 9962,
Proto => 'tcp') or die "Can't bind : $@\n";
while (my $c = $sock->accept()) {
my @req;
while (<$c>) { /\w/ ? push @req, $_ : last };
@req = grep (/^GET\s+/i, @req);
$req[0] =~ m!/(TCP|UDP)/(.*?:\d+)!i;
if (my $pid = getPID($1, $2)) {
chomp(my @resp = `tasklist /v /fi "pid eq $pid" /fo csv`);
print $c "Content-type: text/html\n\n";
print $c join "\n", @resp, "\n";
} else {
print $c "Content-type: text/html\n\nERROR: No such connection!\n";
}
$c->close;
}
W kodzie nie ma demonizacji czy tez w jezyku microsoftu ustawienia programu jako uslugi, ale... jak ktos bardzo chce to polecam http://www.roth.net/perl/Daemon/ i http://search.cpan.org/~daveroth/Win...2/Scheduler.PM - samo zrobienie uslugi windows zajmie 2-3x tyle kodu co cala aplikacja wiec nie wiem czy to ma sens robic to na forum.
Dobra... jak to dziala? Odpalamy skrypta i z innej maszyny robimy sobie tak:
Kod:
tm@TQM-desktop:~$ GET http://winxp.lan:9962/TCP/10.0.0.5:22
Content-type: text/html
"Image Name","PID","Session Name","Session#","Mem Usage","Status","User Name","CPU Time","Window Title"
"putty.exe","5580","Console","0","2,552 K","Running","TQM-LENOVO\tqm","0:00:02","10.0.0.5 - PuTTY"
Czyli jak widac robi to czego sie od niego oczekuje!
Serwerek slucha na porcie 9962 (czyli literkami bedzie 'proc') jak mi sie zdaje hihi, dalej pobiera jako URL protokol (tcp lub udp - wielkosc znakow nie ma znaczenia) oraz na koncu adres zdalnej maszyny. Tak wiec serwerek chodzi sobie na windows, laczymy sie z innej maszyny w LAN i pytamy o to jaki program laczy sie z tego windowsa do 10.0.0.5:22 i dostajemy odpowiedz w CSV, ktora dalej mozemy sobie opracowac czym chcemy!
Aplikacji nie testowalem dokladnie ale zwraca prawdziwe dane, to wiem na pewno
Jesli jedna aplikacja lub kilka aplikacji laczy sie do tego samego serwera na ten sam port (np 2 przegladarki wchodza na te sama strone) to pokaze sie tylko jeden proces - mozna nieco zmienic kod i bedzie raportowac wszystkie ale to zostawiam jako cwiczenie dla czytelnikow ![Smile](images/smilies/smile.png)
Jak ktos bedzie chcial abym wyjasnil dokladnie kod to prosze o info - jak znajde pare minut miedzy robieniem serwerow to opisze.