in reply to back tick to do ssh

There's an important difference between your first example and your second one, and I'm not sure what your intention really is (maybe because your examples are too contrived).

Did you actually try your second example in a shell script (or at the shell command-line prompt)? If so, were you aware that the part following the pipe symbol ("/bin/others") ends up being a process that executes on your local machine? The "echo something" part is being executed via ssh on host1, the output of that operation is then being fed through a pipe on your local machine, and your own local executable file "/bin/others" is being run to process the output.

If that is your intention, and if you are saying that the perl backtick expression is trying to execute the entire pipeline command on host1 (including the "/bin/others" part), I'd have to ask, how do you know it's happening that way? (A common refrain, seen all too often at PerlMonks: "it doesn't work" is not an adequate description of the problem.)

Try a real example whose results, if successful, would leave no doubt that the stuff between "ssh" and the pipe symbol is being run on the remote machine, and the stuff after the pipe is being run locally. Make sure the example works from the command line, then make sure the perl runtime environment matches your shell environment in the relevant respects (PATH, permissions, etc). E.g. for *n*x style machines:

# create a "special" symlink to your "cut" command: ln -s `which cut` ~/my_cut # now, assuming your home directory on host1 is different from your lo +cal one, # and you don't have a "my_cut" command in your home directory on host +1: o=`ssh host1 tail -1 /etc/passwd | ~/my_cut -d: -f3-5` echo $o # now with perl: perl -e '$_=`ssh host1 tail -1 /etc/passwd | $ENV{HOME}/my_cut -d: -f3 +-5`; print'
If that doesn't work as expected, show us the actual results.

Replies are listed 'Best First'.
Re^2: back tick to do ssh
by convenientstore (Pilgrim) on Dec 31, 2007 at 00:36 UTC
    You are right. My example is not enough and I assumed what was happening.
    It is however my intention that entire commands run on remote machine but results being shown in the local machine.
    I will try others and get back to you on this

      Hi convenientstore,

      Enclose the command you want to be executed on the remote host in quotes, like this:

      my $result = `ssh host1 'echo something | /bin/others'`;

      This way echo something | /bin/others will be run on host1 and the result will end up in $result.

        That sort of solution would be okay for toy examples and really simple cases, but as soon as you get to situations involving real work, the constraints of quoting and escaping things for shell command operations can get really hairy and unworkable. It's the proverbial road to hell, paved with good intentions.
      If you want to run any sort of complex (pipeline or other sequential) operation entirely on a remote host, you will probably want to use a module. If, for reasons no one else can fathom, you really don't want to use a module, you'll need to break your complex operations down into simple, single-step-at-a-time commands and waste a lot of time doing a series of backtick operations to slog through the sequence.

      Either that, or else you'll simply want to create a script on the remote machine that does everything you want, and run that as a single backtick operation from your local perl script.

        Unfortunately, our system's perl is pretty old,
        This is perl, version 5.005_03 built for sun4-solaris Copyright 1987-1999, Larry Wall Perl may be copied only under the terms of either the Artistic License + or the GNU General Public License, which may be found in the Perl 5.0 source +kit. Complete documentation for Perl, including FAQ lists, should be found +on this system using `man perl' or `perldoc perl'. If you have access to + the Internet, point your browser at http://www.perl.com/, the Perl Home Pa +ge.
        and I can't use the module that I wanted to use
        userX@myserver ~/script> perl -c scriptX.pl Weak references are not implemented in the version of perl at /home/us +erX/script/pm/Net-SSH-Perl-1.30/lib/Net/SSH/Perl/Packet.pm line 22 BEGIN failed--compilation aborted at /home/userX/script/pm/Net-SSH-Per +l-1.30/lib/Net/SSH/Perl/Packet.pm line 22. BEGIN failed--compilation aborted at /home/userX/script/pm/Net-SSH-Per +l-1.30/lib/Net/SSH/Perl.pm line 6.
        I will try to run stuff from remote by other script and just extract it