Специальный символ «#» в команде Perl SSH

Специальный символ «#» в команде Perl SSH

Я пытаюсь отправить команду через SSH в моем скрипте Perl с помощью #, но она обрезается прямо на #

Пример:

Входной текст:

$message = "Product ID # STK000134"

Команда SSH:

$execute=`ssh -q id@host /usr/message/send -pin $pager_num -message $message`;

Что проходит через:

ssh -q id@host /usr/message/send -pin $pager_num -message Product ID 

Вместо :

ssh -q id@host /usr/message/send -pin $pager_num -message Product ID # STK000134

Как гарантировать, что # и весь текст после # будут пропущены?

решение1

#начинает комментарий в оболочке. Добавьте кавычки:

$message =~ s/\#/\\\#/g;
$execute=`ssh -q id@host /usr/message/send -pin $pager_num -message "'$message'"`;

решение2

Обратные кавычки вызывают оболочку. Оболочка воспринимает #и все, что после нее, как комментарий.

Вам необходимо правильно заключить в кавычки интерполированные значения, чтобы оболочка не «запуталась» независимо от того, какие символы содержат ваши строки (например, одинарные кавычки, двойные кавычки, обратные кавычки, знаки решетки, знаки доллара, обратные косые черты и т. д.).

Вы можете использовать вспомогательную подпрограмму, например такую:

sub sq ($) {
    # Bourne-style single quote $_[0]
    # e.g.
    #    foo bar    becomes    'foo bar'
    #    a'b        becomes    'a'\''b'

    # The following implementation does not yield the most compact
    # representations, but it is dead simple.
    my $sq = $_[0];
    $sq =~ s/'/'\\''/g;
    "'$sq'";
}
$execute=`ssh -q id@host /usr/message/send -pin @{[sq $pager_num]} -message @{[sq $message]}`;

Если вас не интересует весь этот шум в середине командной строки, вы можете использовать некоторые дополнительные переменные:

my $sq_pager_num = sq $pager_num;
my $sq_message = sq $message;
$execute=`ssh -q id@host /usr/message/send -pin $sq_pager_num -message $sq_message`;

Но это решает проблему только дляместныйshell. Потому что вы используетесш, оболочка наудаленныйСистема также будет интерпретировать ваши строки. Поэтому вам действительно нужно заключить их в кавычкидважды.

my $tsq_pager_num = sq sq $pager_num;
my $tsq_message = sq sq $message;
$execute=`ssh -q id@host /usr/message/send -pin $tsq_pager_num -message $tsq_message`;

В качестве альтернативы использованию локальной оболочки (и необходимости заключать ее в кавычки) вы можете выполнить локальную команду (сш) напрямую, используя форму аргумента 4+ open:

open CMD, '-|', qw(ssh -q id@host /usr/message/send -pin), sq $pager_num, '-message', sq $message;
{ local $/; $execute = <CMD>; }
close CMD;

решение3

использоватьСеть::OpenSSHи пусть он сделает цитату за вас:

use Net::OpenSSH;

my $ssh = Net::OpenSSH->new('id@host');
my $output = $ssh->capture("/usr/message/send",
                           -pin => $pager_num,
                           -message => $message);
$ssh->error and die "ssh failed: " . $ssh->error;

Связанный контент