BitBurner:如何将数组转换为参数,或传递给单独的函数?

问题描述 投票:0回答:2

我正在构建一个脚本来一次扫描/分发/攻击所有服务器。我的问题是我似乎无法弄清楚如何将我的第一个数组(代码中的spider())传递给我的第二个函数(probe())。我想使用第一个数组作为第二个函数中的“目标”变量。我留下评论来解释我的想法以及我一直试图弄清楚的内容。

/** @param {NS} ns**/

export async function main(ns){

//functions under here to make things pretty
function spider() { //Used to scan all servers
    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]);
            } //Make the array an argument to pass into probe function
        }
    }
    return serversSeen;
}
function probe() { //Used to open all server ports, gain root access, and run distro function
    function can(action) {
        return ns.fileExists(action + ".exe", "home"); //Checks for .exes
    }
    spider();
    for (let x=0; x < serversSeen.length;) {
        let target = serversSeen.length;
        let ports = 0;
        if (can( "BruteSSH" )) { ns.brutessh  (target);  ++ports; } //Opens all ports on server//Rewrite ns.brutessh (etc) to be strings
        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; }

        if (ns.getServerNumPortsRequired(target) <= ports && ns.hasRootAccess(target) == false) {
            ns.nuke(target);
            ++x
            //create an argument of rooted servers (rootedTarget)
        } else {
            if (ns.hasRootAccess(target) == true) {
            //Push any previously/manually rooted targets to the rootedTarget index(argument)
            }
        }
    }
    return ;//Args of targets (rootedTarget)
}

我已经考虑过让我的数组成为一个参数,但我发现的所有内容似乎都假设该数组是预定义的。

我尝试在

spider()
函数内部运行
probe()
函数,但这似乎也没有任何作用。

我也相信我必须重写 ns.ftpcrack 等代码行,但现在我一直在寻找一种传递数组的方法。

javascript arrays function arguments
2个回答
0
投票

我刚刚看到这篇文章寻找其他东西,发现没有人回复你。您的代码似乎只查看数组的长度,而不查看数组的值。如果我正确理解您的意图,它似乎还有您不需要执行的额外步骤。所以,这就是我如何写下你想要做的事情。

for (let x = 0; x < serversSeen.length; x++) {
    let target = serversSeen[x];
    let ports = 0;
    if (ns.hasRootAccess(target) == false) {
        if (can("BruteSSH")) { ns.brutessh(target); ++ports; } //Opens all ports on server//Rewrite ns.brutessh (etc) to be strings
        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; }

        if (ns.getServerNumPortsRequired(target) <= ports) { ns.nuke(target); }
    }
}

假设您还没有找到答案,我希望这对您有所帮助。 :D


0
投票

使用 ns.scan() 创建一个扫描每个服务器并返回服务器数组的函数;功能。 “hack-script.js”是我在服务器上运行的黑客脚本。请随意编辑我的代码,它有点草率,有点慢,可能容易出错。

/** @param {NS} ns */
function dpList(ns, current = "home", set = new Set()) 
{
    let connections = ns.scan(current);
    let next = connections.filter(c => !set.has(c));
    next.forEach(n => 
    {
        set.add(n); return dpList(ns, n, set);
    });
    return Array.from(set.keys());
}

export async function main(ns) 
{
    let servers = dpList(ns);
    for (let server of servers)
    {
        ns.scp("hack-script.js", server);
        if(ns.getServerMaxRam(server) > 1 && ns.hasRootAccess(server))
        {
            let threads = Math.floor(ns.getServerMaxRam(server) / 
ns.getScriptRam('hack-script.js', server));
            ns.exec("hack-script.js", server, threads);
        }
        if(!ns.hasRootAccess(server) && ns.getServerMaxRam(server) > 1)
        {
            try
            {
                ns.brutessh(server);
                ns.ftpcrack(server);
                ns.relaysmtp(server);
                ns.httpworm(server);
                ns.sqlinject(server);
            }
            catch {}
            try
            {
                ns.nuke(server);
            }
            catch{}
            let threads = Math.floor(ns.getServerMaxRam(server) / 
ns.getScriptRam('hack-script.js', server));
            ns.exec("hack-script.js", server, threads);
        }
    }
    return 0;
}

© www.soinside.com 2019 - 2024. All rights reserved.