AnyEvent-SSH2
view release on metacpan or search on metacpan
lib/AnyEvent/SSH2.pm view on Meta::CPAN
};
use Carp qw( croak );
sub VERSION { $VERSION }
sub new {
my $class = shift;
my $host = shift;
croak "usage: ", __PACKAGE__, "->new(\$host)"
unless defined $host;
my $ssh = bless { host => $host }, $class;
my %p = @_;
$ssh->{_test} = delete $p{_test};
$ssh->_init(%p);
$ssh;
}
sub _init {
my $ssh = shift;
my %arg = @_;
my $user_config = delete $arg{user_config} || "$ENV{HOME}/.ssh/config";
my $sys_config = delete $arg{sys_config} || "/etc/ssh_config";
my $directives = delete $arg{options} || [];
if (my $proto = delete $arg{protocol}) {
push @$directives, "Protocol $proto";
}
my $cfg = Net::SSH::Perl::Config->new($ssh->{host}, %arg);
$ssh->{config} = $cfg;
# Merge config-format directives given through "options"
# (just like -o option to ssh command line). Do this before
# reading config files so we override files.
for my $d (@$directives) {
$cfg->merge_directive($d);
}
for my $f (($user_config, $sys_config)) {
$ssh->debug("Reading configuration data $f");
$cfg->read_config($f);
}
if (my $real_host = $ssh->{config}->get('hostname')) {
$ssh->{host} = $real_host;
}
my $user = _current_user();
if ($user && $user eq "root" &&
!defined $ssh->{config}->get('privileged')) {
$ssh->{config}->set('privileged', 1);
}
unless ($ssh->{config}->get('protocol')) {
$ssh->{config}->set('protocol',
PROTOCOL_SSH1 | PROTOCOL_SSH2 | PROTOCOL_SSH1_PREFERRED);
}
unless (defined $ssh->{config}->get('password_prompt_login')) {
$ssh->{config}->set('password_prompt_login', 1);
}
unless (defined $ssh->{config}->get('password_prompt_host')) {
$ssh->{config}->set('password_prompt_host', 1);
}
unless (defined $ssh->{config}->get('number_of_password_prompts')) {
$ssh->{config}->set('number_of_password_prompts', 3);
}
# login
if (!defined $ssh->{config}->get('user')) {
$ssh->{config}->set('user',
defined $arg{user} ? $arg{user} : _current_user());
}
if (!defined $arg{pass} && exists $CONFIG->{ssh_password}) {
$arg{pass} = $CONFIG->{ssh_password};
}
$ssh->{config}->set('pass', $arg{pass});
#my $suppress_shell = $_[2];
}
sub _current_user {
my $user;
eval { $user = scalar getpwuid $> };
return $user;
}
sub set_protocol {
my $ssh = shift;
my $proto = shift;
$ssh->{use_protocol} = $proto;
$ssh->debug($ssh->version_string);
$ssh->_proto_init;
}
sub _dup {
my($fh, $mode) = @_;
my $dup = Symbol::gensym;
my $str = "${mode}&$fh";
open ($dup, $str) or die "Could not dupe: $!\n"; ## no critic
$dup;
}
sub version_string {
my $class = shift;
sprintf "Net::SSH::Perl Version %s, protocol version %s.%s.",
$class->VERSION, PROTOCOL_MAJOR_2, PROTOCOL_MINOR_2;
}
sub _exchange_identification {
my $ssh = shift;
my $remote_id = $ssh->_read_version(@_);
($ssh->{server_version_string} = $remote_id) =~ s/\cM?$//;
my($remote_major, $remote_minor, $remote_version) = $remote_id =~
/^SSH-(\d+)\.(\d+)-([^\n]+)$/;
$ssh->debug("Remote protocol version $remote_major.$remote_minor, remote software version $remote_version");
my $proto = $ssh->config->get('protocol');
my($mismatch, $set_proto);
if ($remote_major == 1) {
if ($remote_minor == 99 && $proto & PROTOCOL_SSH2 &&
!($proto & PROTOCOL_SSH1_PREFERRED)) {
$set_proto = PROTOCOL_SSH2;
}
elsif (!($proto & PROTOCOL_SSH1)) {
( run in 2.903 seconds using v1.01-cache-2.11-cpan-6aa56a78535 )