我编写了这个脚本来使用 netcat 发送文件。我的目的是从源服务器打开目标服务器中的 netcat 端口,这样我只需一个脚本就可以完成所有操作,而不必在目标服务器上和源服务器上各运行一个脚本。
#!/bin/bash
FILE=$1
SERVDEST=$2
SIZE=`du -h --apparent-size $FILE | cut -f1`
DATE=`date +%Y%m%d%H%M`
echo "Sending file $FILE of $SIZE to $SERVDEST" >> NCtransf_$DATE.log
echo "" >> NCtransf_$DATE.log
ssh $SERVDEST "nc -l 6969 > /backup/backupSO/nc_$FILE.tgz" &
#sleep 5 #tried sleeping for some secs but it didn't work either
(/usr/bin/time --format='Transfer took %e seconds' tar czf - $FILE | nc $SERVDEST 6969) &>> NCtransf_$DATE.log
echo "" >> NCtransf_$DATE.log
由于某种原因,文件在目标中创建,但其大小为 0。信息从未通过,并且 netcat 端口在另一端保持打开状态。我也尝试ssh $SERVDEST "nc -l 6969 > /backup/backupSO/nc_$FILE.tgz" &
为此更改此行ssh $SERVDEST "nohup nc -l 6969 > /backup/backupSO/nc_$FILE.tgz" &
,但结果相同。
如果我尝试将相同的线路分开(在目的地手动打开端口),它就会像魔法一样工作。仅供参考,我有无密码的 ssh 连接,并且端口在防火墙中打开。
答案1
你所做的都是无用的。
你应该使用SCP。
它基本上是通过 ssh 发送文件的命令。
例子:
FILE=$1
SERVDEST=$2
SIZE=`du -h --apparent-size $FILE | cut -f1`
DATE=`date +%Y%m%d%H%M`
tar czv /tmp/tmpfile.tar.gz $FILE
scp $FILE $SERVDEST:/backup/backupSO/nc_$FILE.tgz
rm /tmp/tmpfile.tar.gz
答案2
这是另一个更好的答案,它是性能和安全性之间的一个很好的折衷。
请随意测试一下。
FILE=$1
SERVDEST=$2
SIZE=`du -h --apparent-size $FILE | cut -f1`
DATE=`date +%Y%m%d%H%M`
tar czv - $FILE | ssh $SERVDEST "cat - > /backup/backupSO/nc_$FILE.tgz"
为了获得更高的性能,您可以设置CompressionLevel
(使用-o
)并使用不同的Cipher
;如果您不关心 NSA 的话。;)