Warum beschweren sich mein Perl Backticks "SH: Zeile 1: irgendwelche: Befehl nicht gefunden"?
Frage
Ich habe noch nie zuvor programmiert, musste aber ein sehr einfaches Webapp für die Arbeit schreiben.
Ich versuche, diese Dig -Abfrage zum Laufen zu bringen:
dig @8.8.8.8 +nocomments +nostats +noquestion +nocmd google.com any
Mit diesem Stück Perl:
$dig = `/usr/bin/dig \@8.8.8.8 +nocomments +nostats +noquestion +nocmd $query any`;
Außer es scheint nicht "irgendein" am Ende des Grabens zu erkennen und gibt mir:
sh: line 1: any: command not found
Was mache ich fälschlicherweise?
Lösung
ich wette $query
Hat eine neue Linie, die Ihre Schale sieht any
als neuer Befehl.
Versuchen Sie es zu tun chomp $query;
Vor Ihrem System rufen Sie die Newline an. Mehr auf Chomp.
Andere Tipps
Sie sollten wahrscheinlich verwenden dig ... '$query'
Es ist also einzeln zitiert, wenn die Hülle sie sieht. Wenn Sie das nicht tun, interpretiert die Hülle Metacharacoder. Wenn jemand setzt "; echo my_key > ~/.ssh/authorized_keys"
In Ihr Webformular sind Sie geschraubt. Auch wenn es nur für den internen Gebrauch dient, möchten Sie nicht, dass es brechen wird, wenn jemand etwas mit Räumen in der Abfrage einbringt (die die Shell wortsplitiert und als zwei Argumente verabschiedet wird.)
Sie können Perls verwenden
\Q$query\EErweiterung von $ query mit immer potenziellem Metacharacter entkommen. Tatsächlich ist das viel besser als einzelne Zitate hinzuzufügen. Wenn die Abfrage ein einzelnes Quadratcharakter enthält, wird sie aus den Zitaten ausbrechen. Immer noch super einfach anzugreifen. Dies Sollte das in Ihr Speicher beheben.
Perl hat sichere Möglichkeiten, um die Funktion System () zu verwenden, um die Args als eine Liste von Zeichenfolgen anzugeben und /bin /sh zu vermeiden, anstatt eine Zeichenfolge, die als Shell -Befehl bewertet wird. Dies ist der sicherste Weg, aber es gibt keine Back-Tick-Version davon, ohne die Pfeife && fork && exec selbst zu machen.
Höchstwahrscheinlich ist es etwas in der $ Query -Variablen, die die Befehlszeichenfolge bricht. Können Sie uns ein Beispiel geben, in dem es fehlschlägt und den Fehler angibt? Oder etwas mehr von Ihrem Skript zeigen?