nysus has asked for the wisdom of the Perl Monks concerning the following question:

I've spend a few hours on this with not much to show for it. Hopefully someone out there with better knowledge of Net::OpenSSH internals can help. This is really bizarre. The bit of code I'm having problems with is here:

# this line runs fine $server->exec("sudo rm -r /directory/*"); # exec is wrapper for the Ne +t::OpenSSH "system" method # checks if directory exists. This line causes Net::OpenSSH to crap ou +t in special circumstances. my $value = $server->capture(qq#perl -e "print (-d '/directory/')"#); # returns 1 because dir exists print $value;

Now, if I run the same commands above in a standalone environment outside of the script I'm having the problem with, it works as expected and I cannot reproduce. The problem only happens when I run the commands from a particular script I'm running and only when /directory is empty. If the directory has stuff in it, I have no issues at all. What's also extremely weird is if I put something like this: $server->exec("ls") after the sudo rm -r /directory/* line, the code chugs along whether /directory is empty or not. I'm at a loss as to what could be going on. I've tried printing the $server->ssh->error but the code craps out before I can read it.

If someone could point me in the right direction as to what is going on, I'd be extremely grateful. This is driving me nuts.

$PM = "Perl Monk's";
$MCF = "Most Clueless Friar Abbot Bishop Pontiff Deacon Curate";
$nysus = $PM . ' ' . $MCF;
Click here if you love Perl Monks

Replies are listed 'Best First'.
Re: Net::OpenSSH failing in unexpected way
by haukex (Archbishop) on Apr 04, 2017 at 14:17 UTC

    Could you reduce this to an SSCCE?

    Could it perhaps be a strange shell quoting issue? Have you tried turning on Net::OpenSSH's debugging, e.g. $Net::OpenSSH::debug |= 16; for debugging remote command execution?

    Also, you might be able to reduce issues with quoting by making use of the quoting that is built into the module, and breaking the command into an array, e.g. ->capture(\%opts, 'perl', '-e', qq{print (-d '/directory/')}); (untested Update: tested, and I also wanted to suggest ->capture('perl','-e',q{print -d q{/directory/}}) instead).

    If it really is a shell quoting issue, then sending Perl scripts to the remote side via perl -e might not be the best option in general. You could write a short script to run on the server side and then SCP it over to run it there.

      Thanks, your suggestion to take a look at how the arguments were handled got me to look closer at how I was processing them. Best I can tell is that I was getting too cute with one of my wrapper calls and was leaking file handles through it somehow and I hit the file limit. Simplifying the wrapper call solved the problem by using capture directly.

      $PM = "Perl Monk's";
      $MCF = "Most Clueless Friar Abbot Bishop Pontiff Deacon Curate";
      $nysus = $PM . ' ' . $MCF;
      Click here if you love Perl Monks

Re: Net::OpenSSH failing in unexpected way
by Wiggins (Hermit) on Apr 04, 2017 at 15:41 UTC
    Clarification please:
    " only when /directory is empty." means:
    the file system directory contains no files
    or
    the variable "directory" supplies no substitution, = "rm -r //*" command

    It is always better to have seen your target for yourself, rather than depend upon someone else's description.

Re: Net::OpenSSH failing in unexpected way
by Anonymous Monk on Apr 04, 2017 at 15:53 UTC
    # exec is wrapper for the Net::OpenSSH "system" method
    Can you tell us anything more about this wrapper? Is it your own code?