Net-OpenSSH
view release on metacpan or search on metacpan
lib/Net/OpenSSH.pm view on Meta::CPAN
($master_stdout_fh = delete $opts{master_stdout_fh} or
$master_stdout_discard = delete $opts{master_stdout_discard});
($master_stderr_fh = delete $opts{master_stderr_fh} or
$master_stderr_discard = delete $opts{master_stderr_discard});
$master_opts = delete $opts{master_opts};
if (defined $master_opts) {
if (ref $master_opts) {
@master_opts = @$master_opts;
}
else {
carp "'master_opts' argument looks like if it should be splited first"
if $master_opts =~ /^-\w\s+\S/;
@master_opts = $master_opts;
}
}
$master_setpgrp = delete $opts{master_setpgrp};
# when a password/passphrase is given, calling setpgrp is
# useless because the process runs attached to a different tty
undef $master_setpgrp if $login_handler or defined $passwd;
}
my $default_ssh_opts = delete $opts{default_ssh_opts};
carp "'default_ssh_opts' argument looks like if it should be splited first"
if defined $default_ssh_opts and not ref $default_ssh_opts and $default_ssh_opts =~ /^-\w\s+\S/;
my ($default_stdout_fh, $default_stderr_fh, $default_stdin_fh,
$default_stdout_file, $default_stderr_file, $default_stdin_file,
$default_stdout_discard, $default_stderr_discard, $default_stdin_discard);
$default_stdout_file = (delete $opts{default_stdout_discard}
? '/dev/null'
: delete $opts{default_stdout_file});
$default_stdout_fh = delete $opts{default_stdout_fh}
unless defined $default_stdout_file;
$default_stderr_file = (delete $opts{default_stderr_discard}
? '/dev/null'
: delete $opts{default_stderr_file});
$default_stderr_fh = delete $opts{default_stderr_fh}
unless defined $default_stderr_file;
$default_stdin_file = (delete $opts{default_stdin_discard}
? '/dev/null'
: delete $opts{default_stdin_file});
$default_stdin_fh = delete $opts{default_stdin_fh}
unless defined $default_stdin_file;
_croak_bad_options %opts;
my @ssh_opts;
# TODO: are those options really requiered or just do they eat on
# the command line limited length?
push @ssh_opts, -l => $user if defined $user;
push @ssh_opts, -p => $port if defined $port;
my $home = do {
local ($@, $SIG{__DIE__});
eval { Cwd::realpath((getpwuid $>)[7]) }
};
if (${^TAINT}) {
($home) = $home =~ /^(.*)$/;
Scalar::Util::tainted($ENV{PATH}) and
_tcroak('Insecure $ENV{PATH}');
}
my $self = { _error => 0,
_error_prefix => [],
_perl_pid => $$,
_thread_generation => $thread_generation,
_ssh_version => $ssh_version,
_ssh_cmd => $ssh_cmd,
_scp_cmd => $scp_cmd,
_rsync_cmd => $rsync_cmd,
_sshfs_cmd => $sshfs_cmd,
_sftp_server_cmd => $sftp_server_cmd,
_pid => undef,
_host => $host,
_host_squared => $host_squared,
_user => $user,
_port => $port,
_passwd => $obfuscate->($passwd),
_passwd_prompt => $passwd_prompt,
_passphrase => $passphrase,
_key_path => $key_path,
_login_handler => $login_handler,
_timeout => $timeout,
_proxy_command => $proxy_command,
_gateway_args => $gateway,
_kill_ssh_on_timeout => $kill_ssh_on_timeout,
_batch_mode => $batch_mode,
_home => $home,
_forward_agent => $forward_agent,
_forward_X11 => $forward_X11,
_external_master => $external_master,
_default_ssh_opts => $default_ssh_opts,
_default_stdin_fh => $default_stdin_fh,
_default_stdout_fh => $default_stdout_fh,
_default_stderr_fh => $default_stderr_fh,
_master_stdout_fh => $master_stdout_fh,
_master_stderr_fh => $master_stderr_fh,
_master_stdout_discard => $master_stdout_discard,
_master_stderr_discard => $master_stderr_discard,
_master_setpgrp => $master_setpgrp,
_master_pty_force => $master_pty_force,
_remote_shell => $remote_shell,
_default_stream_encoding => $default_stream_encoding,
_default_argument_encoding => $default_argument_encoding,
_expand_vars => $expand_vars,
_vars => $vars,
_master_state => _STATE_START,
};
bless $self, $class;
$self->_detect_ssh_version;
# default file handles are opened so late in order to have the
# $self object to report errors
( run in 1.232 second using v1.01-cache-2.11-cpan-df04353d9ac )