如何从PHP执行CGI文件?

0 投票
3 回答
954 浏览
提问于 2025-04-15 13:10

我正在尝试制作一个网页应用,来管理我的Mercurial代码库。
我希望当我告诉它加载某个代码库X时,能做到以下几点:

  • 连接到MySQL服务器,确保代码库X存在。
  • 检查用户是否有权限访问这个代码库。
  • 如果用户有权限,就从MySQL服务器获取代码库X的位置。
  • 运行一个hgweb的cgi脚本(用Python写的),这个脚本里包含了代码库的路径。

现在的问题是,我想要:拿到hgweb脚本,修改它,然后直接运行。
但我不想要:拿到hgweb脚本,修改它,然后把它写到一个文件里再去重定向到那个文件。
我正在使用Apache来运行httpd进程。

3 个回答

0

关于你的问题,不,你不太可能让php执行一个修改过的脚本,而不把它写到某个地方,比如硬盘上的文件、映射到内存的虚拟文件,或者类似的东西。

听起来你可能是在用一根小树枝去敲铁路钉。如果你已经到了根据存储在MySQL中的用户权限来过滤访问的地步,是否考虑过现有的HG解决方案,看看有没有比hgweb更合适的选择?hgweb其实是为了做好一件事而设计的,而你现在的需求超出了它的正常范围。

我建议你可以看看apache的原生认证,这样可以更方便地控制对代码库的访问,然后直接提供代码库,而不需要修改脚本。

2

你可以在PHP里面运行shell脚本。有很多种方法可以做到这一点,但有些主机可能没有提供正确的权限,这些问题在php.net上都有详细的说明。不过,最简单的方法就是把你的命令放在反引号里面。所以,如果我想解压一个文件,可以这样写:

`unzip /path/to/file`

所以,如果你的Python脚本可以在命令行环境中运行(或者你可以修改它让它可以运行),那么这似乎是最推荐的方法。

2

Ryan Ballantyne 给出的答案是正确的(我给了赞)。反引号操作符是执行 shell 脚本的方式。

最简单的解决办法可能是修改 hgweb 脚本,让它不直接“包含”仓库的路径。相反,可以把路径作为命令行参数传递。这意味着你不需要担心在任何地方修改和写 hgweb 脚本。你只需要做的就是:

//do stuff to get location of repository from MySQL into variable $x
//run shell script
$res = `python hgweb.py $x`;

撰写回答