Well, I can't get passed the segfault when connect() is called. I created an unthreaded Net::SSH2 test to ensure it works unthreaded, then applied your suggestions. Here is the result:
$ ./threaded-test7.pl 10.88.88.88 username password
num hosts: 1
num openers created: 1
0, 10.88.88.88
openers completed
dump of ssh2_handle:
bless(do{\(my $o = 140010028283744)}, "Net::SSH2")
dump of $ssh2_handles[0]:
bless(do{\(my $o = 140010028283744)}, "Net::SSH2")
Trying to connect to 10.88.88.88
Segmentation fault (core dumped)
Here is the code:
#!/usr/bin/env perl
use threads;
use threads::shared qw[ shared_clone ];
use v5.14.2;
use strict;
use Data::Dump qw(dd pp);
my (@hosts) = split /,/, shift @ARGV || usage('Missing host[,host2,...
+]');
say "num hosts: " . scalar(@hosts);
my $user = shift(@ARGV) || usage('Missing user');
my $pass = shift(@ARGV) || usage('Missing password');
my $port = 22;
my @ssh2_handles : shared;
sub opener {
use Net::SSH2;
my ( $idx, $host ) = @_;
say "$idx, $host";
my $ssh2 = Net::SSH2->new( trace => -1 );
lock @ssh2_handles;
$ssh2_handles[$idx] = shared_clone($ssh2);
return;
}
my $idx = 0;
# my @openers = async( \&opener, $idx++, $_ ) for @hosts; # this crea
+tes zero elements
my @openers;
push @openers, async( \&opener, $idx++, $_ ) for @hosts;
say "num openers created: " . scalar(@openers);
$_->join for @openers;
say "openers completed";
my $host = $hosts[0];
my $ssh2_handle = $ssh2_handles[0];
say "dump of ssh2_handle:";
dd $ssh2_handle;
say 'dump of $ssh2_handles[0]:';
dd $ssh2_handles[0];
my $ok;
eval {
say "Trying to connect to $host";
$ok = $ssh2_handle->connect( $host, $port );
};
die "Whoops: $@" if $@;
die "SSH unable to connect for some reason" unless $ok;
say "Connected to '$host'";
$ssh2_handle->auth_password( $user, $pass ) // $ssh2_handle->auth_pass
+word( $user, $pass )
// die "ERROR: Failed to authenticate";
say "Authenticated as user '$user'";
sub usage {
my ($msg) = @_;
say STDERR "FATAL: $msg" if $msg;
say STDERR "Usage: $0 host[,host2,...] user password";
exit(1);
}
Any more ideas or suggestions? Thanks!
Here is the unthreaded result:
$ ./unthreaded-test7.pl 10.88.88.88 admin password
+
num hosts: 1
0, 10.88.88.88
dump of ssh2_handle:
bless(do{\(my $o = 39570368)}, "Net::SSH2")
dump of $ssh2_handles[0]:
bless(do{\(my $o = 39570368)}, "Net::SSH2")
Trying to connect to 10.88.88.88
Connected to '10.88.88.88'
Authenticated as user 'admin'
and code:
#!/usr/bin/env perl
use threads;
use threads::shared qw[ shared_clone ];
use v5.14.2;
use strict;
use Data::Dump qw(dd pp);
my (@hosts) = split /,/, shift @ARGV || usage('Missing host[,host2,...
+]');
say "num hosts: " . scalar(@hosts);
my $user = shift(@ARGV) || usage('Missing user');
my $pass = shift(@ARGV) || usage('Missing password');
my $port = 22;
my @ssh2_handles : shared;
use Net::SSH2;
my ( $idx, $host ) = (0,$hosts[0]);
say "$idx, $host";
my $ssh2 = Net::SSH2->new( trace => -1 );
my $host = $hosts[0];
my $ssh2_handle = $ssh2;
say "dump of ssh2_handle:";
dd $ssh2_handle;
say 'dump of $ssh2_handles[0]:';
dd $ssh2;
my $ok;
eval {
say "Trying to connect to $host";
$ok = $ssh2_handle->connect( $host, $port );
};
die "Whoops: $@" if $@;
die "SSH unable to connect for some reason" unless $ok;
say "Connected to '$host'";
$ssh2_handle->auth_password( $user, $pass ) // $ssh2_handle->auth_pass
+word( $user, $pass )
// die "ERROR: Failed to authenticate";
say "Authenticated as user '$user'";
sub usage {
my ($msg) = @_;
say STDERR "FATAL: $msg" if $msg;
say STDERR "Usage: $0 host[,host2,...] user password";
exit(1);
}