背景:
最近在使用nc进行远程文件传输的时候发现在文件传输完成时,没有正确的反馈,而是界面一直停留在传输阶段,加上使用nc传输需要设置一些诸如-l、 -p等参数,于是想将这些参数包裹在sh脚本中,一键执行脚本,方便快捷,具体如下:
一、本地端:
#!/bin/bash
# 初始化ip地址变量为空
ip_address=""
file_name=""
# 使用getopts处理-p和-f选项
while getopts p:f: option
do
case "${option}"
in
p) ip_address=${OPTARG};;
f) file_name=${OPTARG};;
esac
done
{ cat "$file_name"; printf '\nEOF\n'; } | nc "$ip_address" 12345
二、远程端:
file_name=" "
# 使用getopts处理-p和-f选项
while getopts f: option
do
case "${option}"
in
f) file_name=${OPTARG};;
esac
done
nc -l -p 12345 | while IFS= read -r line
do
if [[ "$line" == *EOF* ]]; then
pkill nc
else
echo "$line" >> $file_name
fi
done
echo "file pass successfully!"
三、执行
1. 先远程端:sh receive.sh -f {文件名称}
2. 后本地端:sh server_send.sh -p {远程ip} -f {文件名称}
四、更新
上述的脚本在传输二进制文件的时候,由于cat指令会造成二进制文件的修改,因此在传输二进制文件的时候可能会出现文件传输不完整的情况,因此将脚本文件修改如下:
一、本地端:
```powershell
#!/bin/bash
# 初始化ip地址变量为空
ip_address=""
file_name=""
# 使用getopts处理-p和-f选项
while getopts p:f: option
do
case "${option}"
in
p) ip_address=${OPTARG};;
f) file_name=${OPTARG};;
esac
done
# 使用nc命令传输文件
cat "$file_name" | nc -q 1 "$ip_address" 12345
二、远程端:
file_name=" "
# 使用getopts处理-p和-f选项
while getopts f: option
do
case "${option}"
in
f) file_name=${OPTARG};;
esac
done
nc -l -p 12345 > $file_name
echo "file pass successfully!"
剩余的按照第三步执行脚本就可以了,祝好