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

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

  •  
  •   K1W1 · Oct 31, 2017 · 10621 views
    This topic created in 3294 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
    araraloren
    Oct 31, 2017❤️1
    1
    nc 可以用来监听某一个端口

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

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


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

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

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

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

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