您的位置:首页 > 运维架构 > Linux

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

2015-11-24 13:41 549 查看
最近遇到一个很棘手的问题. 问题很简单:

一般情况下使用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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: