Sonderzeichen „#“ im Perl-SSH-Befehl

Sonderzeichen „#“ im Perl-SSH-Befehl

Ich versuche, den Befehl per SSH in meinem Perl-Skript mit # zu senden, aber er wird direkt bei # abgeschnitten

Beispiel:

Der Eingabetext lautet:

$message = "Product ID # STK000134"

Der SSH-Befehl lautet:

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

Was durchgeht, ist:

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

Anstatt :

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

Wie stelle ich sicher, dass # und der gesamte Text hinter # durchkommt?

Antwort1

#startet einen Kommentar in der Shell. Fügen Sie Anführungszeichen hinzu:

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

Antwort2

Die Backticks rufen eine Shell auf. Die Shell behandelt das #und alles, was danach kommt, als Kommentar.

Sie müssen die interpolierten Werte korrekt in Anführungszeichen setzen, damit die Shell nicht „verwirrt“ wird, unabhängig davon, welche Zeichen Ihre Zeichenfolgen enthalten (z. B. einfache Anführungszeichen, doppelte Anführungszeichen, Backticks, Nummernzeichen, Dollarzeichen, Backslashes usw.).

Sie können ein Hilfssubskript wie das folgende verwenden:

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

Wenn Ihnen der ganze Lärm in der Mitte Ihrer Befehlszeichenfolge nichts ausmacht, können Sie einige zusätzliche Variablen verwenden:

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

Aber das löst nur das Problem für dielokalShell. Weil Sie verwendenssh, eine Muschel auf demFernbedienungDas System interpretiert auch Ihre Zeichenfolgen. Sie müssen sie also tatsächlich in Anführungszeichen setzenzweimal.

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

Als Alternative zur Verwendung einer lokalen Shell (und der Notwendigkeit, dafür Anführungszeichen zu setzen) können Sie den lokalen Befehl (ssh) direkt, indem Sie die 4+ Argumentform von verwenden open:

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

Antwort3

verwendenNet::OpenSSHund überlassen Sie das Zitieren der Zitate:

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;

verwandte Informationen