Wie erhalte ich die IP - Adresse des Skriptnutzers?
ich möchte Deine Aufmerksamkeit auf folgende Umgebungsvariablen lenken, die für Dich von Interesse sein könnten:
$sport = $ENV{'SERVER_PORT'};
$addr = $ENV{'REMOTE_ADDR'};
$port = $ENV{'REMOTE_PORT'};
... und auch:
$browser = $ENV{'HTTP_USER_AGENT'};
$url = $ENV{'REQUEST_URI'};
ggf. sind auch die folgenden Scripte für Dich interessant:
-----------------------------------------------------------------------------------------
sub get_host {
-----------------------------------------------------------------------------------------
Arg 1: IP-Adresse als String
Return: Host-Name als String
my $iaddr, $host;
# String in numerisches Formmat wandeln
$iaddr = inet_aton($_[0]);
$host = gethostbyaddr ( $iaddr , AF_INET ) or return "";
return $host;
}
-----------------------------------------------------------------------------------------
sub get_user {
-----------------------------------------------------------------------------------------
Arg 1: IP-Adresse als String
Arg 2: Port des Browsers
Arg 3: Port des Servers
Return: String mit User-Name bzw. Full-Name
my ($iname, $port, $sport, $iaddr, $paddr, $proto, $question, $answer, $id);
$iname = $_[0];
$port = $_[1];
$sport = $_[2];
#-- test identd --
$iaddr = inet_aton ( $iname );
# Port 113: identd
$paddr = sockaddr_in ( 113 , $iaddr );
$proto= getprotobyname( "tcp" );
# Format der Anfrage: "<<lokaler Port>>, <<enfernter Port>>"
$question = "$port, $sport\n";
socket( SOCK, PF_INET, SOCK_STREAM, $proto) or return "";
connect( SOCK, $paddr ) or return "";
send( SOCK, $question, 0) or return "";
recv( SOCK, $answer, 1024, 0) or return "";
close( SOCK );
# Format der Antwort:
# "<<lok.Port>> , <<entf. Port>> : USERID : UNIX :ju"
(undef, undef, undef, $id ) = split (":", $answer);
if ( $id ) {
#-- now try finger --
$remote = IO::Socket::INET->new(
Proto => "tcp",
PeerAddr => $iname,
PeerPort => "finger(79)"
) or return $id;
# Systempuffer abschalten
$remote->autoflush(1);
# nach Benutzer fragen
print $remote "$id\n";
# Ausgabe auswerten
while (<$remote>) {
# Suchen nach "Name: Hugo Meier"
# if (/Name: ([a-z,‚ ‚]+)/i) {
$id = $1;
# }
}
close $remote;
}
return $id;
}
Copyright-Vermerk:
Der Code sammt in seien Ursprüngen nicht von mir sondern von "ju" von der Zeitschrift c't (vergleiche c't 4/99, S. 230)
ach ja: die Aufrufe:
$host = get_host ($addr);
$user = get_user( $addr, $port, $sport);
Ciao
K@rl