首页 > 代码库 > 一种基于二维码的半自动文件拷贝方法

一种基于二维码的半自动文件拷贝方法

在一种受限的环境中,要把文件拷贝出去显然是不可能的。因为既不能进行直接的文本拷贝(Ctrl+C, Ctrl+V),又不能使用scp(因为网络隔离)。那么,真的一点办法都木有了吗?答案是否定的,因为毛主席说过,“卑贱者最聪明,高贵者最愚蠢”。作为一个好琢磨的程序员,因为好奇(“与天斗,其乐无穷;与地斗,其乐无穷;与人斗,其乐无穷。”),所以很快想出了一个解决的办法,那就是利用非常盛行的二维码技术。虽然全自动拷贝不好实现,但半自动拷贝还是非常容易做到的。于是,本文尝试利用base64编码/解码和二维码生成/识别实现一种半自动的文件拷贝方法并给出一个实例。

设受限的环境为jail,运行的OS为CentOS 7; 开放的环境为dora, 运行的OS为Ubuntu14.04LTS。既能访问受限环境jail和又能访问开放环境dora的平台为oba, 运行的OS为Windows 10。 于是,将jail:/tmp/foo拷贝到dora:/tmp/bar的实现步骤描述如下:

  1. 在jail中将需要拷贝的文件(jail:/tmp/foo)进行base64编码,设编码后的文件为foo.out,对应的md5字符串为foo.md5
  2. 在jail中使用Python脚本将foo.out的内容进行逐行扫描,每10行生成一个二维码图片,设生成的图片序列为foo_001.png, foo_002.png, ...
  3. 在jail中使用eog (GNOME image viewer)逐个打开二维码图片foo_001.png, foo_002.png, ...
  4. 在oba中使用截图工具将foo_001.png, foo_002.png, ...抓取保存到开放环境dora中去,存为bar_001.png, bar_002.png, ...
  5. 在dora中使用Python脚本逐个处理二维码图片bar_001.png, bar_002.png, ..., 将对应的文本依次存入文件bar_001.txt, bar_002_.txt, ...
  6. 在dora中将文本文件bar_001.txt, bar_002.txt, ...合并,设合并后的文件为bar.out
  7. 在dora中将bar.out进行base64解码,解码后的文件为/tmp/bar,对应的md5字符串为bar.md5
  8. 人工比对foo.md5和bar.md5, 如完全相同,则拷贝jail:/tmp/foo到dora:/tmp/bar大功告成

1. 生成二维码 (encode.py)

 1 #!/usr/bin/python
 2 
 3 import sys
 4 import qrcode
 5 
 6 def encode_image(s, img_file):
 7     img = qrcode.make(s)
 8     img.save(img_file)
 9 
10 def main(argc, argv):
11     if argc != 3:
12         sys.stderr.write("Usage: %s <string> <image>\n" % argv[0])
13         return 1
14 
15     s = argv[1]
16     img_file = argv[2]
17     encode_image(s, img_file)
18     return 0
19 
20 if __name__ == __main__:
21     argc, argv = len(sys.argv), sys.argv
22     sys.exit(main(argc, argv))

2. 识别二维码 (decode.py)

 1 #!/usr/bin/python
 2 
 3 import sys
 4 import zbar
 5 import Image
 6 
 7 def decode_image(img_file):
 8     scanner = zbar.ImageScanner()
 9     scanner.parse_config(enable)
10     pil = Image.open(img_file).convert(L)
11     width, height = pil.size
12     raw = pil.tostring()
13     image = zbar.Image(width, height, Y800, raw)
14     scanner.scan(image)
15     data = http://www.mamicode.com/""
16     for symbol in image:
17         data += symbol.data
18     return data
19 
20 def main(argc, argv):
21     if argc != 2:
22         sys.stderr.write("Usage: %s <image>\n" % argv[0])
23         return 1
24 
25     img_file = argv[1]
26     s = decode_image(img_file)
27     print s
28     return 0
29 
30 if __name__ == __main__:
31     argc, argv = len(sys.argv), sys.argv
32     sys.exit(main(argc, argv))

3. 实例

3.1 jail中的文件/tmp/foo

技术分享

3.2 对jail:/tmp/foo进行base64编码

技术分享

 

一种基于二维码的半自动文件拷贝方法