从网络(Gist)加载 Lua 脚本并在当前上下文中运行的单行代码

我有一个 Lua REPL,并且想在 HTTPS://URL 存储的纯文本 Lua 脚本文件中运行它。我知道 os.execute() 可以运行 OS 命令,因此我们可以使用 curl 等工具来获取脚本,然后使用 load() 加载脚本。是否有可能在 Lua REPL 中用一行代码完成这个过程?

点赞
用户1244588
用户1244588

注意:如果您要直接从网络运行源代码,请至少使用https以避免轻松的MitM攻击。

为了回答这个问题,因为Egor可能不会发布这样的问题:

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

为什么会打印“ Hello world”:

loadstring or load用于兼容不同版本的Lua,因为函数loadstringload在某些时候被合并(我认为是5.2)。io.popen在shell中执行其第一个参数并返回一个指向其stdout的文件指针。

来自Egor的“ gif”实际上不是GIF(在您的浏览器中打开: view-source:https://i.imgur.com/91HtaFp.gif),而是包含此文本的纯文本文件:

GIF89a=GIF89a
print'Hello world'

基本上,GIF以GIF89a开头,之后的=GIF89a只是生成有效的Lua,这意味着您不必使用imgur或gif,您也可以使用原始的gist或github。

现在,当io.popen不存在时,os.execute在沙盒中可用的可能性相当小,但如果确实存在,您可以使用os.execute和临时文件来实现一个一行代码(虽然非常长)

让我们首先将其分解成一行代码,因为单行代码会有点复杂:

(function(u,f)
    -- 获取一个临时文件名,Windows将其前缀设置为\,因此请将其删除
    f=f or os.tmpname():gsub('^\\','')
    -- 运行curl使其输出到我们的临时文件
    os.execute(('curl -s "%s" -o "%s"'):format(u,f))
    -- 加载/运行临时文件
    loadfile(f)()
    os.remove(f)
end)("https://i.imgur.com/91HtaFp.gif");

您可以通过删除注释、制表符和换行符,轻松将其压缩成单行代码:

(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");
2017-08-31 01:19:29