我需要在我的本地Web服务器上允许PHP脚本,以SSH到另一台机器来执行某些文件的指定任务。我的httpd
运行_www
权限较低,因此设置直接无密码SSH很困难,更不用说不明智了。
我现在的方法是使用一个最小的PHP脚本sudo-exec(就像我)一个shell脚本,它位于文档根目录之外。 shell脚本依次调用(作为我)执行实际SSH工作的PHP代码,并打印其输出。这是代码。
read_remote_files.php
(我从浏览器调用的脚本):
exec('sudo -u me -n /home/me/run_php.sh /path/to/my_prog.php', $results);
print $results;
/home/me/run_php.sh
(像我一样运行,不管它给出什么):
php $1 2>&1
sudoers
:
_www ALL = (me) NOPASSWD: /home/me/run_php.sh
这一切都有效,因为my_prog.php被称为我,可以像我一样SSH。由于无法直接从浏览器(文档根目录外)调用run_php.sh
,因此它似乎并不太不安全。我遇到的问题是my_prog.php
不被称为HTTP程序,因此无法访问HTTP环境变量(DOCUMENT_ROOT等)。
两个问题:
谢谢! 安迪
答案 0 :(得分:2)
许多系统使用(特权)cron作业来执行此类操作,该作业经常检查文件,数据库记录或其他资源的存在,然后执行操作(如果有)。
这样做的巨大优势在于PHP脚本和特权脚本之间根本没有直接的交互。 PHP脚本将指令留在资源中,特权脚本将其取出。只要指令不会导致系统受到损害或损坏,它肯定比sudoing更安全。
缺点是你不能随时推动改变;你必须等到cron作业再次运行。但也许这是一个选择吗?
答案 1 :(得分:0)
“我需要在我的本地Web服务器上允许PHP脚本,通过SSH连接到另一台机器来执行某些文件的指定任务。”
我认为您在解决方案方面表达了这一点,因为您很难开始工作而不是要求。当然你应该说的是“我想从机器A上的Apache下运行的PHP脚本调用机器B上的任务。”然后研究解决方案 - 从一个简单的'自己动手'的RPC隧道传输到HTTP(S)到使用XMLRPC或SOA框架。
两个警告:
echo 'disable_functions = ' . ini_get('disable_functions') . "\n"; ...)
如果你浏览这里和更广泛的互联网,你会发现很多例子。 Here是我出于类似目的使用的。