首页 > 代码库 > 一种基于二维码的半自动文件拷贝方法
一种基于二维码的半自动文件拷贝方法
在一种受限的环境中,要把文件拷贝出去显然是不可能的。因为既不能进行直接的文本拷贝(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的实现步骤描述如下:
- 在jail中将需要拷贝的文件(jail:/tmp/foo)进行base64编码,设编码后的文件为foo.out,对应的md5字符串为foo.md5
- 在jail中使用Python脚本将foo.out的内容进行逐行扫描,每10行生成一个二维码图片,设生成的图片序列为foo_001.png, foo_002.png, ...
- 在jail中使用eog (GNOME image viewer)逐个打开二维码图片foo_001.png, foo_002.png, ...
- 在oba中使用截图工具将foo_001.png, foo_002.png, ...抓取保存到开放环境dora中去,存为bar_001.png, bar_002.png, ...
- 在dora中使用Python脚本逐个处理二维码图片bar_001.png, bar_002.png, ..., 将对应的文本依次存入文件bar_001.txt, bar_002_.txt, ...
- 在dora中将文本文件bar_001.txt, bar_002.txt, ...合并,设合并后的文件为bar.out
- 在dora中将bar.out进行base64解码,解码后的文件为/tmp/bar,对应的md5字符串为bar.md5
- 人工比对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编码
一种基于二维码的半自动文件拷贝方法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。