59. 使用python在局域网高速共享文件

安装python

要使用python,前提是你得先在电脑上安装了python,可以去它的官网下载

命令行/shell

打开shell或cmd或powershell,使用python命令启动http.server模块。但是要注意,它分享的是一个文件夹里的所有文件,所以你要指定分享哪个文件夹,所以我们需要用cd命令进入到待分享的文件夹里再启动http服务,另外,不要出现敏感文件啊,隐私暴露了可不好

举个栗子,我们要分享桌面的“分享文件”这个文件夹里的所有文件

首先进入到该文件夹

1
cd Desktop\分享文件

当然你也可以先进入待分享的文件夹,然后右键,在此处打开powershell窗口,这样就可以省略cd步骤

然后启动http服务

1
python -m http.server 端口号 

端口号是一个整型数字,可以不写,默认是8000

它提示成功之后我们就可以在浏览器根据你的ip端口进行访问了,此处ip是局域网ip,可以通过在cmd输入ipconfig查看你本机局域网ip

如果想结束共享,按一下ctrl+c结束程序或者直接关掉该窗口即可

代码封装

上面的步骤是先进入你要分享的文件夹然后再运行http服务,而且还需要手动查看本机ip,我们完全可以写一个代码,把这些步骤全部整合在一起,把py文件的默认打开方式改为python,即把封装好的脚本复制到你要分享的文件夹,然后双击运行即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import contextlib
import os
import socket
import sys
import argparse
import traceback
from functools import partial
from http.server import BaseHTTPRequestHandler, CGIHTTPRequestHandler, SimpleHTTPRequestHandler, ThreadingHTTPServer


def _get_best_family(*address):
infos = socket.getaddrinfo(
*address,
type=socket.SOCK_STREAM,
flags=socket.AI_PASSIVE,
)
family, type, proto, canonname, sockaddr = next(iter(infos))
return family, sockaddr


def test(HandlerClass=BaseHTTPRequestHandler,
ServerClass=ThreadingHTTPServer,
protocol="HTTP/1.0", port=8000, bind=None):
"""Test the HTTP request handler class.

This runs an HTTP server on port 8000 (or the port argument).

"""
ServerClass.address_family, addr = _get_best_family(bind, port)

HandlerClass.protocol_version = protocol
with ServerClass(addr, HandlerClass) as httpd:
host, port = httpd.socket.getsockname()[:2]
url_host = f'[{host}]' if ':' in host else host
print(
f"Serving HTTP on {host} port {port} "
f"(http://{url_host}:{port}/) ..."
)
try:
httpd.serve_forever()
except KeyboardInterrupt:
print("\nKeyboard interrupt received, exiting.")
sys.exit(0)


def runserver(port=8000):
parser = argparse.ArgumentParser()
parser.add_argument('--cgi', action='store_true',
help='Run as CGI Server')
parser.add_argument('--bind', '-b', metavar='ADDRESS',
help='Specify alternate bind address '
'[default: all interfaces]')
parser.add_argument('--directory', '-d', default=os.getcwd(),
help='Specify alternative directory '
'[default:current directory]')
parser.add_argument('port', action='store',
default=port, type=int,
nargs='?',
help='Specify alternate port [default: 8000]')
args = parser.parse_args()
if args.cgi:
handler_class = CGIHTTPRequestHandler
else:
handler_class = partial(SimpleHTTPRequestHandler, directory=args.directory)

# ensure dual-stack is not disabled; ref #38907
class DualStackServer(ThreadingHTTPServer):
def server_bind(self):
# suppress exception when protocol is IPv4
with contextlib.suppress(Exception):
self.socket.setsockopt(
socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 0)
return super().server_bind()

test(
HandlerClass=handler_class,
ServerClass=DualStackServer,
port=args.port,
bind=args.bind,
)


def get_host_ip():
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
try:
s.connect(('8.8.8.8', 80))
ip = s.getsockname()[0]
finally:
s.close()
return ip


if __name__ == '__main__':
print("""
使用说明:
1.请确保该路径以及子路径没有 --敏感文件--
2.仅限局域网访问(比如大家都连接同一个路由器)
3.共享路径是运行该程序的文件夹,局域网内所有人都能访问和下载文件
""")
print("共享路径: {}".format(os.getcwd()))
# 默认端口是8000,在浏览器默认访问80端口
port = 80
try:
ip = get_host_ip()
print("启动程序成功")
print("请在浏览器访问URL:{}".format(ip))
runserver(port)
except Exception as e:
print("启动程序失败:{}".format(traceback.format_exc()))

代码比较简单,相信学过我的教程的同学应该都能看得懂的。如果真的看不懂,那就直接复制我的代码,然后粘贴保存成一个.py结尾的文件,把这个py文件复制到你要分享的文件夹,双击运行即可

最后再强调一遍,被共享的文件夹在局域网内所有人都能查看和下载,一定不要存在隐私信息