lua 语言的基本使用

下载安装

在联网状态下,Ubuntu可以直接apt安装。

sudo apt install lua

如果是不直接联网的服务器,并且没有root权限的情况下,需要先在联网PC上下载后导入,再编译安装。

wget http://www.lua.org/ftp/lua-5.1.5.tar.gz
# copy lua-5.1.5.tar.gz to server by scp or ftp
tar -xvf lua-5.1.5.tar.gz
cd lua-5.1.5
sed -i 's/\/usr\/local/~\/bin\/local/' Makefile
make generic
make install

默认安装目录是/usr/local, 如果没有root权限,需要修改Makefile,将其改为指定目录(~/bin/local),上面通过sed修改。

值得注意的是,Lua 如果按 make linux 编译,会要求支持readline,所以需要先安装依赖 libreadline-dev

sudo apt-get install libreadline-dev

执行

lua与Python类似,也是脚本型语言,同时也可以直接在shell中边解释边执行。

$ lua
> print("hello world!")
hello world!

CTRL-CCTRL-D 退出。如果是执行脚本文件,如下面的 hello.lua

#!/usr/bin/env lua
-- file: hello.lua

print("hello world!")

执行也和其它脚本一样,可以使用 lua 执行,或者添加可执行权限后再直接执行。

$ lua hello.lua
hello world!
$ chmod +x hello.lua
$ ./hello.lua
hello world!

编译

lua 可以和 C 语言一样编译成二进制文件,同样以上面的 hello.lua 为例。

$ luac hello.lua
$ ls
hello.lua luac.out
$ lua luac.out
hello world!

使用 luac 编译后,默认生成 luac.out 文件,但是执行的时候无法直接 ./luac.out 执行,加上可执行权限也一样,必须使用 lua 去执行。

例外,可以通过 luac-o 参数去指定编译后的文件。

$ luac -o hello hello.lua
$ ls
hello hello.lua
$ lua hello
hello world!

hexdump 看下编译后 hello ,还是可以看到许多明文信息的。但是使用objdump是无法反汇编的。会提示无法识别文件格式。

$ hexdump -C hello
00000000  1b 4c 75 61 50 01 04 08  08 06 08 09 09 08 b6 09  |.LuaP...........|
00000010  93 68 e7 f5 7d 41 0b 00  00 00 00 00 00 00 40 68  |.h..}A........@h|
00000020  65 6c 6c 6f 2e 6c 75 61  00 00 00 00 00 00 00 00  |ello.lua........|
00000030  02 04 00 00 00 04 00 00  00 04 00 00 00 04 00 00  |................|
00000040  00 04 00 00 00 00 00 00  00 00 00 00 00 02 00 00  |................|
00000050  00 04 06 00 00 00 00 00  00 00 70 72 69 6e 74 00  |..........print.|
00000060  04 0d 00 00 00 00 00 00  00 68 65 6c 6c 6f 20 77  |.........hello w|
00000070  6f 72 6c 64 21 00 00 00  00 00 04 00 00 00 05 00  |orld!...........|
00000080  00 00 00 00 00 00 41 00  00 01 00 00 00 00 59 00  |......A.......Y.|
00000090  01 00 00 00 00 00 1b 80  00 00 00 00 00 00        |..............|
0000009e
$ lua objdump -D hello
objdump: hello: file format not recognized

最后,使用luac-s 参数可以去掉 debug 信息,减小文件大小,同时也提高反汇编的难度。

-s  strip  debug  information before writing the output file.  This saves 
    some space in very large chunks, but if errors occur when running these 
    chunks, then the error messages may not contain the full information they 
    usually do (line numbers and names of locals are lost).

参考资料