http://www.perlmonks.org?node_id=916535


in reply to Re: safely passing args through ssh
in thread safely passing args through ssh

I'm not sure this survives a double-ssh call:
print backticks('ssh', 'localhost', '--', 'ssh', 'localhost', '--', +'argcount', text_to_shell_lit('a b c'));
This prints 3 for me.

As I mentioned in the original post, I was doubtful that backslash-escaping could solve the problem, but there still might be a way to do it.

Replies are listed 'Best First'.
Re^3: safely passing args through ssh
by ikegami (Patriarch) on Jul 25, 2011 at 18:19 UTC

    That doesn't look anything like what I wrote. I showed how to contruct a shell command to pass to ssh but you passed 5 arguments after the target, none of which a shell command.

    If you call ssh twice, you have two shell commands to build.

    sub text_to_shell_lit(_) { return $_[0] if $_[0] =~ /^[a-zA-Z0-9_\-]+\z/; my $s = $_[0]; $s =~ s/'/'\\''/g; return "'$s'"; } my $very_remote_cmd = join ' ', map text_to_shell_lit, argcount => ( 'a b c' ); my $remote_cmd = join ' ', map text_to_shell_lit, ssh => ( '--', $very_remote_target, $very_remote_cmd ); backticks(ssh => ( '--', $remote_target, $remote_cmd ));
      Well, then I guess you didn't solve the problem that I stated.

        The problem you stated: "what's a good way of encoding ... so that it will survive an ssh call?"

        Where "D" is the shell's literal parser and "s" is an arbitrary shell command, you want a function "E" that exhibits the following behaviour:

        s = D(E(s)) = D(D(E(s))) = D(D(D(E(s)))) etc

        but there is none.

Re^3: safely passing args through ssh
by ikegami (Patriarch) on Jul 25, 2011 at 18:20 UTC