Salve,
Sto cercando di creare una serie di scripts che mi permetta di trasferire files anche se si è dietro NAT o firewall.
Tempo fa mi è stato suggerito l'ottimo script "nat-traverse" http://linide.sourceforge.net/nat-traverse/ che risiede da entrambe le parti -host server- e -host client- e lanciato quasi in contemporanea sulle due macchine crea un collegameno UDP tra di loro.
ad esempio:
user@left $ nat-traverse 40000:natgw-of-right:40001
user@right $ nat-traverse 40001:natgw-of-left:40000
in più aggiungendo "--cmd" come spiegato nel sito:
"The command will be run with its STDIN and STDOUT bound to the socket, i.e. everything the command writes to STDOUT will be forwarded to the peer."
sul computer server ho questo script (stdin.pl)
codice:
#!/usr/bin/perl
use strict;
use warnings;
use IO::Handle;
STDOUT->autoflush();
while ( defined($_ = <STDIN>) )
{
print STDOUT $_ , "\n";
}
Ovvero...tutto quello che riceve lo deve rimandare al mittente
Sempre sul computer "server" eseguo:
nat-traverse --cmd="/usr/bin/perl /users/larry/stdin.pl" 40000:user@client:40001
e quasi in contemporanea sul computer "client" eseguo:
nat-traverse 40001:user@server:40000
...perfetto, la connessione è avvenuta con successo e tutto quello che digito mi viene rispedito indietro...
Ora ho bisogno nel client di legare nat-traverse ad uno script che si metta in ascolto e che tutto quello che riceve lo spedisca a nat-traverse (che a sua volta lo rispedira a user@server)
questo è lo script (socket.pl)
codice:
#!/usr/bin/perl
use strict;
use warnings;
use IO::Socket::INET;
use IO::Handle;
STDOUT->autoflush();
my $server = IO::Socket::INET->new(LocalPort => '9999', Proto => 'tcp', Reuse => 1) || die $!;
my $client;
my $buff;
while ( $server->listen() )
{
$client = $server->accept();
$client->autoflush(1);
while(1)
{
recv($client, $buff, 1024, 0);
print STDOUT $buff;
while ( defined($_ = <STDIN>) )
{
syswrite $client, $_;
}
}
}
close($server);
ora rilancio sul computer server:
nat-traverse --cmd="perl /users/larry/stdin.pl" 40000:user@client:40001
e sul computer client eseguo:
nat-traverse --cmd="perl /users/larry/socket.pl" 40001:user@server:40000
...la connessione avviene con successo e sempre sul computer client eseguo "netstat -an" e vedo che socket.pl è in ascolto su *.9999
ora mi collego con "nc 127.0.0.1 9999" e digito qualcosa...fantastico!!! mi viene rispedito indietro...vuol dire che tutto il sistema funziona...purtroppo se continuo a digitare non mi torna indietro più niente...ma socket *.9999 è ancora in ascolto!!! cosa avrò sbagliato?!?!?
in più volevo sapere, quando in socket.pl mi trovo:
recv($client, $buff, 1024, 0);
print STDOUT $buff;
while ( defined($_ = <STDIN>) )
{
syswrite $client, $_;
}
quella recv è bloccante? e poi...quando sto in "while defined($_ = <STDIN>)" devo per forza aspettare di uscire dal ciclo per poter riscrivere in recv?
Spero che abbiate capito tutto quello che ho scritto...
grazie