
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;