php rsync 与 exec() 不起作用

php rsync 与 exec() 不起作用

为什么这个:

rsync -avz -e ssh /home/userneme/folder [email protected]:/var/www/folder

来自 cronjob 的作品如下:

exec("rsync -avz -e ssh /home/userneme/folder [email protected]:/var/www/folder");

不起作用。

我知道 exec 正在运行,因为我的应用程序中有几个地方使用 ImageMagick (exec) 将 pdf 转换为 jpg。

解决了

exec 运行正常,这是远程服务器上的权限问题。“本地”服务器是共享经销商帐户,远程服务器是我的第一个 VPS Ubuntu 10.10 LAMP 盒。如果我有系统管理员就好了,因为我只是一个被迫做这件事的软件开发人员,而且我做这件事很糟糕 :) 谢谢大家!

答案1

您的 ssh 密钥也应位于 apache 主文件夹中。否则,rsync 将无法工作。

问候

答案2

这可能与 PATH 有关。尝试使用完整路径执行 rsync,例如

exec("/usr/bin/rsync -avz -e ssh /home/userneme/folder [email protected]:/var/www/folder");

答案3

你的主机开着吗safe_mode

运行php -i |grep -i safe。如果安全模式已打开,则查看safe_mode_exec_dir。如果 rsync 不在列出的文件夹中,则 PHP 不会执行它。

您可以要求您的主机在路径中放置一个指向 rsync 的符号链接exec_dir,然后从该位置执行它;但这取决于他们的政策是否允许这样做。

答案4

您应该能够通过为 ssh 提供一个特定的密钥文件来执行此操作,以便在-ersync 选项中使用。由于您使用的是共享主机,您需要做的是在安全的地方创建 ssh 密钥,然后将密钥放在主机上尽可能安全的目录中(应该只有您和 apache 可以读取,但如果其他人知道,他们可以使用 PHP 脚本或其他东西让 apache 将您的密钥发送给他们。如果您的主机对脚本使用 suexec,因此它们都以您的用户名运行,您可以使其只有您自己可以读取。)

然后你会使用

rsync -avz -e "ssh -i /some/id_?sa_key" /home/userneme/folder [email protected]:/var/www/folder

由于这不是很安全,您应该设置远程端的授权密钥文件来强制执行一个命令,该命令至少会验证正在执行的命令是“rsync”。

有关自动化 rsync 的更多信息(包括用于验证 ssh 命令的脚本)这里

相关内容