1 |
- import{d as B,k as m,e as U,b as j,X as x,Y as C,Z as o,f as t,u as a,a9 as e,E as i,aa as k,a6 as D,_ as z}from"./vue-fae2b924.js";import{s as E}from"./debug-64d86442.js";import{aS as O,aV as w,aG as $,U as S,bq as q,ac as M,br as X,bs as A,bd as G,bt as c,b0 as g,bu as H,aQ as Q,G as h,V as Y}from"./radical-3ee02118.js";import"./index-137e94ff.js";const Z={style:{padding:"24px","max-width":"1400px",margin:"0 auto"}},J={key:1,style:{"margin-bottom":"24px"}},K={style:{"text-align":"center",padding:"20px"}},W={style:{"margin-top":"16px"}},ee={style:{"font-size":"24px","font-weight":"bold",color:"#1890ff"}},le={class:"form-layout"},ae={class:"form-section"},te={class:"help-section"},se=B({name:"TcpdumpCapture"}),oe=B({...se,setup(re){const s=m({interface:"",filter:"",extra_args:"",duration:5,password:""}),n=m(!1),p=m(0),f=m(0),v=m(!1),d=m(""),I=U(()=>f.value===0?0:Math.round((f.value-p.value)/f.value*100)),N=U(()=>{const r=Math.floor(p.value/60),l=p.value%60;return`${r.toString().padStart(2,"0")}:${l.toString().padStart(2,"0")}`});let _=null;const F={duration:[{required:!0,message:"请输入抓包持续时间"},{validator:(r,l)=>l?isNaN(l)||l<=0?Promise.reject("持续时间必须是大于0的数字"):l>300?Promise.reject("持续时间不能超过300秒"):Promise.resolve():Promise.resolve()}]},L=r=>{p.value=r,f.value=r,_=setInterval(()=>{p.value--,p.value<=0&&y()},1e3)},y=()=>{_&&(clearInterval(_),_=null),p.value=0,f.value=0},T=async()=>{try{if(!s.value.duration){d.value="持续时间是必填项";return}const r=s.value.duration;if(isNaN(r)||r<=0){d.value="持续时间必须是大于0的数字";return}if(r>300){d.value="持续时间不能超过300秒";return}d.value="",n.value=!0,v.value=!0,L(r),h.info(`开始抓包,预计 ${r} 秒后完成`);const u=await(await E({interface:s.value.interface.trim(),filter:s.value.filter.trim(),extra_args:s.value.extra_args.trim(),duration:s.value.duration,password:s.value.password.trim()})).blob(),P=window.URL.createObjectURL(u),b=document.createElement("a");b.href=P,b.download="tcpdump.txt",document.body.appendChild(b),b.click(),document.body.removeChild(b),window.URL.revokeObjectURL(P),h.success("抓包完成,文件已下载")}catch(r){console.error("抓包失败:",r),d.value=r instanceof Error?r.message:"抓包失败,请检查网络连接和参数设置",h.error("抓包失败")}finally{n.value=!1,v.value=!1,y()}},V=()=>{n.value=!1,v.value=!1,y(),h.info("已停止抓包")},R=()=>{s.value={interface:"",filter:"",extra_args:"",duration:0,password:""},d.value=""};return j(()=>{y()}),(r,l)=>(x(),C(a(Q),null,{default:o(()=>[t(a(O),null,{default:o(()=>[e("div",Z,[t(a(w),{title:"网络抓包分析",bordered:!1},{extra:o(()=>[t(a($),null,{default:o(()=>[t(a(S),{onClick:R,disabled:n.value},{default:o(()=>l[6]||(l[6]=[i(" 重置 ")])),_:1},8,["disabled"])]),_:1})]),default:o(()=>[d.value?(x(),C(a(q),{key:0,message:d.value,type:"error","show-icon":"",closable:"",onClose:l[0]||(l[0]=u=>d.value=""),style:{"margin-bottom":"16px"}},null,8,["message"])):k("",!0),n.value?(x(),D("div",J,[t(a(w),{size:"small",title:"抓包进行中..."},{default:o(()=>[e("div",K,[t(a(M),{size:"large"}),e("div",W,[e("div",ee,z(N.value),1),l[7]||(l[7]=e("div",{style:{"margin-top":"8px",color:"#666"}},"剩余时间",-1))]),t(a(X),{percent:I.value,"stroke-color":{"0%":"#108ee9","100%":"#87d068"},style:{"margin-top":"16px"}},null,8,["percent"]),t(a(S),{type:"primary",danger:"",onClick:V,style:{"margin-top":"16px"}},{default:o(()=>[t(a(A)),l[8]||(l[8]=i(" 停止抓包 "))]),_:1})])]),_:1})])):k("",!0),e("div",le,[e("div",ae,[t(a(w),{title:"配置参数",class:"form-card"},{default:o(()=>[t(a(G),{model:s.value,rules:F,layout:"vertical",disabled:n.value,class:"config-form"},{default:o(()=>[t(a(c),{label:"网络接口",name:"interface",class:"form-item"},{default:o(()=>[t(a(g),{value:s.value.interface,"onUpdate:value":l[1]||(l[1]=u=>s.value.interface=u),placeholder:"指定网络接口,如 eth0、wlan0 等(可选)",disabled:n.value,size:"large"},null,8,["value","disabled"]),l[9]||(l[9]=e("div",{class:"form-help"},"留空则使用默认接口",-1))]),_:1}),t(a(c),{label:"过滤条件",name:"filter",class:"form-item"},{default:o(()=>[t(a(g),{value:s.value.filter,"onUpdate:value":l[2]||(l[2]=u=>s.value.filter=u),placeholder:"BPF 过滤表达式,如 'host 192.168.1.1' 或 'port 80'(可选)",disabled:n.value,size:"large"},null,8,["value","disabled"]),l[10]||(l[10]=e("div",{class:"form-help"},"使用 BPF 语法过滤数据包",-1))]),_:1}),t(a(c),{label:"额外参数",name:"extra_args",class:"form-item"},{default:o(()=>[t(a(g),{value:s.value.extra_args,"onUpdate:value":l[3]||(l[3]=u=>s.value.extra_args=u),placeholder:"tcpdump 的额外命令行参数(可选)",disabled:n.value,size:"large"},null,8,["value","disabled"]),l[11]||(l[11]=e("div",{class:"form-help"},"如 '-v -n -X' 等参数",-1))]),_:1}),t(a(c),{label:"Sudo密码",name:"password",class:"form-item"},{default:o(()=>[t(a(g).Password,{value:s.value.password,"onUpdate:value":l[4]||(l[4]=u=>s.value.password=u),placeholder:"请输入sudo密码(可选)",disabled:n.value,size:"large"},null,8,["value","disabled"]),l[12]||(l[12]=e("div",{class:"form-help"}," 用于执行需要管理员权限的tcpdump命令 ",-1))]),_:1}),t(a(c),{label:"抓包时长",name:"duration",required:"",class:"form-item"},{default:o(()=>[t(a(g),{value:s.value.duration,"onUpdate:value":l[5]||(l[5]=u=>s.value.duration=u),placeholder:"抓包持续时间(秒)",type:"number",min:1,max:300,disabled:n.value,size:"large"},null,8,["value","disabled"]),l[13]||(l[13]=e("div",{class:"form-help"},"必填项,范围:1-300 秒",-1))]),_:1}),t(a(c),{class:"submit-section"},{default:o(()=>[t(a(S),{type:"primary",onClick:T,loading:v.value,disabled:n.value,size:"large",class:"submit-btn"},{default:o(()=>[v.value?k("",!0):(x(),C(a(H),{key:0})),i(" "+z(v.value?"抓包中...":"开始抓包"),1)]),_:1},8,["loading","disabled"])]),_:1})]),_:1},8,["model","disabled"])]),_:1})]),e("div",te,[t(a(w),{title:"使用说明",class:"help-card"},{default:o(()=>l[14]||(l[14]=[e("div",{class:"help-content"},[e("div",{class:"help-item"},[e("h4",null,"网络接口"),e("p",null," 指定要监听的网络接口,如 eth0、wlan0 等。留空则使用系统默认接口。 ")]),e("div",{class:"help-item"},[e("h4",null,"过滤条件"),e("p",null," 使用 BPF(Berkeley Packet Filter)语法过滤数据包。常用示例: "),e("ul",{class:"help-list"},[e("li",null,[e("code",null,"host 192.168.1.1"),i(" - 只抓取与指定主机通信的数据包 ")]),e("li",null,[e("code",null,"port 80"),i(" - 只抓取 80 端口的数据包")]),e("li",null,[e("code",null,"tcp and port 443"),i(" - 只抓取 HTTPS 流量")]),e("li",null,[e("code",null,"icmp"),i(" - 只抓取 ICMP 数据包(ping)")])])]),e("div",{class:"help-item"},[e("h4",null,"额外参数"),e("p",null,"tcpdump 的其他命令行参数,如:"),e("ul",{class:"help-list"},[e("li",null,[e("code",null,"-v"),i(" - 详细输出")]),e("li",null,[e("code",null,"-n"),i(" - 不解析主机名")]),e("li",null,[e("code",null,"-X"),i(" - 以十六进制和 ASCII 显示数据包内容 ")])])]),e("div",{class:"help-item"},[e("h4",null,"Sudo密码"),e("p",null," 用于执行需要管理员权限的tcpdump命令。如果系统配置了免密sudo或当前用户有足够权限,可以留空。 ")]),e("div",{class:"help-item"},[e("h4",null,"抓包时长"),e("p",null," 指定抓包的持续时间,单位为秒。抓包完成后会自动下载结果文件。 ")])],-1)])),_:1})])])]),_:1})])]),_:1})]),_:1}))}});const pe=Y(oe,[["__scopeId","data-v-a3cbb038"]]);export{pe as default};
|