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

hi,

i need a perl equivalent of this shell code with some changes...


remoteuser
remoteserver
/users/remoteuser/tmp/rem_snew2.pl


these 3 must be given as arguments for this program(cuz this real values are given from another function) these value shud not be hard coded in this program

this program first copies to the remote server, executes it, returns the result and delete the file on the remote server.

#!/usr/bin/perl scp /users/myuser/merc/rem_snew2.pl remoteuser@remoteserver:/users/rem +oteuser/tmp/rem_snew2.pl my $result=$(ssh remoteuser@remoteserver perl /users/remoteuser/tmp/re +m_snew2.pl) print "$result\n"; ssh remoteuser@remoteserver rm /users/remoteuser/tmp/rem_snew2.pl

Thanks.

Replies are listed 'Best First'.
Re: shell to perl equivalent
by pc88mxer (Vicar) on Feb 18, 2008 at 19:03 UTC
    Just use the system command and backticks:

    ... system('scp', '/users/myuser/merc/rem_snew.pl', "$remoteuser\@$remotes +erver:/users/$remoteuser/tmp/rem_snew2.pl"); my $result = `ssh $remoteuser\@$remoteserver perl /users/$remoteuser/t +mp/rem_snew2.pl`; print "$result\n"; system('ssh', "$remoteuser\@$remoteserver", 'rm', ...);

    Of course, you can use a subroutine to factor out all the common arguments that are being used, but this is basically how you would do it.

    Update: there really should be a multi-argument form of the backtick operator. One could be created using IPC::Open2, but there really should be one that's readily available. Is there one? Otherwise something like the following should be made into a module:

    use IPC::Open2; sub backtick { my $pid = open2(my $rfh, undef, @_); my $buf; while (<$rfh>) { $buf .= $_; } close($rfh); waitpid $pid, 0; $buf; }

      this is the pgm i wrote and i got the following errors..

      #!/usr/bin/perl sub paranthesis{ my @paran = @_; system('scp', '/users/myuser/merc/rem_snew.pl', $remoteuser\@$remotese +rver:/users/$remoteuser/tmp/rem_snew2.pl"); my $result = `ssh $remoteuser\@$remoteserver perl /users/$remoteuser/t +mp/rem_snew2.pl`; print "$result\n"; system('ssh', "$remoteuser\@$remoteserver", 'rm', /users/$remoteuser/t +mp/rem_snew2.pl); } paranthesis(@paran);
      Backslash found where operator expected at rum_rem_perll.pl line 7, ne +ar "$remoteuser\" (Missing operator before \?) Scalar found where operator expected at rum_rem_perll.pl line 7, near +"/users/$remoteuser" (Missing operator before $remoteuser?) String found where operator expected at rum_rem_perll.pl line 11, near + "print "" (Might be a runaway multi-line "" string starting on line 7) (Missing semicolon on previous line?) Scalar found where operator expected at rum_rem_perll.pl line 11, near + "print "$result" (Do you need to predeclare print?) Backslash found where operator expected at rum_rem_perll.pl line 11, n +ear "$result\" (Missing operator before \?) String found where operator expected at rum_rem_perll.pl line 12, near + "system('ssh', "" (Might be a runaway multi-line "" string starting on line 11) (Missing semicolon on previous line?) Scalar found where operator expected at rum_rem_perll.pl line 12, near + "system('ssh', "$remoteuser" Backslash found where operator expected at rum_rem_perll.pl line 12, n +ear "$remoteuser\" (Missing operator before \?) String found where operator expected at rum_rem_perll.pl line 12, at e +nd of line (Missing semicolon on previous line?) syntax error at rum_rem_perll.pl line 7, near "$remoteuser\" Can't find string terminator '"' anywhere before EOF at rum_rem_perll. +pl line 12.


      thanks.

        You're missing quotes around some of your parameters.

        sub paranthesis { my @paran = @_; system( 'scp', '/users/myuser/merc/rem_snew.pl', "$remoteuser\@$remoteserver:/users/$remoteuser/tmp/rem_snew2.p +l" ); my $result = `ssh $remoteuser\@$remoteserver perl /users/$remoteuser/tmp/ +rem_snew2.pl`; print "$result\n"; system( 'ssh', "$remoteuser\@$remoteserver", 'rm', "/users/$remoteuser/tmp/rem_snew2.pl" ); } paranthesis(@paran);

        I see you using my, but this doesn't actually work under strict. That would be a goal worthy of your time, in my opinion.