1.引子
一个应用的启动脚本在6上正常,但在7上就不正常了,检查后发现是nc在6和7上的使用方式发生了变化,如下是在6上的一段启动脚本
nohup java ... & //1.启动java进程并放到后台
COUNT=0
while [ $COUNT -lt 1 ]; do //2.循环检查标志端口是否起来
echo -e ".\c"
sleep 1
if [ -n "$SERVER_PORT" ]; then
if [ "$SERVER_PROTOCOL" == "dubbo" ]; then
COUNT=`echo status | nc -i 1 127.0.0.1 $SERVER_PORT | grep -c OK` //需要改动的地方
else
COUNT=`netstat -an | grep $SERVER_PORT | wc -l`
fi
else
COUNT=`ps -f | grep java | grep "$DEPLOY_DIR" | awk '{print $2}' | wc -l`
fi
if [ $COUNT -gt 0 ]; then
break
fi
done
echo "OK!"
上一行在7上改为如下
COUNT=`(echo status;sleep 1) | nc 127.0.0.1 $SERVER_PORT 2> /dev/null | grep -c OK`
下面来解释一下:
1. nc的交互
2.首先在6上man nc,参数i其解释为: specifies a delay time interval between lines of text sent and received(指定发送和接收的文本行之间的延迟时间间隔),但是在7上其作用已经发生了变化
直接使用echo status | nc 127.0.0.1 21553
没有任何结果
这样我们明白了,我们通过(echo status;sleep 1) | nc ... 完成了"发送和接收的交互",只发送数据而"不延迟这一次交互的时间"是无法收到结果的
3.为何要在7上增加 2> /dev/null ?:因为在7上如果端口没有被监听是会有错误输出结果的,而在6上没有任何输出,所以将错误输出重定向了
2. nc的使用
因为nc在不同的系统版本上用法是不一样的,所以在具体的使用场景下需要具体对待
参考文档: https://linux.cn/article-9190-1.html
1.端口扫描
$ nc -v -z -w 3 ip_addr port
# 但CentOS7新版的nc命令已取消了-z, 需输入重定向 < /dev/null
# 此方法在旧版本和新版本上都适用
$ nc -v ip_addr port </dev/null
2.客户端/服务端模式
# 在一个控制台,使用nc监听一个指定端口
$ nc -l 1234
# 在第二个控制台(或者第二台机器上),连接到监听的机器和端口上
$ nc 192.168.181.129 1234
端口间就会有个连接了。第二个控制端上面的任何输入都会传送到第一个上面,反之亦然。
在连接被建立之后,nc是不管哪边是服务端哪边是客户端的。使用EOF(‘^D’)可以中断连接。
3.传输文件和目录
3.1 将文件传到服务器监听的端口上
使用nc监听一个端口,捕捉到的输出重定向到一个文件中
$ nc -l 1234 > filename.out
第二台机器,连接到nc进程,导入一个文件数据来传输
$ nc host.example.com 1234 < filename.in
3.2 将文件传到本地服务器监听的端口上
使用nc监听一个端口,并将文件传入
$ nc -l 1234 < file_in
# 新版本的nc通过--send-only 选项指定文件传送完后关闭连接
$ nc -l 1234 --send-only < hh.py
第二台机器,连接到nc进程,指定一个文件名来接收
$ nc ip_addr 1234 > file_out
# 新版本的nc通过--recv-only 选项指定文件接收完后关闭连接
$ nc 192.168.181.129 1234 --recv-only > aaaa
4.与服务交互
有时候手动与服务器交互相比较使用用户接口是比较有用的。在troubleshooting的时候很有帮助。比如,接收web站点的主页时:
$ echo -n "GET / HTTP/1.0\r\n\r\n" | nc host.example.com 80
比如最开始的脚本中的这一行(echo status;sleep 1) | nc 127.0.0.1 $SERVER_PORT就是与服务的交互
5.通过nc创建后门
创建后门的命令为(在6上没找到这个功能):
nc -l 1234 -e /bin/bash
创建后门:
连接已创建后门的服务器:
6.通过nc进行端口转发
略
以上是nc的一些常用用法,还有一些其他用法可自行搜索