最近遇到一个很棘手的问题. 问题很简单:
一般情况下使用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