O script FTP do Perl falha no crontab, funciona a partir do cmd

1

Temos um script em Perl que estamos usando (lançado do crontab) há vários anos para fazer upload de imagens usando o Net :: FTP. Recentemente, começamos a notar problemas em que as imagens não estavam sendo carregadas e os erros apareciam nos registros.

Na solução de problemas, descobri que atualmente o programa funciona bem quando iniciado a partir da linha cmd, mas quando iniciado a partir do crontab, ele apresenta erros consistentemente. No servidor remoto, posso ver no log de FTP que a conexão ainda está ativa, o cliente está mudando de diretórios, mas o comando STOR nunca aparece como ocorre em circunstâncias normais. No lado do cliente, quando o ftp- > put é emitido, a resposta parece ser '227 Inserindo o Modo Passivo'

Eu tentei tudo o que posso pensar para rastrear a causa (firewalls, portas efêmeras, vazamentos de memória), mas até agora minha única solução é executá-lo manualmente a partir da linha cmd.

Alguém tem alguma ideia de qual pode ser a causa deste problema?

Atualização: aqui estão alguns resultados de Debug = > 1:

Quando executado a partir do crontab e ele falha (a última linha 'ERROR' é do script perl e inclui a mensagem $ ftp- > que é "Entrando no Passive Mode"):

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).

Quando executado a partir da linha de comando e é bem-sucedido:

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

E aqui está a parte do script que está fazendo isso:

      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;
      }

O servidor executa stunnel para que a conexão FTP seja iniciada através de uma porta no host local (127.0.0.1)

Atualização: OK Eu descobri o que está acontecendo, há um argumento passado do crontab que informa qual rede usar. Acontece que o modem nessa rede está indo mal e eu estupidamente não estava passando esse argumento na linha cmd, nossa rede padrão funciona muito bem. só precisamos de um novo modem para nossa linha de upload dedicada. muito obrigado pela sua ajuda Steffen.

    
por user16081-JoeT 17.07.2014 / 20:18

1 resposta

0

The server runs stunnel so the FTP connection is initiated through a port on the localhost (127.0.0.1)

Eu duvido que isso funcione. O FTP precisa de uma conexão de controle que você possa fazer um túnel através do stunnel. Mas além disso, precisa de conexões de dados para cada transferência de dados (STOR, RETR, LIST ...).

Você realmente usa a mesma configuração na linha de comando?

<<< 227 Entering Passive Mode (181,71,41,114,114,112).

Isso significa que o servidor deseja ter a conexão de dados no IP 181.71.41.114, porta 28024 (114 * 245 + 112). O Net :: FTP tentará se conectar a este endereço diretamente, porque não sabe nada sobre um túnel e também não será capaz de lidar com ele. Suponho que você tenha o stunnel porque a conexão direta com o servidor de destino não funciona, portanto, essa tentativa de conexão falhará.

    
por 18.07.2014 / 06:59

Tags