Warum beschweren sich mein Perl Backticks "SH: Zeile 1: irgendwelche: Befehl nicht gefunden"?

StackOverflow https://stackoverflow.com/questions/1851213

  •  13-09-2019
  •  | 
  •  

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?

War es hilfreich?

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\E
Erweiterung 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?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top