Вопрос: Почему мой tar.gz-файл поврежден после использования bash ftp для перемещения файла на удаленный сервер?


Я возвращаю файл tar.gz на локальном сервере, а затем ftp его на удаленный сервер. Если я вытащил его на свой рабочий стол через ftp-клиент с локального сервера, файл будет работать нормально. Если я вытащил его на свой рабочий стол через ftp-клиент с удаленного сервера, он на несколько байт меньше и поврежден. Я попытался использовать клиент для принудительного использования ascii и двоичного режима, и ни один из них не испортил файл, поэтому я не понимаю, почему это вызывает коррупцию в скрипте. Есть идеи? Файл переносится штрафом, он просто не открывается. Заранее спасибо.

cd $FSBACKDIR
ATTACH='for file in *$DATE.tar.gz; do echo -n -e "put ${file}\n"; done'
ftp -nv <<EOF
open $FTPHOST
user $FTPUSER $FTPPASS
cd $FTPDIR
$ATTACH
quit
EOF

4
2017-07-12 02:30


Источник




Ответы:


Для меня это по-прежнему кажется проблемой ASCII и двоичного режима, несмотря на те тесты, которые вы сделали с вашим настольным клиентом. Клиент рабочего стола может быть более умным, чем клиент FTP командной строки на отправляющем сервере (на вашем локальном сервере, на котором запущен ваш скрипт).

Например, если локальный сервер - это Windows (который использует CRLF в качестве окончаний строки), а удаленным сервером является Unix (который использует только LF в качестве окончаний строки), и вы не указываете двоичный режим, и ваше программное обеспечение FTP не работает автоматически, обнаружить его и сделать правильную вещь, тогда вы будете использовать режим ASCII для передачи, который должен лишить CRs от любых пар CRLF. Если ваш gzipped tarball имеет байтовый шаблон 0x0d0a, появляющийся в нем где угодно, он потеряет 0x0d.

Если клиент FTP командной строки в вашей отправляющей системе (я думаю, это ваш локальный сервер) - это что-то вроде того, что есть в моей системе, все, что вам нужно было бы сделать, чтобы проверить эту теорию, - это добавить binary команды до или после cd линия:

cd $FSBACKDIR  
ATTACH='for file in *$DATE.tar.gz; do echo -n -e "put ${file}\n"; done'  
ftp -nv <<EOF  
open $FTPHOST  
user $FTPUSER $FTPPASS  
binary  
cd $FTPDIR  
$ATTACH  
quit  
EOF  

Последняя мысль: если это не ASCII vs двоичный режим, я бы посмотрел, возможно ли, что FTP ALG в шлюзе NAT между вашим локальным и удаленным сервером (или между удаленным сервером и вашим рабочим столом) каким-то образом искажает файл В процессе перевозки. Я полагаю, что это также может быть какой-то другой прокси-сервер между хостами, а не FTP-шлюз FTP-шлюза NAT.


11
2017-07-12 06:00



Спасибо. @Spiff. Должно быть, я поставил «двоичный код» в неправильном месте, когда я попробовал это раньше. Наверное, мне нужно было спать на нем, и кто-то сказал мне продолжить фокусироваться там, где я уже смотрел. Очень признателен. - Josh