App-SimpleBackuper
view release on metacpan or search on metacpan
local/lib/perl5/Net/SFTP/Foreign/Backend/Unix.pm view on Meta::CPAN
my $ask_for_username_at_login;
my $pass_is_passphrase;
my $password_prompt;
if (defined $pass) {
$pass_is_passphrase = 1;
}
else {
$pass = delete $opts->{password};
if (defined $pass) {
$sftp->{_password_authentication} = 1;
$password_prompt = $sftp->{_password_prompt} = delete $opts->{password_prompt};
if (defined $password_prompt) {
unless (ref $password_prompt eq 'Regexp') {
$password_prompt = quotemeta $password_prompt;
$password_prompt = qr/$password_prompt\s*$/i;
}
}
$ask_for_username_at_login =
$sftp->{_ask_for_username_at_login} =
( delete($opts->{ask_for_username_at_login}) ||
delete($opts->{asks_for_username_at_login}) );
if ($ask_for_username_at_login) {
croak "ask_for_username_at_login set but user was not given" unless defined $user;
croak "ask_for_username_at_login can not be used with a custom password prompt"
if defined $password_prompt;
}
}
}
delete $opts->{expect_log_user}; # backward compatibility, not used anymore
my $stderr_discard = delete $opts->{stderr_discard};
my $stderr_fh = ($stderr_discard ? undef : delete $opts->{stderr_fh});
my $open2_cmd = delete $opts->{open2_cmd};
my $ssh_cmd_interface = delete $opts->{ssh_cmd_interface};
my @open2_cmd;
if (defined $open2_cmd) {
@open2_cmd = _ensure_list($open2_cmd);
}
else {
my $host = delete $opts->{host};
defined $host or croak "sftp target host not defined";
my $key_path = delete $opts->{key_path};
my $ssh_cmd = delete $opts->{ssh_cmd};
$ssh_cmd = 'ssh' unless defined $ssh_cmd;
@open2_cmd = _ensure_list $ssh_cmd;
unless (defined $ssh_cmd_interface) {
$ssh_cmd_interface = ( "@open2_cmd" =~ /\bplink\b/i ? 'plink' :
"@open2_cmd" =~ /\bsshg3\b/i ? 'tectia' :
'ssh' );
}
my $port = delete $opts->{port};
my $ssh1 = delete $opts->{ssh1};
my $more = delete $opts->{more};
defined $more and !ref($more) and $more =~ /^-\w\s+\S/ and
warnings::warnif("Net::SFTP::Foreign", "'more' argument looks like it should be split first");
my @more = _ensure_list $more;
my @preferred_authentications;
if (defined $key_path) {
push @preferred_authentications, 'publickey';
push @open2_cmd, map { -i => $_ } _ensure_list $key_path;
}
if ($ssh_cmd_interface eq 'plink') {
push @open2_cmd, -P => $port if defined $port;
if (defined $pass and !$pass_is_passphrase) {
warnings::warnif("Net::SFTP::Foreign", "using insecure password authentication with plink");
push @open2_cmd, -pw => $pass;
undef $pass;
}
}
elsif ($ssh_cmd_interface eq 'ssh') {
push @open2_cmd, -p => $port if defined $port;
if (defined $pass and !$pass_is_passphrase) {
push @open2_cmd, -o => 'NumberOfPasswordPrompts=1';
push @preferred_authentications, ('keyboard-interactive', 'password');
}
if (@preferred_authentications
and not grep { $more[$_] eq '-o' and
$more[$_ + 1] =~ /^PreferredAuthentications\W/ } 0..$#more-1) {
push @open2_cmd, -o => 'PreferredAuthentications=' . join(',', @preferred_authentications);
}
}
elsif ($ssh_cmd_interface eq 'tectia') {
}
else {
die "Unsupported ssh_cmd_interface '$ssh_cmd_interface'";
}
push @open2_cmd, -l => $user if defined $user;
push @open2_cmd, @more;
push @open2_cmd, $host;
push @open2_cmd, ($ssh1 ? "/usr/lib/sftp-server" : -s => 'sftp');
}
my $redirect_stderr_to_tty = ( defined $pass and
( delete $opts->{redirect_stderr_to_tty} or $ssh_cmd_interface eq 'tectia' ) );
$redirect_stderr_to_tty and ($stderr_discard or $stderr_fh)
and croak "stderr_discard or stderr_fh can not be used together with password/passphrase "
. "authentication when Tectia client is used";
$debug and $debug & 1 and _debug "ssh cmd: @open2_cmd\n";
%$opts and return; # Net::SFTP::Foreign will find the
# unhandled options and croak
if (${^TAINT} and Scalar::Util::tainted($ENV{PATH})) {
_tcroak('Insecure $ENV{PATH}')
}
if ($stderr_discard) {
$stderr_fh = $backend->_open_dev_null($sftp) or return;
}
( run in 4.239 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )