Linux Ftp上传文件变更(MD5值变更)

最近遇到一个很棘手的问题. 问题很简单:

一般情况下使用ftp上传就是这个样子:

如下脚本:

$ vim copy.sh 
#! /bin/bash

remote_path=远程地址

if [ -f $1 ]
then
ftp -i -n <<UPLOAD
open ftp服务器
user 账户名 密码
put $1 $remote_path$1
quit
UPLOAD
fi

这是文本文件内容. vim会默认在文件末尾追加\n

$ vim xxx
123!$
hello!$
456$

将写好的文件传到ftp服务器:

$ ./copy.sh xxx

结果传上去之后发现文本内容跟本地内容不匹配. 肉眼看完了都没看到是什么缘故.  如下:

服务器上:
$ md5sum xxx
7f228319446badf0b351a74a62116074  xxx

本地文件:
$ md5sum xxx
e1ea0c6e041a34a40c5ae78a12af2e20  xxx

果断对比文本内容:

本地文件:

$ od -tx1 -tc xxx
0000000  31  32  33  21  0a  68  65  6c  6c  6f  21  0a  34  35  36  0a
          1   2   3   !  \n   h   e   l   l   o   !  \n   4   5   6  \n
0000020

ftp服务器上:

$ od -tx1 -tc xxx
0000000  31  32  33  21  0d  0a  68  65  6c  6c  6f  21  0d  0a  34  35
          1   2   3   !  \r  \n   h   e   l   l   o   !  \r  \n   4   5
0000020  36  0d  0a
          6  \r  \n
0000023

惊讶的发现ftp客户端在上传的时候往文本后面添加了个 \r  !    何其的可耻.

man 了一下. 发现了 ftp的传输模式. 区分ASCII 和 binary. 一个是按文本读取, 一个是按二进制读取. 文本读取会判定本地与远程的服务器类型从而默认增添数据. 

因此修改命令即可:

$ vim copy.sh 
#! /bin/bash

remote_path=远程地址

if [ -f $1 ]
then
ftp -i -n <<UPLOAD
open ftp服务器
user 账户名 密码
binary                   <----
put $1 $remote_path$1
quit
UPLOAD
fi

可参考这篇博文:

http://7905648.blog.51cto.com/7895648/1298447

    原文作者:平菇虾饺
    原文地址: https://blog.csdn.net/qyp199312/article/details/50010791
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞