python-web项目vscode+docker调试

qwertygfdsasdfg 2023-08-03 17:55:50

个人进行python web 项目漏洞复现时,本地搭建环境太复杂,所以通过docker实现远程vscode调试。
网上的教程说的不是很清楚,自己根据实际调试情况梳理一份。

0x0 本机环境:

  • mac
  • IDE:vscode v1.80.1
  • docker desktop v4.12.0

前提:Docker下的web工程正常运行

0x1 .venv虚拟环境

  • 快捷键:command+shift+p

  • python create environment
    image-20230802161736023.png

  • 选择venv

  • 复用的phthon环境尽量用pyenv的
    image-20230802161845406.png

  • 会在工程目录下生成.venv 目录

  • 如果安装requirements.txt,可以在vscode-终端切换到venv目录下,激活虚拟环境source venv\scripts\activate,进行pip安装。

0x2 Docker配置

0x21 方法一:vscode自动识别web框架

正常编写Docker文件即可,无需增加调试相关命令

0x22 方法二:通用远程调试

需要额外增加命令

  • Dockerfile:RUN pip install debugpy
  • docker-compose.yml:(ports之后)entrypoint: [ "python", "-m", "debugpy", "--listen", "0.0.0.0:5678", "--wait-for-client", "-m", "flask", "run", "-h", "0.0.0.0"],其中5678是vscode远程调试的端口

0x3 vscode调试配置

  • vscode 左侧调试栏->点击新建调试文件/或c+s+p->Debug: Start Debugging
  • 选择添加配置
    image-20230802164507648.png
    image-20230802163154148.png

  • 主要以Django和flask框架为例(未加nodejs等),见0x131和0x132

0x31 方法一:vscode自动识别web框架

  • 选择python->Docker: Python - Django/flask

  • 会在工程目录下生成.vscode 目录,其中包含两个json文件:

  • launch.json

    {
        // 使用 IntelliSense 了解相关属性。 
        // 悬停以查看现有属性的描述。
        // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387

        "configurations": [
            {
                "name": "Docker: Python - Django",
                "type": "docker",
                "request": "launch",
                "preLaunchTask": "docker-run: debug",
                "python": {
                    "pathMappings": [
                        {
                            "localRoot": "${workspaceFolder}/web",
                            "remoteRoot": "/usr/src"
                        }
                ],
                    "projectType": "django"
                }
            }
        ]
    } 
  • tasks.json
{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "docker-build",
            "label": "docker-build",
            "platform": "python",
            "dockerBuild": {//自动生成,与docker文件保持一致
                "tag": "", 
                "dockerfile": "${workspaceFolder}/Dockerfile",
                "context": "${workspaceFolder}/[..]",
                "pull": true
            }
        },
        {
            "type": "docker-run",
            "label": "docker-run: debug",
            "dependsOn":[
                "docker-build"
            ],
            "python": {
                "args": [
                    "runserver",
                    "0.0.0.0:8000"
                ],
                "file": "web/app.py" //程序主入口,需根据实际情况修改
            }
        }
    ]

}

注意:
- 这种情况vscode可能会修改Dockerfile,如果拿不准建议提前备份一下Docker配置
- 搭建github上的工程进行调试时,由于工程文件含requirements.txt,venv pip后实际调试失败,总报错:找不到依赖库

0x32 方法二:通用远程调试

  • 选择python->Python: 远程附加->输入调试端口,默认为5678
  • 会在工程目录下生成.vscode 目录,其中包含1个json文件:
  • lanch.json
{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: 远程附加",
            "type": "python",
            "request": "attach",
            "connect": {
                "host": "localhost",
                "port": 5678 //远程调试端口
            },
            "pathMappings": [
                {
                    "localRoot": "${workspaceFolder}",
                    "remoteRoot": "."
                }
            ],
            "justMyCode": true
        }
    ]
}
  • docker-compose.yml的ports添加一行:- "5678:5678"

0x4 vscode调试

  • 在待调试文件代码处下断点

  • 运行docker:docker-compose.yml右键->Compose Up(第一次)或Compose Restart->等待docker正常启动

  • 开始调试:

  • 方法一:运行和调试->自动有Python: Remote Attach按钮,点击

  • 方法二:无Python: Remote Attach时,让待调试文件处于活跃状态(即当前看见的代码是调试代码)->运行和调试->齿轮右侧省略号->开始调试
    image-20230802182404531.png

评论

Q

qwertygfdsasdfg

这个人很懒,没有留下任何介绍

twitter weibo github wechat

随机分类

前端安全 文章:29 篇
逆向安全 文章:70 篇
数据分析与机器学习 文章:12 篇
安全开发 文章:83 篇
软件安全 文章:17 篇

扫码关注公众号

WeChat Offical Account QRCode

最新评论

K

k0uaz

foniw师傅提到的setfge当在类的字段名成是age时不会自动调用。因为获取

Yukong

🐮皮

H

HHHeey

好的,谢谢师傅的解答

Article_kelp

a类中的变量secret_class_var = "secret"是在merge

H

HHHeey

secret_var = 1 def test(): pass

目录