BitBurner技术问题:如何将数组作为参数传递给函数?
BitBurner批量破解脚本:解决spider数组传递及核心逻辑问题
你的核心问题是没有接收spider()的返回值,而且probe函数里根本访问不到spider内部的serversSeen变量。另外probe里还有几个逻辑错误,比如target赋值成数组长度(完全错误)、循环自增逻辑有问题,下面是修正后的完整代码,附关键修改说明:
/** @param {NS} ns**/ export async function main(ns){ // 扫描所有服务器,返回服务器名数组 function spider() { let serversSeen = ['home'] for (let i=0; i < serversSeen.length; i++) { let thisScan = ns.scan(serversSeen[i]); for (let j=0; j < thisScan.length; j++) { if (serversSeen.indexOf(thisScan[j]) === -1) { serversSeen.push(thisScan[j]); } } } return serversSeen; } // 批量尝试获取服务器root权限 function probe() { // 检查是否拥有对应破解工具 function can(action) { return ns.fileExists(action + ".exe", "home"); } // 关键修改1:接收spider返回的服务器数组 const servers = spider(); const rootedTargets = []; // 存储已root的服务器 // 关键修改2:遍历服务器数组,修正循环逻辑 for (const target of servers) { let ports = 0; // 尝试打开所有可用端口 if (can("BruteSSH")) { ns.brutessh(target); ports++; } if (can("FTPCrack")) { ns.ftpcrack(target); ports++; } if (can("RelaySMTP")) { ns.relaysmtp(target); ports++; } if (can("HTTPWorm")) { ns.httpworm(target); ports++; } if (can("SQLInject")) { ns.sqlinject(target); ports++; } // 尝试获取root权限 if (!ns.hasRootAccess(target)) { if (ns.getServerNumPortsRequired(target) <= ports) { ns.nuke(target); rootedTargets.push(target); } } else { // 已root的服务器直接加入列表 rootedTargets.push(target); } } return rootedTargets; // 返回所有已root的服务器数组 } // 调用probe函数并输出结果 const rootedServers = probe(); ns.tprint(`已成功获取以下服务器root权限:${rootedServers.join(', ')}`); }
关键修改点:
- 数组传递修正:在probe函数内调用
spider()时,将返回值存入servers变量,这样就能拿到所有扫描到的服务器列表。 - target变量修正:原来把
target赋值成数组长度(serversSeen.length),这会导致破解工具传入数字而非服务器名,现在直接遍历数组拿到每个服务器名。 - 循环逻辑优化:改用
for...of循环简化遍历代码,避免原代码中只有nuke成功才自增索引导致的无限循环问题。 - rootedTargets收集:新增数组存储所有已root的服务器,符合你注释里的需求。
另外你提到的ns.ftpcrack等代码不需要改写,只要传入正确的服务器名字符串即可,现在的代码已经处理好了。
内容的提问来源于stack exchange,提问作者Bobby Pope
相关产品推荐
相关产品推荐

