我们有一个Perl脚本,我们已经使用(从crontab启动)好几年来使用Net :: FTP上传图片。 最近我们开始注意到图像没有上传的问题,错误出现在日志中。
在进行故障排除时,我发现目前从cmd行启动的程序工作得很好,但是从crontab启动时,它的错误一直存在。 在远程服务器上,我可以在FTP日志中看到连接仍然处于活动状态,客户端正在更改目录,但STOR命令从不像正常情况下那样显示。 在客户端,当ftp-> put被发出时,响应看起来是'227进入被动模式'
我尝试了一切可以想到的事情来追踪原因(防火墙,短暂端口,内存泄漏),但到目前为止,我唯一的解决scheme是从cmd行手动运行它。
有没有人有任何想法可能是这个问题的原因?
更新:这里是Debug => 1的一些输出:
当从crontab运行并且失败时(最后一行'ERROR'来自perl脚本并且包括$ ftp-> message,即“进入被动模式”):
Net::FTP=GLOB(0xa004910)>>> CWD /images/shots Net::FTP=GLOB(0xa004910)<<< 250 CWD command successful Net::FTP=GLOB(0xa004910)>>> PASV Net::FTP=GLOB(0xa004910)<<< 227 Entering Passive Mode (181,71,41,114,114,112). ERROR: Couldn't put file /home/user/data/shot/212/212474.000078.jpg to f/4/f41891045708388275a0b1d1fe8a34fa.jpg on 127.0.0.1 because Entering Passive Mode (181,71,41,114,114,112).
从命令行运行并成功时:
Net::FTP=GLOB(0x8619170)>>> CWD /images/shots Net::FTP=GLOB(0x8619170)<<< 250 CWD command successful Net::FTP=GLOB(0x8619170)>>> PASV Net::FTP=GLOB(0x8619170)<<< 227 Entering Passive Mode (181,71,41,114,113,179). Net::FTP=GLOB(0x8619170)>>> STOR 5/6/569e214479a6f99f5bdf920e75f8351e.jpg Net::FTP=GLOB(0x8619170)<<< 150 Opening BINARY mode data connection for 5/6/569e214479a6f99f5bdf920e75f8351e.jpg Net::FTP=GLOB(0x8619170)<<< 226 Transfer complete
这里是脚本的这一部分:
if ( ! ( $ftp->put($src_file, $target_file) ) ) { print STDERR "ERROR: Couldn't put file $src_file to $target_file on $ftp_host because " . $ftp->message . "\n"; } else { $mv_result = 1; }
服务器运行stunnel,所以FTP连接是通过本地主机上的一个端口(127.0.0.1)
更新:好吧,我想清楚发生了什么,有一个从crontab传入的参数告诉它使用哪个networking。 原来在这个networking上的调制解调器坏了,我愚蠢的是没有通过CMD线上的说法,我们的默认networking工程很好。 我们只需要一个新的调制解调器专用的上传线。 非常感谢您的帮助Steffen。
服务器运行stunnel,所以FTP连接是通过本地主机上的一个端口(127.0.0.1)
我怀疑这会起作用。 FTP需要一个控制连接,你可能通过stunnel隧道。 但是除此之外,每个数据传输都需要数据连接(STOR,RETR,LIST …)。
你真的在工作命令行上使用相同的设置吗?
<<< 227 Entering Passive Mode (181,71,41,114,114,112).
这意味着服务器希望在IP 181.71.41.114,端口28024(114 * 245 + 112)上具有数据连接。 因此,Net :: FTP将直接连接到这个地址,因为它不知道隧道的任何内容,也不能处理它。 我认为你有stunnel,因为直接连接到目标服务器不起作用,所以这个连接尝试将失败。