Ich habe eine REA Lua, und möchte eine Lua-Skript-Datei als einfachen Text bei HTTPS://URL
gespeichert ausführen. Ich verstehe, os.execute()
kann OS-Befehle ausführen, so dass wir curl
usw. verwenden können, um das Skript dann load()
greifen. Ist das in Lua REPL mit einer einzigen Linie möglich?Oneliner zum Laden von Lua-Skript aus dem Internet (Gist) und im aktuellen Kontext ausgeführt
Antwort
Hinweis: Wenn Sie vorhaben, Quellcode direkt aus dem Web auszuführen, verwenden
https
zumindest leicht MITM-Angriffe zu vermeiden.
diese Frage eine Antwort zu geben, da Egor wird wahrscheinlich nicht als solche Posten:
(loadstring or load)(io.popen("wget -qO- https://i.imgur.com/91HtaFp.gif"):read"*a")()
Für warum diese druckt Hello world
:
loadstring or load
ist mit verschiedenen Lua-Versionen kompatibel zu sein, da die Funktionen loadstring
und load
irgendwann verschmolzen sind (5.2 glaube ich). io.popen
führt das erste Argument in der Shell aus und gibt einen Dateizeiger an seine Stdout zurück.
Die "gif" von Egor nicht wirklich ein GIF ist (öffnen Sie dies in Ihrem Browser: view-source:https://i.imgur.com/91HtaFp.gif
), sondern eine einfache Textdatei, die diesen Text enthält:
GIF89a=GIF89a
print'Hello world'
Im Grunde ein GIF beginnt mit GIF89a
und den =GIF89a
Danach soll nur gültiges Lua erzeugt werden, was bedeutet, dass Sie weder Imgur noch Gifs verwenden müssen, Sie können genauso gut rohe Geiste oder Github verwenden.
Jetzt ist es eher unwahrscheinlich, dass os.execute
in einer Sandbox verfügbar ist, wenn io.popen
nicht, aber wenn es ist, können Sie einen Einzeiler (wenn auch drastisch mehr) erreichen mit os.execute
und temporären Dateien
Lets ersten Schreib dies, weil in einer einzigen Zeile wird es ein wenig komplex sein:
(function(u,f)
-- get a temp file name, Windows prefixes those with a \, so remove that
f=f or os.tmpname():gsub('^\\','')
-- run curl, make it output into our temp file
os.execute(('curl -s "%s" -o "%s"'):format(u,f))
-- load/run temp file
loadfile(f)()
os.remove(f)
end)("https://i.imgur.com/91HtaFp.gif");
und Sie können durch Entfernen von Kommentaren, Tabs und Zeilenumbrüche, dass in eine einzige Zeile leicht kondensieren:
(function(u,f)f=f or os.tmpname():gsub('^\\','')os.execute(('curl -s "%s" -o "%s"'):format(u,f))loadfile(f)()os.remove(f)end)("https://i.imgur.com/91HtaFp.gif");
Aber in einer Sandbox ist es unmöglich? – hyiltiz
@hyiltiz Wenn die Sandbox weder 'os.execute' noch' io.popen' zulässt, kann diese Route natürlich nicht verwendet werden. Vielleicht unterstützt es andere Optionen, wie Sockets oder einfach eine eigene API zum Öffnen von http-Verbindungen, aber wir können Ihnen das nicht auf SO sagen, es sei denn, es handelt sich um eine öffentliche Implementierung und Sie sagen uns – dualed
@dualed - Warum "Community-Wiki"? Sei nicht schüchtern. Du hast einen tollen Job gemacht, deine Antwort ist ausgezeichnet.Sie sollten verdiente Rep-Punkte erhalten. –
- 1. Link und Baumfeld zum aktuellen Site-Kontext
- 2. MVVM - Wo Daten aus dem Internet laden
- 3. Wie Code auf Objekte aus dem aktuellen Kontext ausgeführt wird, wenn App breakpointed ist
- 4. Python 3.5.2 Laden von Daten aus dem Internet
- 5. ViewContext existiert nicht im aktuellen Kontext
- 6. @Funktionen existiert nicht im aktuellen Kontext
- 7. SignalR ASPNetHost existiert nicht im aktuellen Kontext
- 8. Kontext existiert nicht im aktuellen Kontext (Android Project)
- 9. Abrufen von Daten aus dem Internet im Terminal
- 10. Name existiert nicht im aktuellen Kontext Fehler
- 11. Laden Sie SQLite-Datenbank aus dem Internet und laden Sie in Android-Anwendung
- 12. Oneliner zum Drucken von Zeichenketten in Hex?
- 13. Wie erben ich Elementnamen aus dem aktuellen XSLT-Kontext?
- 14. Kopieren Einfügen und Ausschneiden Klicks existieren nicht im aktuellen Kontext
- 15. Batch-Datei zum Entsperren von Dateien aus dem Internet kopiert
- 16. Xamarin Picasso, Der Name `Kontext‚existiert nicht im aktuellen Kontext
- 17. Variable existiert nicht im aktuellen Kontext C#
- 18. „Der Name‚Highscoreliste‘existiert nicht im aktuellen Kontext“
- 19. FileUpload1 existiert nicht im aktuellen Kontext
- 20. SecurityProtocolTypeExtensions.Tls12; existiert nicht im aktuellen Kontext
- 21. gdb: Kein Symbol "i" im aktuellen Kontext
- 22. Run/Debug-Test im aktuellen Kontext mit Visual Studio 2012
- 23. jQuery-Funktion wird nicht ausgeführt, wenn aus dem Kontext entfernt
- 24. Laden Sie ein PDF aus dem Internet in xcode
- 25. Laden von Bildern aus dem Firebase-Speicher zum Reagieren
- 26. Der Name '****' existiert im aktuellen Kontext nicht
- 27. nicht zugänglich ist im aktuellen Kontext
- 28. Der Name '..' existiert nicht im aktuellen Kontext
- 29. Fehler Der Name im aktuellen Kontext nicht
- 30. Web existiert nicht im aktuellen Kontext?
'(loadstring oder load) (io.popen (" wget -qO- http://i.imgur.com/91HtaFp.gif "): lies" * a ")()' - dieses Programm wird gedruckt " Hallo Welt " –
Es ist mir nicht klar, was dieses Programm macht. Ich sehe, es läuft wget für ein gif und Laden dieses gif als Code, und irgendwie mag mag hallo Welt? – hyiltiz
Auch wenn ich versuche, es in meinem REPL auszuführen, schlägt es fehl: Eingabe: 1: Versuch, einen Nullwert (Feld 'Popen') aufzurufen. Vielleicht ist meine REPL eingeschränkt? Es ist Teil eines größeren Programms, als ein eingebettetes Modul. Auch 'io.open' und' io.stdout' scheinen zu funktionieren. – hyiltiz