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

Perl noob here, so please excuse the ignorance. My question is regarding Net::SSH::Perl and running a subroutine. I'd like to run the entire subroutine with the ssh session open if possible. I've already written the sub thinking I would just throw the perl script directly on the boxes in question, but I've since found out that I will not be able to tamper with Perl libraries on said boxes (I need a couple of libraries they do not have). So I need to ssh into each box remotely. Instead of having to use $ssh->cmd for every bash command I want to run, and having to re-write various parts of what I've already written, I'd like to know if I can just open the ssh session, then run the subroutine. This sub will run a number of bash commands and actually call yet another subroutine that runs a couple of bash commands. Really, I'd like to do something like:

my($stdout, $stderr, $exit) = $ssh->cmd( (subroutine));
Is this possible in any way? I hope this is clear. I can post some more code if needed.

Replies are listed 'Best First'.
Re: Run a subroutine through ssh? (Net::SSH::Perl)
by johnny_carlos (Scribe) on Oct 28, 2011 at 21:21 UTC
    Do you have write access to the box anywhere? You could install the modules you need locally, and run a normal perl script.

      They are test boxes, so although I do have access to them, I cannot make any module changes. I can only work with what's already there. I thought of putting all the bash commands in a bash script and just running that, but I assign the results of these commands to various perl variables, so I don't think that it's feasible (without a lot of work). I'm getting the feeling that I will have to re-write my subroutines. Would love to know if anyone has made it work though.

        I should note that I thought of using local::lib to keep modules private and without needing root access, but I'm pretty wary of tampering with the test environment in any way. The ideal situation is to have a persistent ssh session (persistent even when calling a subroutine) which I can tell it to close when I want:

        1) open ssh session
        2) call subroutine (subroutine should run within the ssh session, not on the local system)
        3) close ssh session
        
        I will be indebted to anyone who has done this or can point me in a good direction.

Re: Run a subroutine through ssh? (Net::SSH::Perl)
by Mr. Muskrat (Canon) on Nov 23, 2011 at 20:04 UTC

    If you can't add code to the test systems then how do you expect to add the code in the Perl and bash scripts?

Re: Run a subroutine through ssh? (Net::SSH::Perl)
by cavac (Prior) on Nov 23, 2011 at 21:06 UTC

    Well, this is not possible. At least it sounds highly improbable.

    There are three possible ways to go about:

    • Get the admin who manages the servers (or your project manager) to see and adapt to your requirements. Or change the requirements. (This is the only "good" solution i could think of).
    • Rewrite your script in a way it wont need additional libs (e.g. either completly reinvent the wheel or just "stuff" all the other modules to the end of your script).
    • As a very, very, very last resort, you could try Acme::RemoteINC. You know, about the time when the thing that comes out of a cows backend hits the rotary air moving device.

    Really, the only good solution is to work this out with your coworkers using that servers. Everything else is a more or less half backed solution as far as i see it...

    Don't use '#ff0000':
    use Acme::AutoColor; my $redcolor = RED();
    All colors subject to change without notice.