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

Hi Monks-

I can't explain this and need guidance from wiser minds - please help.

Here’s how to reproduce:

1.) Setup ssh public/private keys so that this unix shell command works without you having to enter a password:

$ ssh usr@remotehost date

2.) Run these command from your unix shell prompt - why does one FAIL (ask for password), while others don’t?

$ perl -e 'system("ssh usr\@remotehost date”)’ # works $ perl -e 'system("ssh -l usr remotehost date")’ # works $ perl -e 'system("ssh", "usr\@remotehost", "date”)’ # works $ perl -e 'system("ssh", "-l usr", "remotehost", "date”)’ # FAILS
You can replace system with exec and get the same result.

Thanks

-Craig

Replies are listed 'Best First'.
Re: Strange SSH Behavior via system or exec
by choroba (Cardinal) on Sep 18, 2014 at 15:08 UTC
    Also try
    perl -e 'system("ssh", "-l", "usr", "remotehost", "date")'
    لսႽ† ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ
      ++choroba

      That works! Thanks.

      However, shouldn't both work, or am I missing something?

      -Craig

        perl -e 'system("ssh", "-lusr", "remotehost", "date")'
        works but...
        perl -e 'system("ssh", "-l usr", "remotehost", "date")'
        doesn't because it tries to log as user " usr"!

        Either you give system a single argument, which is the equivalent of giving that string to the shell to be executed (e.g. /bin/sh -c 'foo bar quz'), or you give system multiple arguments, in which case you are giving that command its argument list directly, without interpretation by the shell. One of the things the shell does is split arguments on whitespace (except Windows), which no longer happens when you give it "-l usr" as a single string. (While some commands may do their own whitespace splitting of their argv, I'd assume that's rare. Except on Windows, hence the need for something like Win32::ShellQuote.)