用脚本实现局域网文件共享

wen 实用脚本 3

本文目录导读:

用脚本实现局域网文件共享

  1. Python HTTP服务器(最简单)
  2. Windows内置SMB共享脚本
  3. 跨平台Python GUI工具
  4. Linux快速脚本
  5. 使用Python发送文件的简易工具
  6. 使用说明

Python HTTP服务器(最简单)

Windows/Linux/macOS通用

# file_share.py
import http.server
import socketserver
import os
import sys
def start_share(port=8000, directory=None):
    if directory:
        os.chdir(directory)
    handler = http.server.SimpleHTTPRequestHandler
    with socketserver.TCPServer(("", port), handler) as httpd:
        print(f"文件共享服务器已启动")
        print(f"局域网访问地址: http://{get_local_ip()}:{port}")
        print(f"按 Ctrl+C 停止服务")
        httpd.serve_forever()
def get_local_ip():
    import socket
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    try:
        s.connect(('10.255.255.255', 1))
        ip = s.getsockname()[0]
    except Exception:
        ip = '127.0.0.1'
    finally:
        s.close()
    return ip
if __name__ == "__main__":
    start_share()

运行方式:

# 共享当前目录
python file_share.py
# 共享指定目录
python file_share.py --directory /path/to/share --port 8000

Windows内置SMB共享脚本

PowerShell脚本

# setup-smb-share.ps1
param(
    [string]$SharePath,
    [string]$ShareName = "SharedFolder",
    [string]$Description = "局域网共享文件夹"
)
# 以管理员运行
if (-NOT ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
{
    Write-Host "请以管理员身份运行此脚本" -ForegroundColor Red
    pause
    exit 1
}
# 创建共享文件夹
if (-not (Test-Path $SharePath)) {
    New-Item -ItemType Directory -Path $SharePath -Force
    Write-Host "创建文件夹: $SharePath" -ForegroundColor Green
}
# 设置Everyone权限
$acl = Get-Acl $SharePath
$permission = "Everyone","FullControl","ContainerInherit,ObjectInherit","None","Allow"
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule $permission
$acl.SetAccessRule($accessRule)
Set-Acl $SharePath $acl
# 创建SMB共享
New-SmbShare -Name $ShareName -Path $SharePath -Description $Description -FullAccess Everyone
# 获取本机IP
$ip = (Get-NetIPAddress -AddressFamily IPv4 | Where-Object {$_.InterfaceAlias -like "*Ethernet*" -or $_.InterfaceAlias -like "*Wi-Fi*"}).IPAddress
Write-Host "`nSMB共享已创建!" -ForegroundColor Green
Write-Host "共享路径: \\$ip\$ShareName" -ForegroundColor Yellow
Write-Host "本地路径: $SharePath" -ForegroundColor Cyan

使用方法:

# 以管理员运行
.\setup-smb-share.ps1 -SharePath "C:\SharedFolder" -ShareName "MyShare"

跨平台Python GUI工具

# lan_file_share.py
import tkinter as tk
from tkinter import filedialog, messagebox
import http.server
import socketserver
import threading
import socket
import os
class FileShareApp:
    def __init__(self, root):
        self.root = root
        self.root.title("局域网文件共享工具")
        self.root.geometry("400x300")
        self.share_folder = tk.StringVar()
        self.port = tk.StringVar(value="8000")
        self.server = None
        self.create_widgets()
    def create_widgets(self):
        # 选择文件夹
        tk.Label(self.root, text="选择共享文件夹:").pack(pady=5)
        frame1 = tk.Frame(self.root)
        frame1.pack(pady=5)
        tk.Entry(frame1, textvariable=self.share_folder, width=30).pack(side=tk.LEFT, padx=5)
        tk.Button(frame1, text="浏览", command=self.browse_folder).pack(side=tk.LEFT)
        # 端口设置
        tk.Label(self.root, text="端口号:").pack(pady=5)
        tk.Entry(self.root, textvariable=self.port, width=10).pack()
        # 控制按钮
        self.start_btn = tk.Button(self.root, text="启动共享", command=self.toggle_share, 
                                  bg="green", fg="white", width=20)
        self.start_btn.pack(pady=20)
        # 状态显示
        self.status_label = tk.Label(self.root, text="状态: 未启动", fg="red")
        self.status_label.pack(pady=10)
        # IP地址显示
        self.ip_label = tk.Label(self.root, text=f"本机IP: {self.get_local_ip()}")
        self.ip_label.pack(pady=5)
    def browse_folder(self):
        folder = filedialog.askdirectory()
        if folder:
            self.share_folder.set(folder)
    def get_local_ip(self):
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        try:
            s.connect(('10.255.255.255', 1))
            ip = s.getsockname()[0]
        except:
            ip = '127.0.0.1'
        finally:
            s.close()
        return ip
    def toggle_share(self):
        if self.server is None:
            self.start_share()
        else:
            self.stop_share()
    def start_share(self):
        folder = self.share_folder.get()
        if not folder:
            messagebox.showerror("错误", "请选择共享文件夹")
            return
        try:
            port = int(self.port.get())
        except:
            messagebox.showerror("错误", "端口号必须是数字")
            return
        if not os.path.exists(folder):
            messagebox.showerror("错误", "文件夹不存在")
            return
        # 在新线程中启动服务器
        def run_server():
            os.chdir(folder)
            handler = http.server.SimpleHTTPRequestHandler
            self.server = socketserver.TCPServer(("", port), handler)
            self.server.serve_forever()
        self.server_thread = threading.Thread(target=run_server, daemon=True)
        self.server_thread.start()
        self.start_btn.config(text="停止共享", bg="red")
        self.status_label.config(text=f"状态: 运行中 - http://{self.get_local_ip()}:{port}", fg="green")
    def stop_share(self):
        if self.server:
            self.server.shutdown()
            self.server.server_close()
            self.server = None
            self.start_btn.config(text="启动共享", bg="green")
            self.status_label.config(text="状态: 已停止", fg="red")
if __name__ == "__main__":
    root = tk.Tk()
    app = FileShareApp(root)
    root.mainloop()

Linux快速脚本

#!/bin/bash
# fast-share.sh
# 检查参数
if [ $# -lt 1 ]; then
    echo "用法: ./fast-share.sh <共享目录> [端口号]"
    echo "示例: ./fast-share.sh /home/user/share 8080"
    exit 1
fi
SHARE_DIR="$1"
PORT="${2:-8000}"
# 检查目录
if [ ! -d "$SHARE_DIR" ]; then
    echo "错误: 目录 $SHARE_DIR 不存在"
    exit 1
fi
# 获取本机IP
IP=$(hostname -I | awk '{print $1}')
# 启动Python HTTP服务器
echo "========================================="
echo " 局域网文件共享已启动"
echo " 共享目录: $SHARE_DIR"
echo " 访问地址: http://$IP:$PORT"
echo " 按 Ctrl+C 停止共享"
echo "========================================="
cd "$SHARE_DIR"
python3 -m http.server $PORT --bind 0.0.0.0

使用Python发送文件的简易工具

# send_file.py
import socket
import os
import threading
def send_file(file_path, host='0.0.0.0', port=9999):
    """发送文件到局域网"""
    def handle_client(conn, addr):
        print(f"客户端连接: {addr}")
        try:
            file_size = os.path.getsize(file_path)
            file_name = os.path.basename(file_path)
            # 发送文件名和文件大小
            conn.send(f"{file_name}:{file_size}".encode())
            # 等待确认
            conn.recv(1024)
            # 发送文件内容
            with open(file_path, 'rb') as f:
                while True:
                    data = f.read(4096)
                    if not data:
                        break
                    conn.send(data)
            print(f"文件 {file_name} 发送完成")
        except Exception as e:
            print(f"发送错误: {e}")
        finally:
            conn.close()
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.bind((host, port))
    server.listen(5)
    print(f"文件服务器启动在 {host}:{port}")
    print("等待客户端连接...")
    while True:
        conn, addr = server.accept()
        thread = threading.Thread(target=handle_client, args=(conn, addr))
        thread.start()
def receive_file(save_dir='.', host='localhost', port=9999):
    """接收文件"""
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect((host, port))
    # 接收文件名和大小
    data = client.recv(1024).decode()
    file_name, file_size = data.split(':')
    file_size = int(file_size)
    # 发送确认
    client.send(b'OK')
    # 接收文件
    save_path = os.path.join(save_dir, file_name)
    received = 0
    with open(save_path, 'wb') as f:
        while received < file_size:
            data = client.recv(4096)
            if not data:
                break
            f.write(data)
            received += len(data)
    print(f"文件 {file_name} 接收完成")
    client.close()
if __name__ == "__main__":
    import sys
    if len(sys.argv) < 2:
        print("用法:")
        print("  发送: python send_file.py send <文件路径>")
        print("  接收: python send_file.py receive <保存目录>")
        sys.exit(1)
    if sys.argv[1] == "send":
        send_file(sys.argv[2])
    elif sys.argv[1] == "receive":
        save_dir = sys.argv[2] if len(sys.argv) > 2 else "."
        receive_file(save_dir)

使用说明

  1. 最简方案:使用Python HTTP服务器,无需安装额外软件
  2. Windows专用:使用PowerShell SMB共享,性能更好
  3. 图形界面:适合不熟悉命令行的用户
  4. 快速传输:使用socket直接传输文件

根据您的需求选择合适的方案即可,最推荐使用Python HTTP服务器方案,因为它简单、跨平台、无需额外软件。

抱歉,评论功能暂时关闭!