php ftp_get()返回权限被拒绝

时间:2012-09-28 17:57:56

标签: php ftp cron

我正在使用ftp上传脚本将一台服务器转移到另一台服务器。它在浏览器窗口中工作正常,并且通过运行以下命令行在ssh命令行中运行良好: php /var/www/vhosts/domain.com/httpdocs/ftp_shell.php

但是当我从cron运行完全相同的命令时,我得到了这个:

PHP警告:ftp_get(ftp.tmp):无法打开流:第516行/var/www/vhosts/domain.com/httpdocs/ftp_shell.php中的权限被拒绝 PHP警告:ftp_get():在第516行的/var/www/vhosts/domain.com/httpdocs/ftp_shell.php中打开ftp.tmp时出错

我看了第516行,这是:

    if((ftp_get($ftp_from,"ftp".$tmp.".tmp",$fname,FTP_BINARY) ||
        ftp_get($ftp_from,"ftp".$tmp.".tmp",$fname,FTP_ASCII)) &&
       (ftp_put($ftp_to,$fname,"ftp".$tmp.".tmp",FTP_BINARY) ||
        ftp_put($ftp_to,$fname,"ftp".$tmp.".tmp",FTP_ASCII)) &&
       ftp_site($ftp_to,"chmod ".base_convert($chmod,10,8)." $fname") &&
       f_size()&&unlink("ftp".$tmp.".tmp")) {echoout(" (".$size_b." bytes) ok<br>");$count_f++;}

我知道它正在将文件写入临时文件,但为什么它允许我在浏览器和命令行中执行此操作,而不是cron?

3 个答案:

答案 0 :(得分:1)

在cron下运行的作业将具有与从Web服务器和/或命令行运行的任何默认工作目录不同的默认工作目录。很可能无论在cron中使用哪个目录作为默认目录,都没有适当的权限来使用cron作业。

尝试使用绝对路径,例如

ftp_get($ftp_from,"/real/path/to/file/ftp".$tmp.".tmp",$fname,FTP_BINARY)
                   ^^^^^^^^^^^^^^^^^^^

而不是你正在使用的相对路径。

答案 1 :(得分:1)

可能临时文件是由php脚本(apache用户)创建的,你想从cron作业(root用户)读取它。出于安全原因,临时文件不能从一个用户读取到其他用户。

您必须更改您的cron作业以由apache用户执行,或者您可以更改临时文件的权限以使每个人都可读,但不建议这样做,因为任何其他程序都可以读取该文件。

答案 2 :(得分:0)

错误说:

PHP Warning: ftp_get(ftp.tmp): failed to open stream

,该行是:

if((ftp_get( $ftp_from, "ftp" . $tmp . ".tmp", $fname ...

所以错误必须是空的$tmp变量