lua执行系统命令失败..

286 views
Skip to first unread message

王晨

unread,
Sep 17, 2014, 6:01:53 AM9/17/14
to open...@googlegroups.com

想用openresty做一个git的webhooks, 写lua脚本如下


 location = /update {      

default_type 'text/plain';

     content_by_lua '

           ngx.req.read_body()

        local body_data = ngx.req.get_body_data()

local jsonData = cjson.decode(body_data)

local secret = jsonData.secret

if secret == nil or secret ~= admin" then

ngx.say("error")

else

                                       local cmd = "bash -c /home/wwwroot/update_proto.sh"

local t = io.popen(cmd)

                                       t = t:read("*all")

ngx.say(t)

end

';

   }

       default_type 'text/plain';

        content_by_lua '

           ngx.req.read_body()

        local body_data = ngx.req.get_body_data()

local jsonData = cjson.decode(body_data)

local secret = jsonData.secret

if secret == nil or secret ~= “admin" then

ngx.say("error")

else

                                       local cmd = "bash -c /home/wwwroot/update_proto.sh"

local t = io.popen(cmd)

                                       t = t:read("*all")

ngx.say(t)

end

';

   }



验证secret是admin时,执行git命令,update_proto.sh脚本如下

#!/usr/bin/expect -f

 

set timeout 30

spawn sudo git
-C /home/wwwroot/readme.tianxing.net pull

expect
"password"

send
admin\r"

interact



readme.tianxing.net在root权限,纯静态

tengine运行在www权限,对readme.tianxing.net只读

所以在root下进行git pull操作


当测试时,发现git不执行,也就是sudo,输入完密码之后,脚本结束了,git没有输出任何信息

单独在www下执行lua

local cmd = "bash -c /home/wwwroot/update_proto.sh"

 

local t = io.popen(cmd)

t
= t:read("*all”)

print(t)


则一切正常...


求各位大神解惑

Heero Zhang

unread,
Sep 17, 2014, 6:16:41 AM9/17/14
to open...@googlegroups.com
local cmd = "bash -c /home/wwwroot/update_proto.sh"
改成
local cmd = [[bash -c /home/wwwroot/update_proto.sh 2>&1 && echo " $?"]]
试试看?

--
--
邮件来自列表“openresty”,专用于技术讨论!
订阅: 请发空白邮件到 openresty...@googlegroups.com
发言: 请发邮件到 open...@googlegroups.com
退订: 请发邮件至 openresty+...@googlegroups.com
归档: http://groups.google.com/group/openresty
官网: http://openresty.org/
仓库: https://github.com/agentzh/ngx_openresty
教程: http://openresty.org/download/agentzh-nginx-tutorials-zhcn.html

level077

unread,
Sep 18, 2014, 2:01:53 AM9/18/14
to open...@googlegroups.com
之前也是用io.open来执行一些系统命令,后来在网上找了一圈,发现ssh.lua,就用它来执行一些系统命令,配合ngx.flush()还是挺好用的。


在 2014年9月17日星期三UTC+8下午6时01分53秒,王晨写道:

王晨

unread,
Sep 20, 2014, 11:23:07 PM9/20/14
to open...@googlegroups.com
谢谢各位,ssh.lua很好用

--

aaashun

unread,
Sep 22, 2014, 7:45:07 AM9/22/14
to open...@googlegroups.com
hello,

提醒一下, 当执行系统命令时整个世界都停止了, 当前nginx会堵在系统命令上而无法处理其它请求.

Yichun Zhang (agentzh)

unread,
Sep 22, 2014, 3:01:07 PM9/22/14
to openresty
Hello!

2014-09-22 4:45 GMT-07:00 aaashun:
> 提醒一下, 当执行系统命令时整个世界都停止了, 当前nginx会堵在系统命令上而无法处理其它请求.
>

是的。出于这样的原因,lua-resty-shell 通过外部服务代理 shell 命令运行的模式才是值得推荐的。

之前的贴子提到了 ssh.lua,估计十之八九也是阻塞的。我其实一直想基于 cosocket API 实现一个 100% 非阻塞的
lua-resty-ssh 客户端库,呵呵。这还是挺有趣的。

Regards,
-agentzh

Zoom.Quiet

unread,
Sep 22, 2014, 7:37:23 PM9/22/14
to openresty

这样一来,基于 resty 的配置管理服务也有的搞了…
(≧∇≦)

Zoom.Quiet from N7108

Reply all
Reply to author
Forward
0 new messages