我正在使用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?
答案 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
变量