为什么这个:
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 提供一个特定的密钥文件来执行此操作,以便在-e
rsync 选项中使用。由于您使用的是共享主机,您需要做的是在安全的地方创建 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 命令的脚本)这里。