Linux下nc、tar、pigz主机间传输文件

以前在linux下传输文件,特别一些大文件以及很多小文件,tar+nc的传输方式。 

实际上很简单: 

在A机器上执行: 
tar -cvzf - /data/orcl/users01.dbf | nc -l 55555 

在B机器上执行: 
nc A_IP 55555 | tar xvzf - -C /tmp 

--注意:-czf 后面有一个-,我曾经忘记写,导致1个文件破坏(切记!!!)。这样解压在B机器的/tmp目录。 
--也可以使用j参数替换z,这样解压缩采用bzip2. 
--另外注意端口不要冲突(也就是没有别的应用软件不使用该端口)。 

在A机器上执行: 
tar -cvjf - /data/orcl.0000/users01.dbf | nc -l 55555 

在B机器上执行: 
nc A_IP 55555 | tar xvjf - -C /tmp 

-- tar也可以指定别的压缩程序(有一些新版本还支持lzop压缩,我的测试centos 6.2) 
-- -I, --use-compress-program=PROG 
-- 使用lzop可以直接使用参数--lzop(好像一些版本没有这个参数) 

-- 另外注意一点gzip等压缩工具,都是单线程的。如果压缩并行,可以提高效率,找到pigz可以实现。 
-- 我下载的rpm包。 http://pkgs.repoforge.org/pigz/ 

tar -cvf - /tmp/data/orcl_20121108.bak/users01.dbf | pv -s `du -sb /tmp/data/orcl_20121108.bak/users01.dbf | awk '{s += $1} END {print s}'` | pigz   |nc -l 55555 
解压: 
nc A_IP 55555 | tar xvf - -C /tmp -I pigz 

--为了获得良好的显示效果以及测试相关数据,必须安装pv软件包。执行如下: 
tar -cvf - /tmp/data/orcl_20121108.bak/users01.dbf | pv -s `du -sb /tmp/data/orcl_20121108.bak/users01.dbf | awk '{s += $1} END {print s}'` | gzip   |nc -l 55555 
tar -cvf - /tmp/data/orcl_20121108.bak/users01.dbf | pv -s `du -sb /tmp/data/orcl_20121108.bak/users01.dbf | awk '{s += $1} END {print s}'` | bzip2  |nc -l 55555 
tar -cvf - /tmp/data/orcl_20121108.bak/users01.dbf | pv -s `du -sb /tmp/data/orcl_20121108.bak/users01.dbf | awk '{s += $1} END {print s}'` | lzop   |nc -l 55555 
tar -cvf - /tmp/data/orcl_20121108.bak/users01.dbf | pv -s `du -sb /tmp/data/orcl_20121108.bak/users01.dbf | awk '{s += $1} END {print s}'` | pigz   |nc -l 55555 

--我的测试结果:[不是太精确,我仅仅做2次每种压缩方式] 
gzip   1.43GB 0:00:44 [32.6MB/s] 
bzip2  1.43GB 0:02:52 [8.47MB/s] 
lzop   1.43GB 0:00:25 [57.1MB/s] 
pigz   1.43GB 0:00:10 [ 142MB/s] 

-- 很明显bzip2很慢,而pigz最好[注意:也许服务器其他应用会受很大影响],我自己一直以为lzop感觉不明显,实际上效果也不错。 

--这样传输文件还有一个缺点,要在两个机器上执行相关命令,参考: 
http://intermediatesql.com/wp-content/uploads/2012/05/ncp.txt 
http://intermediatesql.com/linux/scrap-the-scp-how-to-copy-data-fast-using-pigz-and-nc/ 

#! /bin/bash 

FILE_FULL=$1 
REMOTE_HOST=$2 

FILE_DIR=$(dirname $FILE_FULL) 
FILE_NAME=$(basename $FILE_FULL) 
LOCALHOST=$(hostname) 

ZIP_TOOL=pigz 
NC_PORT=8888 

tar -cf - -C $FILE_DIR $FILE_NAME | pv -s `du -sb $FILE_FULL | awk '{s += $1} END {printf "%d", s}'` | $ZIP_TOOL | nc -l $NC_PORT & 
ssh $REMOTE_HOST "nc $LOCALHOST $NC_PORT | $ZIP_TOOL -d | tar xf - -C $FILE_DIR" 

--写这样一个shell脚本,命名ncp! ,执行如下: 
ncp! /tmp/data/orcl_20121108.bak/users01.dbf remote_host 
-- 注意一点:脚本使用覆盖方式,远端的文件[相同路径的文件将会覆盖,并且这个目录要存在,不然会报错]将会覆盖!使用要注意这点。 
-- 而且我做了一些修改.而且主机名必须存在/etc/hosts文件中,总之写的不是太严谨,谨慎使用! 
-- 如果有错,可能要杀一些后台进程。 

我做一点小修改: 

#! /bin/bash 

FILE_FULL=$1 
REMOTE_HOST=$2 

FILE_DIR=$(dirname $FILE_FULL) 
FILE_NAME=$(basename $FILE_FULL) 
LOCALHOST=$(hostname) 

ZIP_TOOL=pigz 
NC_PORT=55555 

tar -cf - -C $FILE_DIR $FILE_NAME | pv -s `du -sb $FILE_FULL | awk '{s += $1} END {printf "%d", s}'` | $ZIP_TOOL | nc -l $NC_PORT & 
ssh $REMOTE_HOST "mkdir -p $FILE_DIR; [-e $FILE_FULL ] || nc $LOCALHOST $NC_PORT | $ZIP_TOOL -d | tar xvf - -C $FILE_DIR"

posted on 2020-05-23 23:47  aixer95  阅读(353)  评论(0编辑  收藏  举报