为了账号安全,请及时绑定邮箱和手机立即绑定

从 Django webapp 安全地执行 Go 脚本

从 Django webapp 安全地执行 Go 脚本

Go
慕田峪9158850 2022-06-01 18:19:15
如何安全地在 django 应用程序中启动 Go 脚本?我制作了一个自包含的 go 脚本。我希望能够从 django 网络应用程序启动一个作业(我使用 celery 让作业在后台运行)。实现这一目标的正确/更安全的方法是什么?也许是一种隔离这个过程的方法?我感觉跑步...os.system(f"./goscript -o {option1} -b {optiom2}")……很不安全。作为奖励,我希望能够获得输出以查看脚本是否崩溃等......但这是一个奖励问题。
查看完整描述

2 回答

?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

这样的事情应该有助于恕我直言


import shlex

import subprocess


def 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


查看完整回答
反对 回复 2022-06-01
?
慕村225694

TA贡献1880条经验 获得超4个赞

实际上,我刚刚记得一个更好的解决方案是使用异步消息队列库。我熟悉的并且很容易适应的是 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 main


import (

    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 zmq


context = zmq.Context()


#  Socket to talk to server

print("Connecting to hello world server…")

socket = context.socket(zmq.REQ)

socket.connect("tcp://localhost:5555")


#  Do 10 requests, waiting each time for a response

for 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 sockects

socket.close()

context.term()


# Back to normal django stuff


这种方法的创建是客户端可以动态创建和关闭 zmq 上下文。此外,您甚至不必在同一台服务器上运行 go 脚本。您可以与任何 IP 地址进行通信。如果您注意至少对包进行加密,请查看 ZMQ 提供的安全功能。


--


注意:我知道我在回答我自己的问题,但这就像给 IT 打电话一样,您需要在他们接电话时立即给他们打电话以解决问题


查看完整回答
反对 回复 2022-06-01
  • 2 回答
  • 0 关注
  • 108 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信