猿问

从 Django webapp 安全地执行 Go 脚本

如何安全地在 django 应用程序中启动 Go 脚本?

我制作了一个自包含的 go 脚本。我希望能够从 django 网络应用程序启动一个作业(我使用 celery 让作业在后台运行)。实现这一目标的正确/更安全的方法是什么?也许是一种隔离这个过程的方法?

我感觉跑步...

os.system(f"./goscript -o {option1} -b {optiom2}")

……很不安全。

作为奖励,我希望能够获得输出以查看脚本是否崩溃等......但这是一个奖励问题。


慕田峪9158850
浏览 109回答 2
2回答

汪汪一只猫

这样的事情应该有助于恕我直言import shleximport subprocessdef get_output(command, working_folder=None):    logging.debug("Executing %s in %s", command, working_folder)    try:        output = subprocess.check_output(shlex.split(command), cwd=working_folder)        return output.decode("utf-8")    except OSError:        logging.error("Command being executed: {}".format(command))        raise

慕村225694

实际上,我刚刚记得一个更好的解决方案是使用异步消息队列库。我熟悉的并且很容易适应的是 ZMQ https://zeromq.org/。使用 Go 脚本作为服务器侦听和 django 应用程序请求作为作业的客户端来进行服务器/客户端设置非常容易。作为概念证明,这里是来自不同库文档的片段。GO中的服务器这个脚本就是服务端,用Go写的,我相信可以设置成服务持续运行,等待django发送job来做。// source: https://github.com/pebbe/zmq4/blob/master/examples/hwserver.go////  Hello World server.//  Binds REP socket to tcp://*:5555//  Expects "Hello" from client, replies with "World"//package mainimport (    zmq "github.com/pebbe/zmq4"    "fmt"    "time")func main() {    //  Socket to talk to clients    responder, _ := zmq.NewSocket(zmq.REP)    defer responder.Close()    responder.Bind("tcp://*:5555")    for {        //  Wait for next request from client        msg, _ := responder.Recv(0)        fmt.Println("Received ", msg)        //  Do some 'work', can take a whilst        time.Sleep(time.Second)        //  Send reply back to client        reply := "World"        responder.Send(reply, 0)        fmt.Println("Sent ", reply)    }}python中的客户端这是可以在任何 http 请求中轻松调用的 python 应用程序。它可以创建 zmq 上下文并开始向 go 服务器发送要做的事情。#   source: http://zguide.zeromq.org/py:hwclient##   Hello World client in Python#   Connects REQ socket to tcp://localhost:5555#   Sends "Hello" to server, expects "World" back#import zmqcontext = zmq.Context()#  Socket to talk to serverprint("Connecting to hello world server…")socket = context.socket(zmq.REQ)socket.connect("tcp://localhost:5555")#  Do 10 requests, waiting each time for a responsefor request in range(10):    print("Sending request %s …" % request)    socket.send(b"Hello")    #  Get the reply.    message = socket.recv()    print("Received reply %s [ %s ]" % (request, message))# Gracefully closing the sockectssocket.close()context.term()# Back to normal django stuff这种方法的创建是客户端可以动态创建和关闭 zmq 上下文。此外,您甚至不必在同一台服务器上运行 go 脚本。您可以与任何 IP 地址进行通信。如果您注意至少对包进行加密,请查看 ZMQ 提供的安全功能。--注意:我知道我在回答我自己的问题,但这就像给 IT 打电话一样,您需要在他们接电话时立即给他们打电话以解决问题
随时随地看视频慕课网APP

相关分类

Go
我要回答