我有一個lua REPL,並且希望在HTTPS://URL
上運行一個以純文本形式存儲的lua腳本文件。我知道os.execute()
可以運行OS命令,所以我們可以使用curl
等獲取腳本,然後load()
。 lua REPL中只有一行可行嗎?Oneliner從在線(Gist)加載Lua腳本並在當前上下文中運行
2
A
回答
2
注:如果你打算從網絡上直接運行的源代碼,至少使用
https
,避免容易MITM攻擊。
爲了給這個問題的答案,因爲葉戈爾可能不會發布它是這樣:
(loadstring or load)(io.popen("wget -qO- https://i.imgur.com/91HtaFp.gif"):read"*a")()
對於爲什麼這個打印Hello world
:
loadstring or load
是要與不同的Lua版本兼容,因爲功能loadstring
和load
在某個時候合併(我相信5.2)。 io.popen
在shell中執行它的第一個參數並返回一個文件指針到它的stdout。
從葉戈爾的「GIF」是不是一個真正的GIF(在瀏覽器中打開此:view-source:https://i.imgur.com/91HtaFp.gif
),但包含該文本的純文本文件:
GIF89a=GIF89a
print'Hello world'
基本上是一個GIF與GIF89a
和=GIF89a
開始之後只是爲了生成有效的Lua,這意味着您不必使用imgur或gif,您也可以使用原始gist或github。現在
,這是相當不可能的os.execute
是在沙箱中時可用io.popen
不大,但如果是這樣,就可以實現一個班輪使用os.execute
(雖然大幅更長)和臨時文件
讓我們第一次寫這一點,因爲在單行這將是一個有點複雜:
(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");
你可以輕鬆地凝聚到這一條線通過刪除註釋,製表符和換行符:
(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");
相關問題
- 1. Lua腳本是在執行前加載到內存中的嗎?
- 2. 在Docker中運行Lua腳本
- 3. Lua問題 - 在運行之前加載庫文件
- 4. 如何從pycharm在django上下文中運行腳本
- 5. 首先加載腳本文件,在加載之前在div上執行
- 6. 我可以在ViM中運行當前腳本或腳本嗎?
- 7. Spring:在加載持久化上下文之前運行代碼
- 8. 在bash腳本中從當前終端運行命令
- 9. 從c運行整個lua腳本
- 10. 從Ruby腳本創建Gist
- 11. 如何運行Lua腳本?
- 12. 在線運行ruby腳本
- 13. 如何在當前類的上下文中運行IRB.start
- 14. ASP.NET下載腳本正在加載當前頁面文件作爲下載文件
- 15. $(document).ready(function(){...})在插件腳本加載之前運行
- 16. 如何在頁面開始加載前運行jQuery腳本
- 17. 運行PHP腳本加載
- 18. SVG:加載文檔時運行腳本
- 19. 從命令行運行腳本時將文件下載爲csv
- 20. 如何在運行時生效/重載腳本時更改Lua腳本?
- 21. 當前的「用戶在線」腳本
- 22. 等待腳本下載並執行,並等待DOM加載
- 23. 在父窗口的上下文中運行腳本
- 24. 如何在bundler上下文中運行ruby腳本?
- 25. 什麼是在運行時重新加載lua腳本的方法?
- 26. Lua中的當前行號
- 27. 從當前腳本
- 28. 在Matlab中保存當前運行的腳本
- 29. 在當前shell中運行npm腳本命令
- 30. 如何在當前窗口會話中運行selenium python腳本?
'(loadstring或load)(io.popen(「wget -qO- http://i.imgur.com/91HtaFp.gif」):讀取「* a」)()' - 此程序將打印「你好世界「 –
這個程序在做什麼並不明顯。我發現它運行wget的gif並加載該gif作爲代碼,並以某種方式神奇地做世界你好嗎? – hyiltiz
另外,當我嘗試在我的REPL中運行它時,它失敗了:輸入:1:嘗試調用一個零值(字段'popen')。也許我的REPL受限制?它是更大程序的一部分,作爲嵌入式模塊。 'io.open'和'io.stdout'似乎也能工作。 – hyiltiz