Подумайте о том, что вы пытаетесь сделать только с помощью ssh. Оба они выдают одинаковый результат, но работают по-разному:
ssh user@host 'echo "puts 2+2" | ruby'
echo "puts 2+2" | ssh user@host ruby
Во-первых, удаленная оболочка выполняет конвейер. (Если у вас нет этих одинарных кавычек, что происходит?) Во втором случае он передается через локальную оболочку к команде ssh и запускается интерпретатор.
Вместо того, чтобы совершать запутанные экранирование кода, чтобы он правильно выводился, когда втиснулся через sh, я предпочитаю передавать текст через stdin. Это просто проще.
Используя IPC :: Run , чтобы выполнить всю тяжелую работу:
#!/usr/bin/env perl
use strict;
use warnings;
use IPC::Run qw(run);
my $in = <<FFFF;
2 + 2
8 * (2 + 3)
FFFF
my $cmd = [qw(ssh user@host perl calc.pl)];
run $cmd, \$in, \my $out, \my $err or die "ssh: $?";
print "out: $out";
print "err: $err";
(calc.pl - простая программа-калькулятор инфиксов, которая у меня была)
Вот вывод, который я получаю:
out: 4
40
err: (SSH banners and pointless error messages)
Просмотр вызовов system
или qx//
в Perl-скрипте является признаком проблемы. В общем, мне не нравится думать о синтаксисе оболочки или цитировании оболочки, когда я не пишу shell; это не имеет ничего общего ни с проблемой, которую я пытаюсь решить, ни с инструментом, с которым я ее решаю. (И это игнорирует любые последствия для безопасности.)
О, и если вам не нужно смешивать со стандартным вводом, но вы все еще хотите выполнять и захватывать вывод из других программ, всегда есть IPC :: System :: Simple .