我想使用 PHP 脚本在 pfSense 安装中允许或拒绝 Squid 代理请求,因此我对外部 ACL 使用以下配置:
external_acl_type mysqlAuth %SRC /usr/local/bin/php -f /var/scripts/mysqlacl.php
acl extGrant external mysqlAuth
http_access allow extGrant
我的 Mysql 脚本如下所示:
<?php
file_put_contents("/var/scripts/out.txt",date("Y/m/d H:i:s")."Started\r\n",FILE_APPEND);
$STDIN=fopen("php://stdin", "r");
$STDOUT=fopen("php://stdout", "w"));
while (!feof($STDIN)) {
$line = trim(fgets($STDIN));
file_put_contents("/var/scripts/out.txt",date("Y/m/d H:i:s")." ".$line,FILE_APPEND);
fwrite($STDOUT, "OK\n");
//break;
}
?>
如果我从命令行运行此脚本,一切都会正常进行,对于每一行输入,我都会得到一个“OK”输出行。
问题是,当 Squid 运行时我收到此错误(来自 system.log 的日志):
squid[43190]: Squid 父级:(squid-1) 进程 56700 已启动
(squid-1):mysqlAuth 助手崩溃得太快,需要帮助!
squid[43190]: Squid 父进程: (squid-1) 进程 56700 以状态 1 退出
squid[43190]: Squid 父进程: (squid-1) 进程 56700 由于反复频繁出现故障,将无法重新启动
这是 cache.log:
kid1| ipcCreate: /usr/local/bin/php: (2) 没有此文件或目录
但这个文件肯定存在,为了确保这不是由于文件访问错误造成的,我尝试将 shell 设置为“代理”用户,并以代理用户身份登录(su proxy
),然后从 shell 调用/usr/local/bin/php -f /var/scripts/mysqlacl.php
它,它就起作用了!
这是我的 php 版本:
PHP 5.5.22 (cgi-fcgi)(构建于:2015 年 2 月 26 日 18:00:22)版权所有 (c) 1997-2015 The PHP Group Zend Engine v2.5.0,版权所有 (c) 1998-2015 Zend Technologies with Suhosin v0.9.37.1,版权所有 (c) 2007-2014,由 SektionEins GmbH 提供
这会是什么呢?
答案1
这是我在 pfSense 中使用 PHP 脚本作为 squid 外部 acl 的答案:
ln -s /usr/local/bin/php /usr/pbi/squid-amd64/local/bin/php
ln -s /usr/local/lib/php /usr/pbi/squid-amd64/local/lib/php
ln -s /usr/local/etc/php.ini /usr/pbi/squid-amd64/local/etc/php.ini