4

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

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

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

我查看了第 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?

4

3 回答 3

2

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

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

于 2012-09-28T18:03:29.633 回答
1

在 cron 下运行的作业将具有与您从网络服务器和/或命令行运行的任何不同的默认工作目录。很可能在 cron 中被用作默认目录的任何目录都没有适当的权限供 cron 作业使用。

尝试使用绝对路径,例如

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

而不是您使用的相对路径。

于 2012-09-28T18:02:21.567 回答
0

错误说:

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

这条线是:

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

所以错误必须在一个空$tmp变量中

于 2012-09-28T18:06:26.923 回答