请问 shell 可以实现一个简单的 web 接口吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
K1W1
V2EX    Linux

请问 shell 可以实现一个简单的 web 接口吗?

  •  
  •   K1W1 2017 年 10 月 31 日 9954 次点击
    这是一个创建于 3017 天前的主题,其中的信息可能已经有所发展或是发生改变。
    不想手动发服务器也不想用 jenkins,然后发现 gitlab 有一个 git 钩子,然后只需要提供的一个 web 接口来接收事件,然后调用发布的脚本就可以了。但是因为只需要一个接口,不想要 java、python 去实现,请问 shell 可以实现吗?
    44 条回复    2022-08-18 19:10:35 +08:00
    araraloren
        1
    araraloren  
       2017 年 10 月 31 日   1
    nc 可以用来监听某一个端口

    nc -l <port>
    clino
        2
    clino  
       2017 年 10 月 31 日
    @araraloren nc 不能处理 web 请求吧,没办法返回 response?
    lxf1992521
        3
    lxf1992521  
       2017 年 10 月 31 日
    `man bash`, 然后搜索`Opening File Descriptors for Reading and Writing`章节,可以实现套接字的读和写。
    whorusq
        4
    whorusq  
       2017 年 10 月 31 日
    从 可控性 和 简单度来说,推荐 Python
    htfy96
        5
    htfy96  
       2017 年 10 月 31 日
    socat,可以 accept 一个请求后直接新起一个进程,把进程的输入输出和 socket 关联起来
    rrfeng
        6
    rrfeng  
       2017 年 10 月 31 日
    当然可以。
    aWangami
        7
    aWangami  
       2017 年 10 月 31 日
    简单的 web 接口,为啥不用 Python/Node 之类的来简化工作呢?
    TangMonk
        8
    TangMonk  
       2017 年 10 月 31 日
    用 golang 编译成一个可执行文件就行了,不用安装环境又简单
    K1W1
        9
    K1W1  
    OP
       2017 年 10 月 31 日
    @araraloren #1 我试了的确可以收到请求,但是好像只能通过 ctrl + c 才能中断连接
    chinuno
        10
    chinuno  
       2017 年 10 月 31 日 via Android
    Python 自带简单的 http server。不需要其他依赖单个文件就能实现 get post 的处理了
    K1W1
        11
    K1W1  
    OP
       2017 年 10 月 31 日
    @aWangami #7 因为只有一个接口,大才小用了,而且我们服务器没有 python 或 node 环境
    jtsai
        12
    jtsai  
       2017 年 10 月 31 日 via Android
    shell http,写 response 好难,request 就简单了。
    whileFalse
        13
    whileFalse  
       2017 年 10 月 31 日
    @K1W1 #11 golang,极易部署
    cnwtex
        14
    cnwtex  
       2017 年 10 月 31 日   4
    楼上一群智障吧, 人家问 shell 能不能, 推荐一堆 go/python/node
    des
        15
    des  
       2017 年 10 月 31 日 via Android
    @clino nact 可以用 lua
    pagxir
        16
    pagxir  
       2017 年 10 月 31 日 via Android
    楼主听过 cgi 否。直接用 socat 然后按照 cgi 来处理
    boboliu
        17
    boboliu  
       2017 年 10 月 31 日 via Android
    @cnwtex shell 实现要更复杂,推荐楼主选择更为简单易行的方案不是很正常么?
    huangzxx
        18
    huangzxx  
       2017 年 10 月 31 日
    你的需求应该用 gitlab-ci
    araraloren
        19
    araraloren  
       2017 年 10 月 31 日
    @clino 能啊 不简单而已。。

    不过不如 python perl ruby 了。。
    araraloren
        20
    araraloren  
       2017 年 10 月 31 日
    @K1W1 有 perl 环境也可以啊,写起来都是简单的飞起
    xi2008wang
        21
    xi2008wang  
       2017 年 10 月 31 日
    google 搜索 shell cgi
    ysc3839
        22
    ysc3839  
       2017 年 10 月 31 日 via Android
    我推荐用 CGI
    Chingim
        23
    Chingim  
       2017 年 10 月 31 日 via Android
    cgi 妥妥的
    ryd994
        24
    ryd994  
       2017 年 10 月 31 日 via Android
    说实话,python+flask,比你折腾 bash 容易多了
    10 行以内写出来
    kuro1
        25
    kuro1  
       2017 年 10 月 31 日
    只需要一个接口,python 不是很方便么。。linux 的话
    araraloren
        26
    araraloren  
       2017 年 10 月 31 日
    @ryd994
    @kuro1
    好好看帖子,没有 python 以及 node 环境
    mcfog
        27
    mcfog  
       2017 年 10 月 31 日
    xjp
        28
    xjp  
       2017 年 10 月 31 日 via iPhone
    查了一下 github 上有个 bashhttpd 是单文件的 bash 脚本 代码不多 实现了文件列表查看 可以参考一下


    另外好奇为啥服务器没有 python 环境 各个 Linux 不是自带的吗
    ri0day
        29
    ri0day  
       2017 年 10 月 31 日
    建议看一下 https://github.com/ri0day/wwwoosh
    其实就是 nc 监听一个端口然后处理一下,最后按照 http 协议规定输出 status code ,header, body
    congeec
        30
    congeec  
       2017 年 10 月 31 日
    楼主你知道最最最最最初的 web server 就是 CGI + Bash 脚本做的么?后来用 CGI + Perl 脚本
    whorusq
        31
    whorusq  
       2017 年 10 月 31 日
    何必拘泥于 shell,不是应该用最合适的语言干最合适的事情么?

    基于你的情况,用 go 是最简单了,几行代码写完,再编译打包成二进制,直接丢到服务器启动服务就跑起来了,也不需要安装什么环境支持

    你这个也属于运维范畴的了,go 还是很值得了解的
    panzhc
        32
    panzhc  
       2017 年 10 月 31 日
    HttpLuaModule

    location /my-website {
    content_by_lua_block {
    os.execute("/bin/myShellScript.sh")
    }
    }

    不知道这样算不算
    Lonely
        33
    Lonely  
       2017 年 10 月 31 日
    @cnwtex 恩,人家都智障,就你聪明
    NoAnyLove
        34
    NoAnyLove  
       2017 年 11 月 1 日
    如果我没记错的话,bash 可以按照文件系统路径来操作 socket,不过能不能写出符合你要求的接口就不知道了
    cs8425
        35
    cs8425  
       2017 年 11 月 1 日
    nc 有个-e 选项
    把 tcp 输入输出导到另一只程式的标准输入输出
    可以写 shell 脚本自己处理 http header 什么的
    还是比较推荐弄个 go/node 之类的比较实际一点
    避免 header 没处理好造成各种 exploit
    julyclyde
        36
    julyclyde  
       2017 年 11 月 1 日
    @clino 并不需要返回 response 吧? gitlab 那边只负责通知,似乎并不关系是否成功
    clino
        37
    clino  
       2017 年 11 月 1 日
    @julyclyde 呃,我的意思其实是这个 tcp 连接 nc 因为不返回两边都不会主动断开,会一直保持在那里...估计会等什么 timeout 吧,但是如果 timeout 就算异常了吧
    lqzhgood
        38
    lqzhgood  
       2017 年 11 月 1 日
    搭车问问 js(node) 能不能像 GO 那样,编译 /打包 成 .bat/.exe/.sh 不依赖环境的单可执行文件?
    不用实现复杂的东西,就像平时处理下重复劳动力,代替 bat shell 这些~
    Github 有个 node to bat 但是弃坑好多年了。。
    julyclyde
        39
    julyclyde  
       2017 年 11 月 1 日
    @clino 就算异常了。不过似乎无所谓
    sublimevsatom
        40
    sublimevsatom  
       2017 年 11 月 1 日
    while ( nc -l 80 < /file.htm > : ) ; do : ; done &
    iwtbauh
        41
    iwtbauh  
       2017 年 11 月 2 日 via Android
    推荐用 cgi 啊,直接让 web 服务器调用 shell 脚本
    但你硬要用 shell 来处理 http 的细节也不是不行,例如用 xinetd 超级服务器来弄
    mingyun
        42
    mingyun  
       2017 年 11 月 6 日
    不少人推荐 go,看来学习了
    hujingnb
        43
    hujingnb  
       2022 年 8 月 18 日
    已经有人将工具提供出来了, 可见文章: https://hujingnb.com/archives/729
    K1W1
        44
    K1W1  
    OP
       2022 年 8 月 18 日
    @hujingnb #43 5 年了,你知道这 5 年我怎么过的吗
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5017 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 02:10 PVG 10:10 LAX 18:10 JFK 21:10
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86