Eu fiz a própria ferramenta de linha de comando para isso:
ftpsync
Por quê? Por ser simples e elegante, outras ferramentas exigem muitas dependências, às vezes compilando, às vezes não funcionam (por exemplo, lftp no MacOs High Sierra). O ftpsync é escrito em Python puro, não requer bibliotecas de terceiros e é pequeno, basta incluir o arquivo no seu projeto.
Uso: cd no diretório do projeto e digite:
ftpsync user:pass@ftp.address.url/remote/dir --delete
--delete
significa excluir arquivos remotos que não existem localmente.
Se você não deseja sincronizar, mas apenas executar o comando raw ftp, use:
ftpsync -c '...'
É útil para algumas operações simples, como enviar arquivo e renomeá-lo:
ftpsync -c 'PASV; TYPE I; STOR some_file.ext; RNFR some_file.ext; RNTO some_file_renamed.ext'