本文目录导读:

- 📚 目录导读
- 为什么需要自动化获取网络共享?
- 核心概念:理解网络共享与脚本获取原理
- 方法一:Windows环境下用PowerShell脚本获取
- 方法二:Linux/macOS环境下用Bash脚本获取
- 方法三:跨平台Python脚本方案
- 常见问题与问答(Q&A)
- 进阶:将脚本整合到自动化运维中
如何用脚本获取当前网络共享信息?从命令行到自动化的完整指南
📚 目录导读
- 为什么需要自动化获取网络共享?
- 核心概念:理解网络共享与脚本获取原理
- Windows环境下用PowerShell脚本获取
- Linux/macOS环境下用Bash脚本获取
- 跨平台Python脚本方案
- 常见问题与问答(Q&A)
- 进阶:将脚本整合到自动化运维中
为什么需要自动化获取网络共享?
在日常运维、开发调试或家庭网络管理中,我们经常需要快速查看当前计算机已连接或可访问的网络共享资源。
- 检查是否有未授权的共享文件夹暴露在局域网
- 自动化备份脚本需要确认远程共享路径是否可达
- 多设备环境下的网络资源排查
手动通过“网络邻居”或“smbclient -L”查看虽然可行,但效率低且无法集成到脚本化工作流中。用脚本获取当前网络共享,可以让你在几秒内获得结构化数据,并进一步实现监控、报警或自动化挂载。
核心概念:理解网络共享与脚本获取原理
网络共享,通常指通过SMB/CIFS协议(Windows文件共享)或NFS(Linux/Unix)暴露的目录资源,脚本获取共享的核心思路是:
- 调用系统原生命令(如
net view、smbclient、showmount) - 解析命令输出,提取共享名称、路径、状态等信息
- 输出为结构化格式(JSON、CSV、纯文本)
为什么不用GUI? 因为脚本可以:
- 实现定时监控
- 对接日志系统
- 批量检查数百台机器
方法一:Windows环境下用PowerShell脚本获取
📝 完整脚本示例
# get-networkshares.ps1
# 用途:获取当前Windows系统上的已连接网络共享
Write-Host "正在查询本机已建立的网络连接..." -ForegroundColor Cyan
# 方法1:通过 net use 获取已映射的驱动器
$netUseResult = net use 2>&1
Write-Host "=== 已映射的网络驱动器 ===" -ForegroundColor Green
$netUseResult | ForEach-Object { Write-Host $_ }
# 方法2:通过 Get-SmbConnection 获取SMB会话(需Windows 10/Server 2012+)
$smbConnections = Get-SmbConnection -ErrorAction SilentlyContinue
if ($smbConnections) {
Write-Host "`n=== 当前SMB连接详情 ===" -ForegroundColor Green
$smbConnections | Format-Table -AutoSize
} else {
Write-Host "`n[信息] 未发现活跃SMB连接。"
}
# 方法3:获取本机共享出的文件夹
Write-Host "`n=== 本机已共享的文件夹 ===" -ForegroundColor Green
Get-SmbShare | Format-Table Name, Path, Description -AutoSize
输出示例:
正在查询本机已建立的网络连接...
=== 已映射的网络驱动器 ===
状态 本地 远程 网络
OK Z: \\192.168.1.100\Backup Microsoft Windows Network
=== 当前SMB连接详情 ===
ServerName ShareName UserName Credentials
----------- --------- -------- -----------
192.168.1.100 Backup WORKGROUP\admin Password
=== 本机已共享的文件夹 ===
Name Path Description
---- ---- -----------
Documents C:\Users\Public Public Documents
🔧 常见命令对比
| 命令 | 用途 | 适用版本 |
|---|---|---|
net use |
映射驱动器 | 所有Windows |
Get-SmbConnection |
SMB会话详情 | Win8/2012+ |
Get-SmbShare |
本机共享列表 | Win8/2012+ |
方法二:Linux/macOS环境下用Bash脚本获取
📝 完整脚本示例
#!/bin/bash
# get-shares.sh
# 用途:查看当前Linux/macOS设备可访问的网络共享
echo "=== Linux/macOS 网络共享检测脚本 ==="
# 1. 检查是否安装smbclient
if ! command -v smbclient &> /dev/null; then
echo "[警告] 未安装 smbclient,请先运行:sudo apt install smbclient (或 brew install smbclient)"
exit 1
fi
# 2. 提示输入远程服务器IP
read -p "请输入要查询的远程服务器IP或主机名: " server_ip
# 3. 匿名枚举共享(也可改为带认证)
echo "正在枚举 $server_ip 的共享资源..."
smbclient -L //$server_ip -N 2>&1
# 4. (可选) 查看本机挂载的NFS共享
echo ""
echo "=== 本机已挂载的NFS共享 ==="
mount | grep nfs || echo "未发现NFS挂载点"
# 5. macOS专用:显示已连接的SMB共享
if [[ "$OSTYPE" == "darwin"* ]]; then
echo ""
echo "=== macOS Finder中显示的共享 ==="
df -H | grep '/Volumes/' | awk '{print $1, $NF}'
fi
运行效果
请输入要查询的远程服务器IP或主机名: 192.168.1.100
正在枚举 192.168.1.100 的共享资源...
Sharename Type Comment
--------- ---- -------
Backup Disk Weekly backup
Public Disk
IPC$ IPC IPC Service
=== 本机已挂载的NFS共享 ===
192.168.1.50:/data on /mnt/data (nfs, rw, relatime)
方法三:跨平台Python脚本方案
如果你需要在Windows、Linux、macOS上运行同一份脚本,Python 是最佳选择。
📝 完整脚本(python获取当前共享)
#!/usr/bin/env python3
# get_shares.py
# 跨平台获取网络共享信息
import subprocess
import platform
import json
def get_smb_shares_windows():
"""Windows下通过PowerShell获取共享"""
try:
cmd = ['powershell', '-Command', 'Get-SmbConnection | ConvertTo-Json']
result = subprocess.run(cmd, capture_output=True, text=True, check=True)
if result.stdout.strip():
return json.loads(result.stdout)
except:
pass
return []
def get_smb_shares_linux(server):
"""Linux下通过smbclient获取共享"""
try:
cmd = ['smbclient', '-L', f'//{server}', '-N']
result = subprocess.run(cmd, capture_output=True, text=True, timeout=5)
lines = result.stdout.split('\n')
shares = [line.split()[0] for line in lines if line.startswith('\t') and not line.startswith('\tSharename')]
return shares
except:
return []
def main():
system = platform.system()
print(f"当前系统: {system}")
if system == 'Windows':
print("正在检测Windows网络共享...")
connections = get_smb_shares_windows()
if connections:
print(f"发现 {len(connections)} 个活跃SMB连接:")
for conn in connections:
print(f" 服务器: {conn.get('ServerName')} 共享: {conn.get('ShareName')}")
else:
print("未发现活跃SMB连接或需要管理员权限。")
elif system == 'Linux':
server = input("请输入SMB服务器地址: ")
shares = get_smb_shares_linux(server)
print(f"从 {server} 获取到共享: {shares}")
else:
print("macOS下请使用 smbutil view 命令。")
if __name__ == "__main__":
main()
为什么选择Python?
- 可解析命令输出为JSON/字典
- 易于异常处理(超时、权限不足)
- 可直接对接监控平台(如Prometheus exporter)
常见问题与问答(Q&A)
❓ Q1:脚本执行时提示“拒绝访问”怎么办?
A: 大部分网络共享查询需要管理员/root权限,在Windows下以管理员身份运行PowerShell;Linux/macOS加 sudo,如果是远程枚举共享,确保SMB端口(445)未被防火墙阻挡。
❓ Q2:为什么 Get-SmbConnection 返回空?
A: 该命令仅显示通过Windows SMB客户端建立的连接,如果共享是通过其他方式(如直接IP访问)挂载,可能由 net use 显示,需同时检查两种方式。
❓ Q3:如何用脚本检测内网所有设备的共享?
A: 可结合 nmap 扫描445端口,再对每个IP调用上述脚本,注意:大规模扫描可能被网络设备视为攻击行为,务必在可控网络内进行。
❓ Q4:macOS如何用终端获取当前挂载的网络共享?
A: 使用 smbutil view //serverIP 查看可用的共享,用 df -H | grep /Volumes 查看已挂载的卷,也可参考上面的Bash脚本。
❓ Q5:脚本输出的共享列表中有乱码?
A: 通常是因为远程共享使用非ASCII字符,或编码问题,可以在PowerShell中指定 [System.Text.Encoding]::UTF8;Linux下设置环境变量 LANG=en_US.UTF-8。
进阶:将脚本整合到自动化运维中
获取共享信息只是第一步,请看以下实际应用场景:
场景1:共享可用性监控
# 每小时检查一次共享是否在线
$share = "\\192.168.1.100\Backup"
if (Test-Path $share) {
Write-EventLog -LogName Application -Source "ShareMonitor" -EntryType Information -EventId 100 -Message "共享 $share 可用"
} else {
Write-EventLog -LogName Application -Source "ShareMonitor" -EntryType Error -EventId 200 -Message "共享 $share 不可达!"
}
场景2:将共享列表导出为CSV
# 导出所有smb共享到文件
smbclient -L //192.168.1.100 -N | grep -E '^\t' | awk '{print $1}' > shares_backup_$(date +%Y%m%d).csv
场景3:集成到Docker/容器环境
使用Python脚本定期检查共享,并通过HTTP接口暴露状态,配合Prometheus抓取数据。
通过本文,你学会了三种用脚本获取当前网络共享的方法:
| 方法 | 优势 | 适用场景 |
|---|---|---|
| PowerShell脚本 | 原生支持Windows,命令丰富 | 企业Windows运维 |
| Bash脚本 | 轻量、直接调用系统命令 | Linux/macOS管理员 |
| Python脚本 | 跨平台、可定制、易集成 | 开发、DevOps、容器化环境 |
核心口诀:
- Windows看
net use+Get-SmbConnection - Linux用
smbclient -L - 跨平台就用Python包装命令
打开你的终端,动手写一个属于你自己的网络共享检测脚本吧!如果你有特殊的网络环境(如需要Kerberos认证、不同SMB协议版本),可以在原有脚本基础上增加认证参数或错误重试逻辑。
最后提醒:在实战环境中,请务必遵守网络安全规范,不要对未授权的系统进行共享扫描。