package Net::OpenSSH::ShellQuoter::MSCmd; use strict; use warnings; use Carp; sub new { shift() } sub quote { shift; my $arg = shift; if ($arg =~ /[\r\n\0]/) { croak "can't quote newlines to pass through MS cmd.exe"; } $arg =~ s/([()%!^"<>&|])/^$1/g; $arg; } *quote_glob = \"e; my %fragments = ( stdin_discard => ' '>NUL:', stderr_discard => '2>NUL:', stdout_and_stderr_discard => '>NUL: 2>&1', stderr_to_stdout => '2>&1' ); sub shell_fragments { shift; my @f = grep defined, @fragments{@_}; wantarray ? @f : join(' ', @f); } 1; __END__ =head1 NAME Net::OpenSSH::ShellQuoter::MSCmd - Quoter for Windows cmd.exe =head1 DESCRIPTION This quoter is intended for interaction with SSH servers running on Windows which invoke the requested commands through the C shell. Because of C not doing wildcard expansion (on Windows this task is left to the final command), glob quoting just quotes everything. Some Windows servers use C to run the C shell which runs the requested command. In that case, both the C and C quoters have to be chained (and BTW, order matters): $ssh = Net::OpenSSH->new(..., remote_shell => 'MSCmd,MSWin'); Actually, C may require not quoting at all when the requested command is a builtin (for instance, C). =head1 COPYRIGHT AND LICENSE Copyright (C) 2008-2014 by Salvador FandiEo (sfandino@yahoo.com) This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.10.0 or, at your option, any later version of Perl 5 you may have available. =cut