Caractere especial '#' no comando Perl SSH

Caractere especial '#' no comando Perl SSH

Tento enviar comando usando SSH em meu script perl com # mas ele fica truncado em #

Exemplo:

O texto de entrada é:

$message = "Product ID # STK000134"

O comando SSH é:

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

O que passa é:

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

Em vez de :

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

Como posso garantir que # e todo o texto atrás de # serão transmitidos?

Responder1

#inicia um comentário no shell. Adicione aspas:

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

Responder2

Os backticks invocam um shell. O shell trata o #e tudo depois dele como comentário.

Você precisa citar corretamente os valores interpolados para que o shell não “fique confuso”, não importa quais caracteres suas strings contenham (por exemplo, aspas simples, aspas duplas, crases, cifrões, cifrões, barras invertidas, etc.).

Você pode usar um sub auxiliar como este:

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]}`;

Se você não se importa com todo o ruído no meio da sua string de comando, você pode usar algumas variáveis ​​extras:

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`;

Mas isso só resolve o problema dolocalconcha. Porque você está usandossh, uma concha nocontrolo remotoO sistema também interpretará suas strings. Então, você realmente precisa citá-losduas vezes.

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`;

Como alternativa ao uso de um shell local (e à necessidade de citá-lo), você pode executar o comando local (ssh) diretamente usando a forma de argumento 4+ de open:

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

Responder3

usarRede::OpenSSHe deixe-o fazer a cotação para você:

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;

informação relacionada