做内网穿透,比如用 frp、ngrok 或自建反向代理,常会遇到要写点小工具:自动检测端口连通性、轮询本地服务状态、对接微信通知、或者把日志推到远程服务器——这时候就绕不开一个问题:程序设计用什么语言好?
别被“最流行”带偏,先看你的活儿长啥样
你不是在造操作系统,也不是写百万并发的交易引擎。你可能只是想让家里树莓派上的 Home Assistant 能被手机访问,或者把公司测试机的 Web 服务临时暴露给客户看一眼。这种活儿,核心诉求就三条:写得快、改得顺、跑得稳。
Python:脚本界的瑞士军刀
装完 Python(3.8+),几行代码就能干实事:
import requests
try:
res = requests.get("http://127.0.0.1:8080/health", timeout=3)
if res.status_code == 200:
print("服务正常")
except Exception as e:
print("服务掉线了")requests、schedule、flask 全是 pip 一行搞定。树莓派、NAS、甚至旧笔记本装个 Linux 就能跑。调试时直接 print,上线后打包成单文件(pyinstaller)扔到后台,不依赖环境。
Bash + curl:Linux 下的隐形高手
如果你只在服务器上跑,压根不想装新东西,Bash 就够了:
#!/bin/bash
if curl -s --head --fail http://localhost:3000 > /dev/null; then
echo "[OK] 服务在线"
else
systemctl restart my-web-app
fi配合 crontab 每分钟扫一次,出问题自动拉起。没有编译、没有依赖、没有版本冲突——纯靠系统自带工具链,稳得一批。
Go:一次编译,到处静默运行
需要发给同事或客户一个“双击就跑”的小工具?Go 编出来的二进制没运行时依赖:
package main
import (
"io/ioutil"
"net/http"
"os/exec"
)
func main() {
resp, _ := http.Get("http://127.0.0.1:9000/ping")
if resp.StatusCode != 200 {
exec.Command("systemctl", "restart", "minio").Run()
}
}go build -o check-service main.go,生成一个几 MB 的可执行文件,Windows、Linux、macOS 随便扔,双击或后台启动都行。
别碰 Java 和 C++,除非你真有理由
Java 要配 JDK、写个健康检查还要搭 Spring Boot?C++ 写个 HTTP 请求得引入 libcurl、编译还得分平台……这些在内网穿透这类轻量自动化场景里,属于“杀鸡用导弹”。省下的时间,够你多调通两个隧道了。
一句话:Python 快、Bash 省、Go 狠——按你手头的机器、习惯和需求挑一个,写出来能跑、能修、能忘(半年后还能看懂),就是好语言。