标题: 怎样用bash做个tcp客户端 [打印本页] 作者: pulbieup 时间: 2020-3-19 10:02 标题: 怎样用bash做个tcp客户端 8 m8 T# x, {) w2 H9 j7 y
日常做后台服务开发,总免不了要写测试客户端。但是tcp客户端写起来其实还是比较罗嗦的,各种错误返回,各种异常判断。。。。而我们通常并不是要写一个健壮的客户端,我们只是要一个能用的客户端来测试服务端是否正确。% T! H4 l" {6 {
这里给大家介绍一个简单易用的方法:用bash操作socket!很酷,是不是?! l# @2 u" M: y) f" `9 c
9 O, w- ?0 H1 R# o" l9 S: ?3 W/ q
" T% ]" e+ U/ i+ \7 l1 Q' z
man bash,查找tcp关键字,可以看到这么一段内容: 8 D' `" Q' D5 _5 q) Z7 n1 /dev/tcp/host/port( S. S1 ^! Z4 `, f/ S3 N
2 If host is a valid hostname or Internet address, and port is an integer port number or service name, bash attempts to open a TCP connection to the corresponding socket., v- H8 L$ B. ]3 e& Q1 W
& Z1 t$ h+ @0 e+ S 把其中的host和port换成我们要连接的IP和端口,就可以用来建立tcp连接了。如下: * `0 g1 E7 T x i 5 J) x) S( X0 `/ k. k1 exec 3<>/dev/tcp/10.6.221.149/9865# V; n O! |5 E! j
2 Z( t5 x7 i$ f2 \3 G
0 t8 H% k v3 x2 R$ y n 上面就建立了一个到10.6.221.149:9865的可读可写的socket连接。 1 k( e) l2 m( l P3 N 其中3就是指定的连接后的socket fd,由于0、1、2分别被stdin、stdout、stderr占用,所以可用fd最小从3开始。& l! ]: t- F7 D5 Q% \$ b- t
ip换成域名其实也是支持的,比如 ( H( n, @, `8 Y. Y( Z. {9 `4 N, k% I
1 exec 3<>/dev/tcp/www.xx.com/9865 注意"<>"前后不要空格,否则会出错。 # |, X' I' Q4 r0 h+ \# | & }6 D. `) n% z4 J. B: i 发送请求其实很简单,就跟往文件里写数据一样。例如 + S7 h2 Z6 i: k! m9 o7 k " j! e+ P1 Y' ], R! b) j, ?1 exec "hello world." >&3 5 u1 ~# j5 v" C 3 y$ J* r$ P6 j/ j7 z: K6 x* q5 Z, d- _2 S2 k
如果要发HTTP请求,那可以这样: + ]# |3 i7 H0 C" G2 Z" v ( ]8 [" p/ {- R1 echo -e "GET /crossdomain.xml HTTP/1.1\r\nHost:www.xx.com\r\n\r\n" >&3, f7 t( C) o; n' y+ z0 L& x
, r& p0 v7 Q- G/ n/ M$ g" |) z2 j% m) o$ a! Y1 c! A
二进制请求可以这样发:0 ^% [4 ~1 F' g( _, w6 S