4. 다른 서버에서 같은 스크립트를 실행시키자.

728x90

1. 서론

 

Bitburner에서는 관리자권한을 탈취한 서버 이외에 Purchase Server가 있다.

필자기준으로 1.02TB가 최대스펙으로 보이며, 가격도 56.320m달러로 저렴하기에 스크립트를 굴리기 편한 기능이다.

다만 필자기준으로 서버는 총 25개까지 구매가 가능하여, 서버별로 스크립트를 복사해서 하나하나 실행시키기에는 보통 귀찮은 일이 아니다.

 

오늘은 스크립트를 활용하여, 보유중인 PurchaseServer에 동일한 스크립트를 전달하는 방법을 알아보려고 한다.

 

 

2. 스크립트 작성 법(기본)

 

일단 필자가 실행하려는 스크립트는 아래와 같다.

export async function main(ns) {
    var target = "the-hub";
    var moneyThresh = ns.getServerMaxMoney(target) * 0.75;
    var securityThresh = ns.getServerMinSecurityLevel(target) + 5;

    while (true) {
        if (ns.getServerSecurityLevel(target) > securityThresh) {
            await ns.weaken(target);
        } else if (ns.getServerMoneyAvailable(target) < moneyThresh) {
            await ns.grow(target);
        } else {
            await ns.hack(target);
        }
    }
}

 

단순히 해킹타겟을 지정해서, weaken, grow, hack을 돌려주는 간단한 스크립트이며 이는 2번글에서도 설명하였다.

이 파일은 home에서 /mycustom/first_hack.js라는 이름으로 존재하며, 이를 기준으로 할 것이다.

 

실행 할 스크립트가 정해졌다면, home에서 nano로 스크립트를 하나 생성한다.

필자는 /mycustom/all_purchase_server_run.js로 이름을 지었다.

그 뒤 아래 스크립트를 붙여넣는다.

 

export async function main(ns) {
    var servers = ns.getPurchasedServers();

    for(var i = 0; i<servers.length; ++i){
        var server = servers[i];
        ns.scp("/mycustom/first_hack.js", server); //파일복사
        ns.scriptKill("/mycustom/first_hack.js", server); //실행스크립트 죽이기
        ns.exec("/mycustom/first_hack.js", server, 426); //스크립트 실행(426쓰레드)
    }
    ns.tprint("done");
}

 

스크립트를 설명하자면 아래와 같다.

 

  1. ns.getPurchaseServers()로 구매한 서버를 배열형태로 받는다.
  2. servers길이만큼 for문을 돌리는데
  3. ns.scp로 스크립트를 타겟서버로 복사하고
  4. (선택)ns.scriptKill로 실행중인 스크립트를 종료하고
  5. ns.exec로 타겟서버에서 스크립트를 실행한다.
  6. for문이 종료되면 done으로 터미널에서 종료를 확인한다.

스크립트를 저장하고 실행하면? 모든 구매한 서버로 파일을 전송하고 자동으로 실행하게 될 것이다.

 

3. 스크립트 작성 법(심화)

필자의 경우 한 우물만 판다라는 마인드로, target을 하드코딩해두었다.

스크립트는 argument를 지원하므로, 아래와 같이 스크립트를 작성하여 여러가지 변수를 주면서 실행시키는 것이 가능하다.

 

예를들면 해킹타겟을 서버명에 맞게 바꿀 수 있다.

 

코드 상 servers[i]로 접근하면, 이는 string형으로 substr메서드를 사용할 수 있다.

예를들어 0번인덱스 서버명이 server-n00dles라면 server[0].substr(7)은 n00dles로 반환된다.

이를 이용하면 아래와 같이 활용할 수 있을 것이다.

 

export async function main(ns) {
    var target = args[0];
    var moneyThresh = ns.getServerMaxMoney(target) * 0.75;
    var securityThresh = ns.getServerMinSecurityLevel(target) + 5;

    while (true) {
        if (ns.getServerSecurityLevel(target) > securityThresh) {
            await ns.weaken(target);
        } else if (ns.getServerMoneyAvailable(target) < moneyThresh) {
            await ns.grow(target);
        } else {
            await ns.hack(target);
        }
    }
}

 

export async function main(ns) {
    var servers = ns.getPurchasedServers();

    for(var i = 0; i<servers.length; ++i){
        var server = servers[i];//server = server-{target}
        var target = server.substr(7);
        ns.scp("/mycustom/first_hack.js", server); //파일복사
        ns.scriptKill("/mycustom/first_hack.js", server); //실행스크립트 죽이기
        ns.exec("/mycustom/first_hack.js", server, 426, target); //스크립트 실행(426쓰레드)
    }
    
    ns.tprint("done");
}

 

first_hack.js의 target을 매개변수로 받아오고, 자동실행 스크립트의 exec함수 마지막 매개변수에 first_hack에 들어갈 매개변수를 넣어줄 수 있다.

 

4. 여담

지금 1회차에서 Augmentations구매비용 배수가 너무 올라 2회차로 넘어왔는데, 확실히 처음할때보단 매끄럽게 진행하고 있는 것 같다.

ns오브젝트에 연결된 함수에서 쓸만한게 많으니 docs를 읽어보는게 꽤 도움이 될 것이다.

 

Bitburner docs : https://bitburner.readthedocs.io/en/latest/index.html

 

728x90