2017-08-29 1 views
2

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

+3

'(loadstring oder load) (io.popen (" wget -qO- http://i.imgur.com/91HtaFp.gif "): lies" * a ")()' - dieses Programm wird gedruckt " Hallo Welt " –

+0

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

+0

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

Antwort

2

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"); 
+0

Aber in einer Sandbox ist es unmöglich? – hyiltiz

+0

@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

+0

@dualed - Warum "Community-Wiki"? Sei nicht schüchtern. Du hast einen tollen Job gemacht, deine Antwort ist ausgezeichnet.Sie sollten verdiente Rep-Punkte erhalten. –

Verwandte Themen