shell_exec报错:sudo:没有tty和没有指定askpass程序

3
我一直在试图使用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

任何帮助克服这个问题都将非常有帮助。

1
一个更好的方法是在你尝试rsync的路径上给予适当的权限,而不是授予Apache和其他以“nobody”身份运行的程序无密码的完全root访问权限。这样做会导致你的服务器被攻击。这样做也会解决你的tty问题。 - Cfreak
@Cfreak - 我试图更改我尝试rsync的特定目录的文件权限,但似乎无法解决问题。 - Amit Nandan Periyapatna
1个回答

0

sudo需要TTY,即使您已经将其设置为无需密码,除非您显式地不要求它。但正如@Cfreak指出的那样,通过在第一次设置正确的访问权限(在继续之前,请先阅读)来避免使用sudo会更好(更简单更安全)。

rsync 本身在一个合理配置的 *nix 安装中不需要 root 权限。要验证这一点,您可以检查 type -a rsync 是否打印出任何奇怪的内容,例如 rsync is aliased to `sudo rsync',以及 ls -l $(which rsync) 是否打印出合理的权限(至少对于每个人来说是 rx)。


我尝试通过更改所有者和组并设置所需权限来更改源文件夹和目标文件夹的权限,但我的服务器上的rsync需要sudo访问权限。你能帮忙解决这个问题吗? - Amit Nandan Periyapatna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接