Python技术迷

别这样直接运行python命令,否则电脑等于“裸奔”

哎我跟你们说啊,昨天晚上快十二点,我在客厅那小茶几上趴着改代码,灯还忽明忽暗的,可能是灯管又快坏了…然后我们组那个小李发我一截图,说他在服务器上直接敲了个 python xxx.py,啥参数都不带、环境变量也没配,结果整个机器 CPU 飙到 100%,把他吓得手机都掉地上了。

我当时整个人“卧槽你别这样啊”,你们千万别在陌生环境里直接运行 Python 命令,这就跟…跟你把家门大开然后去睡觉一样,外面谁来你都不知道。

我当时一边喝水一边跟小李说,你直接运行 Python,就相当于让解释器“自动猜”现在该怎么跑,环境啥样、依赖啥版本、权限给多少,它都不知道。 我手上还在敲个 demo,结果又输错字了你看:

import os

print("cur dir:", os.getcwd())
# 小李那天就在生产上运行脚本,然后默认路径是 /
# 结果下面这个 rm 就…呃我不想回忆了
os.system("rm -rf ./temp")  

你看这种东西,如果脚本里有人写了危险命令,你在不受控的环境下一跑,整台机子就裸奔着等刀子。

对,你们知道吧,那种没有虚拟环境的 Python,模块全装在系统目录里,版本乱得一批。 上次在公司楼下抽烟的时候我跟另一个同事聊,他说他们线上因为有人在 root 权限下直接跑了 python3,结果自动加载的库是旧版本,然后一个 JSON 解析直接把业务逻辑搞挂了。

那天风挺大的我还差点把烟吹断…气得。

你直接执行 Python,它默认继承当前 shell 的权限。 如果你恰好是 root,或者你 sudo 过,然后环境变量又没清干净,那脚本里只要一句破玩意儿:

import shutil
shutil.rmtree("/var/log")  # 谁写的我不说

日志全没了,你之后想排查都找不到痕迹。 我上个月就是因为这个,在机房里坐了五个小时,硬是靠抓包把问题找回来。 坐得我脑袋都麻了。

最离谱的:路径和依赖乱跳

小李那天就是这样,他在 /home/admin 下跑脚本,然后脚本里有个相对路径 ./config/app.yaml。 结果真正的配置文件在另一个目录,他那边 Python 跑起来直接读到一个空 yaml,把默认参数当真走了,然后定时任务疯狂执行,接口直接被调用到冻结。

我当时看日志看到眼睛发酸。

我让他以后必须加上:

import pathlib

BASE = pathlib.Path(__file__).resolve().parent
config = BASE / "config/app.yaml"

不然真的是要命。

别让 Python 自己“猜”环境

我后来给小李列了个“深夜版防裸奔三条”,你们也记一下:

  1. 必须用虚拟环境不管是 venv 还是 conda,一定要锁版本,不能让系统全局的库来乱参与。

  2. 所有入口脚本必须走一个 run.sh 包装我那天随手给他写了:

    #!/bin/bash
    set -e

    source /opt/envs/project/bin/activate
    export APP_ENV=prod
    python main.py --config=/opt/app/config.yaml

    至少知道自己在跑啥。

  3. 权限永远不能直接 root不然你一个小脚本的失误,就是整个服务器给你陪葬。

反正就是一句话:别在不明确、不隔离、不受控的环境下随便敲 python,不然机器真就是光着身子在外面跑。

你现在觉得方便,等哪天线上挂了,你半夜三点被叫醒,你就知道什么叫后悔了。

行了我这边锅要烧糊了,我先去看看,回头你要是有什么场景需要我帮你改安全启动脚本你就喊我。

-END-

我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html

🔥虎哥私藏精品🔥

虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB