我正在构建一个脚本来一次扫描/分发/攻击所有服务器。我的问题是我似乎无法弄清楚如何将我的第一个数组(代码中的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 等代码行,但现在我一直在寻找一种传递数组的方法。
我刚刚看到这篇文章寻找其他东西,发现没有人回复你。您的代码似乎只查看数组的长度,而不查看数组的值。如果我正确理解您的意图,它似乎还有您不需要执行的额外步骤。所以,这就是我如何写下你想要做的事情。
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
使用 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;
}