Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
K1W1
V2EX  ›  Linux

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

  •  
  •   K1W1 · Oct 31, 2017 · 10209 views
    This topic created in 3142 days ago, the information mentioned may be changed or developed.
    不想手动发服务器也不想用 jenkins,然后发现 gitlab 有一个 git 钩子,然后只需要提供的一个 web 接口来接收事件,然后调用发布的脚本就可以了。但是因为只需要一个接口,不想要 java、python 去实现,请问 shell 可以实现吗?
    44 replies    2022-08-18 19:10:35 +08:00
    araraloren
        1
    araraloren  
       Oct 31, 2017   ❤️ 1
    nc 可以用来监听某一个端口

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

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


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

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

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

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

    不知道这样算不算
    Lonely
        33
    Lonely  
       Oct 31, 2017
    @cnwtex 恩,人家都智障,就你聪明
    NoAnyLove
        34
    NoAnyLove  
       Nov 1, 2017
    如果我没记错的话,bash 可以按照文件系统路径来操作 socket,不过能不能写出符合你要求的接口就不知道了
    cs8425
        35
    cs8425  
       Nov 1, 2017
    nc 有个-e 选项
    把 tcp 输入输出导到另一只程式的标准输入输出
    可以写 shell 脚本自己处理 http header 什么的
    还是比较推荐弄个 go/node 之类的比较实际一点
    避免 header 没处理好造成各种 exploit
    julyclyde
        36
    julyclyde  
       Nov 1, 2017
    @clino 并不需要返回 response 吧? gitlab 那边只负责通知,似乎并不关系是否成功
    clino
        37
    clino  
       Nov 1, 2017
    @julyclyde 呃,我的意思其实是这个 tcp 连接 nc 因为不返回两边都不会主动断开,会一直保持在那里...估计会等什么 timeout 吧,但是如果 timeout 就算异常了吧
    lqzhgood
        38
    lqzhgood  
       Nov 1, 2017
    搭车问问 js(node) 能不能像 GO 那样,编译 /打包 成 .bat/.exe/.sh 不依赖环境的单可执行文件?
    不用实现复杂的东西,就像平时处理下重复劳动力,代替 bat shell 这些~
    Github 有个 node to bat 但是弃坑好多年了。。
    julyclyde
        39
    julyclyde  
       Nov 1, 2017
    @clino 就算异常了。不过似乎无所谓
    sublimevsatom
        40
    sublimevsatom  
       Nov 1, 2017
    while ( nc -l 80 < /file.htm > : ) ; do : ; done &
    iwtbauh
        41
    iwtbauh  
       Nov 2, 2017 via Android
    推荐用 cgi 啊,直接让 web 服务器调用 shell 脚本
    但你硬要用 shell 来处理 http 的细节也不是不行,例如用 xinetd 超级服务器来弄
    mingyun
        42
    mingyun  
       Nov 6, 2017
    不少人推荐 go,看来学习了
    hujingnb
        43
    hujingnb  
       Aug 18, 2022
    已经有人将工具提供出来了, 可见文章: https://hujingnb.com/archives/729
    K1W1
        44
    K1W1  
    OP
       Aug 18, 2022
    @hujingnb #43 5 年了,你知道这 5 年我怎么过的吗 😂
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3156 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 117ms · UTC 13:14 · PVG 21:14 · LAX 06:14 · JFK 09:14
    ♥ Do have faith in what you're doing.