Php shell_exec抛出:sudo:不存在tty且未指定askpass程序

Php shell_exec抛出:sudo:不存在tty且未指定askpass程序,php,bash,Php,Bash,我一直在尝试使用php中的shell_exec()函数执行脚本: 我已经编写了以下几行代码: $command = "bash /path/to/my/script/ funciton_name() 2>&1"; echo shell_exec($command); 在shell脚本中,我正在执行以下操作: sudo rsync -avvc /source/path /destination/path 在浏览器上执行此操作时,我收到以下错误消息: sudo: no tty pr

我一直在尝试使用php中的shell_exec()函数执行脚本:

我已经编写了以下几行代码:

$command = "bash /path/to/my/script/ funciton_name() 2>&1";
echo shell_exec($command);
在shell脚本中,我正在执行以下操作:

sudo rsync -avvc /source/path /destination/path
在浏览器上执行此操作时,我收到以下错误消息:

sudo: no tty present and no askpass program specified
当我在服务器上执行相同的shell脚本时,它执行得很好

当我在这个论坛上遇到类似的问题时,我意识到我必须在我的服务器上添加NOPASSWD行,我发现该行已按以下格式添加:

User_Alias  NOBODY=nobody,apache
NOBODY  ALL=(ALL) NOPASSWD : /path/to/my/script
当我这样做时:

echo shell_exec("whois");
我得到的输出是:

apache
任何有助于克服此问题的帮助都会大有帮助。

sudo
将需要TTY,即使您已将其设置为无密码,除非您已完成。但是作为一个例子,首先通过设置正确(在继续之前阅读)来避免
sudo
会更好(更简单)


rsync
本身在配置合理的*nix安装上不需要root权限。要验证这一点,您可以检查
type-a rsync
是否打印任何奇怪的内容,例如
rsync被别名为'sudo rsync'
,以及
ls-l$(哪个rsync)
是否打印合理的权限(至少
rx
).

一种更好的方法是,在您尝试rsync的路径上授予适当的权限,而不是授予Apache和以“无人”身份运行的所有其他程序不受限制的根访问权限,无需密码。你要求你的服务器被破坏。这样做也可以解决您的tty问题。@Cfreak-我尝试更改要rsync的特定目录的文件权限,但似乎无法解决问题。我尝试通过将所有者和组更改为apache并设置所需权限来更改源文件夹和目标文件夹的权限。但是我服务器上的rsync需要sudo访问。你能帮忙解决这个问题吗?