Carácter especial '#' en el comando Perl SSH

Carácter especial '#' en el comando Perl SSH

Intento enviar un comando usando SSH en mi script Perl con # pero se trunca justo en #

Ejemplo:

El texto de entrada es:

$message = "Product ID # STK000134"

El comando SSH es:

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

Lo que pasa es:

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

En lugar de :

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

¿Cómo puedo asegurarme de que # y todo el texto detrás de # lleguen?

Respuesta1

#inicia un comentario en el shell. Agregar comillas:

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

Respuesta2

Las comillas invertidas invocan un caparazón. El shell trata el #y todo lo que sigue como comentario.

Debe citar correctamente los valores interpolados para que el shell no se "confunda" sin importar qué caracteres contengan sus cadenas (por ejemplo, comillas simples, comillas dobles, comillas invertidas, signos de libra, signos de dólar, barras invertidas, etc.).

Podrías usar un 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]}`;

Si no le importa todo el ruido en medio de su cadena de comando, puede usar algunas variables adicionales:

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

Pero eso sólo resuelve el problema para ellocalcaparazón. porque estas usandossh, un caparazón en elremotoEl sistema también interpretará sus cadenas. Entonces, realmente necesitas citarlos.dos veces.

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 al uso de un shell local (y tener que cotizarlo), puede ejecutar el comando local (ssh) directamente usando la 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;

Respuesta3

usarRed::OpenSSHy deja que haga las cotizaciones por ti:

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;

información relacionada