Sind kompilierte Shell-Skripte leistungsfähiger?

Oct 20 2020

Nach einigem googeln habe ich einen Weg gefunden, BASH-Skripte zu binären ausführbaren Dateien zu kompilieren (mit shc).

Ich weiß, dass Shell eine interpretierte Sprache ist, aber was macht dieser Compiler? Wird es die Leistung meines Skripts in irgendeiner Weise verbessern?

Antworten

55 StephenKitt Oct 20 2020 at 15:21

Um die Frage in Ihrem Titel zu beantworten, könnten kompilierte Shell-Skripte für die Leistung besser sein - wenn das Ergebnis der Kompilierung das Ergebnis der Interpretation darstellt, ohne die Befehle im Skript immer wieder neu interpretieren zu müssen. Siehe zum Beispiel ksh93'sshcomp oder zsh' szcompile .

Jedoch shcnicht kompiliert Skripte auf diese Weise. Es ist nicht wirklich ein Compiler, es ist ein Skript-Verschlüsselungstool mit verschiedenen Schutztechniken von zweifelhafter Wirksamkeit. Wenn Sie ein Skript mit kompilieren shc, ist das Ergebnis eine Binärdatei, deren Inhalt nicht sofort lesbar ist. Wenn es ausgeführt wird, entschlüsselt es seinen Inhalt und führt das Tool aus, für das das Skript bestimmt war, mit dem entschlüsselten Skript, sodass das ursprüngliche Skript leicht abgerufen werden kann (es wird vollständig in der Befehlszeile des Interpreters übergeben, mit zusätzlichem Abstand, um dies zu versuchen es ist schwerer zu finden). Die Gesamtleistung wird also immer schlechter sein: Zusätzlich zu der Zeit, die zum Ausführen des ursprünglichen Skripts benötigt wird, wird die Zeit benötigt, um die Umgebung einzurichten und das Skript zu entschlüsseln.

34 guest Oct 21 2020 at 21:34

Nach einigem googeln habe ich einen Weg gefunden, BASH-Skripte zu binären ausführbaren Dateien zu kompilieren (mit shc).

Es ist ziemlich bedauerlich, dass diese shcErfindung immer noch in den Google-Suchergebnissen enthalten ist, auch nachdem sie all die Jahre vollständig entlarvt wurde: Sie shcist kein Compiler und verhindert nicht, dass der Quellcode des Skripts angezeigt und "gestohlen" wird .

Wenn überhaupt, ist shc noch dümmer als es sein muss, denn nachdem die Skriptquelle entwirrt wurde, wird sie nur als Argument übergeben bash -c, was bedeutet, dass sie /proc/<pid>/cmdlinefür jeden Benutzer sichtbar ist , nicht nur für denjenigen, der das Skript ausführt . Dies führt auch zu einer Längenbeschränkung von Linux für ein einzelnes Befehlszeilenargument (128 KByte). Aber um die Dinge noch lächerlicher zu machen, ist der erste Teil dieses Arguments mit Leerzeichen gefüllt, sodass es nicht in erscheint ps;-)

Wird es die Leistung meines Skripts in irgendeiner Weise verbessern?

Ja, Ihr Skript funktioniert möglicherweise überhaupt nicht, was bedeutet, dass es früher beendet wird.

5 Paul_Pedant Oct 20 2020 at 18:53

Im Allgemeinen gibt es keine Möglichkeit, ein Shell-Skript zu kompilieren, da neuer Quelltext zur Laufzeit mit mehreren Methoden eingeführt werden kann, wodurch die Compilerphase umgangen wurde. Diese neue Quelle kann nicht mit den kompilierten Funktionen oder Variablen interagieren.

Zwei Methoden zum Erstellen einer Laufzeitquelle wären:

Geben Sie eine Nebendatei als Quelle an, die möglicherweise seit der Kompilierung des ursprünglichen Skripts erstellt oder geändert wurde.

Erstellen Sie zur Laufzeit einen beliebigen Befehl in einer Zeichenfolge und führen Sie ihn aus.