代码之家  ›  专栏  ›  技术社区  ›  wim

不执行pip下载设置.py

  •  1
  • wim  · 技术社区  · 6 年前

    setup.py 文件(可能包含恶意代码)?

    pip download --no-deps mydist
    

    下面是一个可复制的示例,它演示了 设置.py

    $ docker run --rm -it python:3.8-alpine sh
    / # pip --version
    pip 20.0.2 from /usr/local/lib/python3.8/site-packages/pip (python 3.8)
    / # pip download --no-deps suds
    Collecting suds
      Downloading suds-0.4.tar.gz (104 kB)
         |████████████████████████████████| 104 kB 13.4 MB/s 
        ERROR: Command errored out with exit status 1:
         command: /usr/local/bin/python -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-download-yqfdz35d/suds/setup.py'"'"'; __file__='"'"'/tmp/pip-download-yqfdz35d/suds/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base /tmp/pip-download-yqfdz35d/suds/pip-egg-info
             cwd: /tmp/pip-download-yqfdz35d/suds/
        Complete output (7 lines):
        Traceback (most recent call last):
          File "<string>", line 1, in <module>
          File "/tmp/pip-download-yqfdz35d/suds/setup.py", line 20, in <module>
            import suds
          File "/tmp/pip-download-yqfdz35d/suds/suds/__init__.py", line 154, in <module>
            import client
        ModuleNotFoundError: No module named 'client'
        ----------------------------------------
    ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
    

    --no-binary 选项,因为我不想排除源代码分发。我只是想避免执行他们的源代码。

    0 回复  |  直到 4 年前
        1
  •  7
  •   kmaork    4 年前

    我一直在研究 pip 遗憾的是,那里的代码相当复杂。似乎目前没有办法做到这一点 link provided by @doctaphred 没有在这方面取得进展的计划。

    下一步取决于您的情况;例如,如果您需要这个“包下载器”用于生产,我建议您编写自己的pypi客户机。这将是非常简单的写,你可以使它更快,更简单 皮普 通过优化它来满足你的需要。为此,您可以尝试使用 ,但我认为这可能很难(在看到代码之后)。

    否则,我会考虑更快、更粗糙的方法来完成任务。首先想到的解决办法就是停止 皮普 egg_info 命令。要做到这一点,你可以修补 皮普 的代码在运行时使用各种方法。我最喜欢的是使用 usercutomize 文件。

    例如,创建包含以下内容的修补程序文件,并将其放置在您选择的目录中:

    /pypatches/pip_pure_download/usercustomize.py :

    from pip._internal.req.req_install import InstallRequirement
    
    print('Applying pure download patch!')
    
    def override_run_egg_info(*args, **kwargs):
        raise KeyboardInterrupt # Joke's on you, evil hackers! :P
    
    InstallRequirement.run_egg_info = override_run_egg_info
    

    现在要将修补程序应用于python执行,只需将修补程序的目录添加到 PYTHONPATH

    PYTHONPATH=/pypatches/pip_pure_download:$PYTHONPATH pip download --no-deps suds
    
        2
  •  1
  •   doctaphred    5 年前

    从pip 19.3.1开始,这似乎是不可能的:(

    https://github.com/pypa/pip/issues/1884