允许PHP脚本使用sudo进行ssh

时间:2012-01-12 21:41:05

标签: apache sudo

我需要在我的本地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等)。

两个问题:

  1. 我这太复杂了吗?
  2. 我的最终脚本是否有一种简单的方法来获取HTTP变量?
  3. 谢谢! 安迪

2 个答案:

答案 0 :(得分:2)

许多系统使用(特权)cron作业来执行此类操作,该作业经常检查文件,数据库记录或其他资源的存在,然后执行操作(如果有)。

这样做的巨大优势在于PHP脚本和特权脚本之间根本没有直接的交互。 PHP脚本将指令留在资源中,特权脚本将其取出。只要指令不会导致系统受到损害或损坏,它肯定比sudoing更安全。

缺点是你不能随时推动改变;你必须等到cron作业再次运行。但也许这是一个选择吗?

答案 1 :(得分:0)

  

“我需要在我的本地Web服务器上允许PHP脚本,通过SSH连接到另一台机器来执行某些文件的指定任务。”

我认为您在解决方案方面表达了这一点,因为您很难开始工作而不是要求。当然你应该说的是“我想从机器A上的Apache下运行的PHP脚本调用机器B上的任务。”然后研究解决方案 - 从一个简单的'自己动手'的RPC隧道传输到HTTP(S)到使用XMLRPC或SOA框架。

两个警告:

  • 做一个phpinfo();在两台机器上检查可用的扩展名和
  • 同时检查您的php.ini设置,确保您的服务提供商未禁用您希望使用的任何功能(或执行Q& D脚本echo 'disable_functions = ' . ini_get('disable_functions') . "\n"; ...)

如果你浏览这里和更广泛的互联网,你会发现很多例子。 Here是我出于类似目的使用的。