V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
K1W1
V2EX  ›  Linux

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

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

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

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


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

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

    你这个也属于运维范畴的了,go 还是很值得了解的
    panzhc
        32
    panzhc  
       2017-10-31 22:41:44 +08:00
    HttpLuaModule

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

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