2017-08-29 6 views
2

J'ai un REPL lua, et je voudrais exécuter un fichier de script lua stocké sous forme de texte brut à HTTPS://URL. Je comprends os.execute() peut exécuter des commandes OS afin que nous puissions utiliser curl etc pour saisir le script puis load(). Est-ce que c'est quelque chose à faire dans lua REPL avec une seule ligne?Oneliner pour charger Lua script de ligne (Gist) et exécuter dans le contexte actuel

+3

'(loadstring ou charge) (io.popen ("wget ​​-qO- http://i.imgur.com/91HtaFp.gif"): lire "* a")()' - ce programme imprimera " Bonjour le monde " –

+0

Ce n'est pas évident pour moi ce que ce programme est en train de faire. Je vois qu'il fonctionne wget pour un gif et le chargement de ce gif comme un code, et en quelque sorte magiquement faire bonjour monde? – hyiltiz

+0

En outre, lorsque j'essaie de l'exécuter dans ma REPL, il échoue: entrée: 1: tentative d'appeler une valeur nulle (champ 'popen'). Peut-être que mon REPL est restreint? Cela fait partie d'un programme plus vaste, en tant que module intégré. Aussi 'io.open' et' io.stdout' semble fonctionner. – hyiltiz

Répondre

2

Note: Si vous allez exécuter du code source directement à partir du Web, utilisez https au moins, afin d'éviter des attaques faciles MitM.

Pour donner à cette question une réponse, car Egor ne sera probablement pas poster comme tel:

(loadstring or load)(io.popen("wget -qO- https://i.imgur.com/91HtaFp.gif"):read"*a")() 

Pour pourquoi cela imprime Hello world:

loadstring or load est d'être compatible avec différentes versions Lua, comme les fonctions loadstring et load ont été fusionnées à un certain point (5.2 je crois). io.popen exécute son premier argument dans le shell et renvoie un pointeur de fichier sur son stdout.

Le « gif » de Egor n'est pas vraiment une image GIF (ouvrir dans votre navigateur: view-source:https://i.imgur.com/91HtaFp.gif), mais un fichier texte qui contient ce texte:

GIF89a=GIF89a 
print'Hello world' 

Fondamentalement, un GIF commence par GIF89a et le =GIF89a après est juste pour produire Lua valide, ce qui signifie que vous n'avez pas besoin d'utiliser imgur ou gifs, vous pouvez tout aussi bien utiliser des gists crus ou github.

Maintenant, il est peu probable que os.execute est disponible dans un bac à sable quand io.popen n'est pas, mais si elle est, vous pouvez obtenir une ligne unique (si radicalement plus) en utilisant os.execute et les fichiers temporaires

Permet d'abord écrire cela parce que dans une seule ligne, il sera un peu complexe:

(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"); 

et vous pouvez facilement condenser cela en une seule ligne en supprimant des commentaires, des onglets et des sauts de ligne:

(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

Mais dans un bac à sable c'est impossible? – hyiltiz

+0

@hyiltiz Si ​​le sandbox n'autorise ni os.execute' ni 'io.popen', alors vous ne pouvez évidemment pas suivre cette route. Peut-être qu'il prend en charge d'autres options, comme les sockets ou simplement sa propre API pour ouvrir des connexions http, mais nous ne pouvons pas vous dire que sur le SO à moins d'une mise en œuvre publique et vous nous dire qui il est – dualed

+0

@dualed - Pourquoi « communauté wiki »? Ne sois pas timide. Vous avez fait du bon travail, votre réponse est excellente.Vous devriez obtenir des points rep gagnés. –