Ideaalne Minecrafti serveri kÀivituskript

Ideaalne Minecrafti serveri kÀivituskript

Autor armastab mĂ€ngu vĂ€ga ja on ka vĂ€ikese serveri administraator " ainult sĂ”prade jaoks ". Nagu tavaliselt mĂ€ngijate seas, on serveris kĂ”ik modifitseeritud, mis toob endaga kaasa töö ebastabiilsuse ja seetĂ”ttu ka kahanemise. Kuna Powershell on autorile tuttavam kui poodide asukoht oma tĂ€naval, otsustas ta teha "Parim skript Minecrafti kĂ€ivitamiseks 2020". See sama skript oli aluseks mallile turul Ruvds. Kuid kĂ”ik algfailid on juba artiklis olemas. NĂŒĂŒd jĂ€rjestikku, kuidas seda kĂ”ike toodeti.

Meile vajalikud kÀsud

Alternatiivne logimine

Üks kord, kui ma paigaldasin veel paar modi, avastasin, et server kukub ilmselt ilma igasuguse hoiatuseeta. Server ei kirjutanud vigu latest.log faili ega debug-sse, ja konsol, mis pidi selle vea fikseerima ja peatuma, oli suletud.

Ei soovi kirjutada - pole probleem. Meil on Powershell koos cmdletiga Tee-Object, mis vÔtab objekti ja vÀljastab selle korraga faili ja konsole.

.handler.ps1 | Tee-Object .StandardOutput.txt -Append

Sel viisil haarab Powershell StandardOutput’i ja kirjutab selle faili. Ärge proovige kasutada Start-Process, sest see tagastab System.ComponentModel.Component, mitte StandardOutput, ning -RedirectStandardOutput muudab konsooli sisestamise vĂ”imatuks, mida me soovime vĂ€ltida.

KĂ€ivituse argumendid

Kui autor installis selle teise paari modi, mĂ€rkas ta, et serverilt puudub ka sĂŒlearvuti mĂ€lu. Ja seda tuleb muuta kĂ€ivituse argumentides. Selle asemel, et iga kord neid start.bat failis muuta, kasutage lihtsalt seda skripti.

Kuna Tee-Object loeb StandardOutput’i ainult siis, kui kĂ€ivitatav fail kutsutakse "Nii nagu on", tuleb teha veel ĂŒks skript. See skript kĂ€ivitab Minecrafti. Alustame argumentidega.

Kuna tulevikus peaksime olema ÀÀrmiselt laisad, peab skript koguma kÀivituse argumendid lennult. Selleks alustame viimasest versioonist forge.

$forge = ((Get-ChildItem | Where-Object Name -Like "forge*").Name | Sort-Object -Descending) | Select-Object -last 1

Kasutades sort-object'i, vĂ”tame alati objekti, millel on kĂ”ige suurem number, sĂ”ltumata sellest, kui palju te neid sinna asetate. ÄÀrmiselt laisus.

NĂŒĂŒd tuleb serverile mĂ€lu mÀÀrata. Selleks vĂ”tame sĂŒsteemimĂ€lu arvu ja salvestame selle summa stringina.

$ram = ((Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum).sum /1gb)
$xmx = "-Xms" + $ram + "G"

Õige automaatne taaskĂ€ivitamine

Autor nÀgi .bat faile teistelt, kuid need ei arvestanud pÔhjust, miks server oli peatatud. Kas see ei ole ebamugav, et kui on vaja lihtsalt modifaili vahetada vÔi midagi kustutada?
NĂŒĂŒd teeme Ă”ige taaskĂ€ivituse. Autor on varem kokku puutunud kummaliste skriptidega, mis taaskĂ€ivitasid serveri hoolimata sellest, miks server oli vĂ€lja kukkunud. Me kasutame exitcode'i. Java kasutab 0 edukaks lĂ”petamiseks, sealt ka meie lĂ€htumine.

Esmalt loome funktsiooni, mis taaskÀivitab serveri, kui see lÔpetab töötamise ebaÔnnestunult.

function Get-MinecraftExitCode {
   
    do {
        
        if ($global:Process.ExitCode -ne 0) {
            Write-Log
            Restart-Minecraft
        }
        else {
            Write-Log
        }
 
    } until ($global:Process.ExitCode -eq 0)
    
}

Skript jÀÀb tsĂŒklisse, kuni server lĂ”petab töö Ă”igesti oma konsoolist kĂ€suga /stop.

Kui me kÔik automatiseerime, siis oleks hea ka kÀivitamise, lÔpetamise ja lÔpetamise pÔhjuse kuupÀeva kogumine.

Selleks salvestame Start-Process'i tulemuse muutujasse. Skript nÀeb vÀlja nii:

$global:Process = Start-Process -FilePath  "C:Program Files (x86)common filesOracleJavajavapath_target_*java.exe" -ArgumentList "$xmx -server -jar $forge nogui" -Wait -NoNewWindow -PassThru

Ja siis salvestame tulemused faili. Siin on, mis muutujasse tagastatakse:

$global:Process.StartTime
$global:Process.ExitCode	
$global:Process.ExitTime

KÔike seda saab Add-Content abil faili lisada. Veidi korraldades, saame sellise skripti, mida nimetame handler.ps1.

Add-Content -Value "Start time:" -Path $Logfile 
$global:Process.StartTime
 
Add-Content -Value "Exit code:" -Path $Logfile 
$global:Process.ExitCode | Add-Content $Logfile
    
Add-Content -Value "Exit time:" -Path $Logfile 
$global:Process.ExitTime | Add-Content $Logfile

NĂŒĂŒd kujundame skripti handler'i kĂ€ivitamiseks.

Õige automaatne laadimine

Autor soovib ĂŒhe mooduli abil kĂ€ivitada Minecrafti erinevaid versioone igasugustest radadest ning vĂ”imalust koguda logisid kindlasse kausta.

Probleem seisneb selles, et protsessi peab kĂ€ivitama kasutaja, kes on sĂŒsteemis sisse logitud. Seda saab teha töölauda vĂ”i WinRm kaudu. Kui kĂ€ivitada server sĂŒsteemi vĂ”i isegi administraatori nime alt, kuid mitte sisse logida, ei suuda Server.jar isegi eula.txt lugeda ja kĂ€ivituda.

Saame automaatse sisselogimise lubada, lisades registrisse kolm kirjet.

New-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon" -Name DefaultUserName -Value $Username -ErrorAction SilentlyContinue
New-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon" -Name DefaultPassword -Value $Password  -ErrorAction SilentlyContinue
New-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon" -Name AutoAdminLogon -Value 1 -ErrorAction SilentlyContinue

See ei ole ohutu. Siin on sisselogimisdavad ja paroolid esitatud puhta tekstina, seetÔttu tuleks serveri kÀivitamiseks luua eraldi kasutaja, kellel on juurdepÀÀs kasutaja tasemel vÔi veel kitsamas grupis. Tavalise administraatori kasutamine on seda kategooriliselt soovitatav.

Autostardi osas oleme nĂŒĂŒd selged. NĂŒĂŒd peame registreerima uue ĂŒlesande serveri jaoks. KĂ€ivitame kĂ€su Powershellist, seega nĂ€eb see vĂ€lja nii:

$Trigger = New-ScheduledTaskTrigger -AtLogOn
$User = "ServerAdmin"
$PS = New-ScheduledTaskAction -Execute 'PowerShell.exe" -Argument "Start-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft"'
Register-ScheduledTask -TaskName "StartSSMS" -Trigger $Trigger -User $User -Action $PS -RunLevel Highest

Kogume mooduli

NĂŒĂŒd kirjeldame kogu asja moodulitena, mida hiljem kasutada. Siin on kogu valmis skripti kood, impordige ja kasutage.

Kogu eespool kirjeldatut saate kasutada eraldi, kui te ei soovi moodulitega vaeva nÀha.

Start-Minecraft

Alustame mooduli loomisega, mis lihtsalt kÀivitab skripti, mis kuulab ja salvestab standardvÀljundi.

Parameetrite plokis kĂŒsitakse, millisest kaustast kĂ€ivitatakse Minecraft ja kuhu logi salvestatakse.

Set-Location (Split-Path $MyInvocation.MyCommand.Path)
function Start-Minecraft {
    [CmdletBinding()]
    param (
        [Parameter()]
        [ValidateNotNullOrEmpty()]
        [string]
        $LogFile,
 
        [Parameter(Mandatory)]  
        [ValidateSet('Vanilla', 'Forge')]
        [ValidateNotNullOrEmpty()]
        [string]
        $Type,
 
        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [string[]]
        $MinecraftPath
 
    )
    powershell.exe -file .handler.ps1 -type $type -MinecraftPath $MinecraftPath | Tee-Object $LogFile -Append
}
Export-ModuleMember -Function Start-Minecraft

Ja Minecrafti kÀivitamine tuleb teha nii:

Start-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft"

NĂŒĂŒd liigume kokku pandud Handler.ps1 juurde

Kuna meie skript peab kÀivitamisel vÔtma parameetreid, tuleb samuti mÀÀrata parameetrite plokk. Pange tÀhele, et see kÀivitab Oracle Java; kui kasutate muud distributsiooni, peate muutma teed tÀitmise faili.

param (
    [Parameter()]
    [ValidateNotNullOrEmpty()]
    [string]$type,
 
    [Parameter()]
    [ValidateNotNullOrEmpty()]
    [string]$MinecraftPath,
 
    [Parameter()]
    [ValidateNotNullOrEmpty()]
    [string]$StandardOutput
)
 
Set-Location $MinecraftPath
 
function Restart-Minecraft {
 
    Write-host "=============== KÀivitame jumalikku mÀnguserverit ============"
 
    $forge = ((Get-ChildItem | Where-Object Name -Like "forge*").Name | Sort-Object -Descending) | Select-Object -first 1
 
    $ram = ((Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum).sum /1gb)
    $xmx = "-Xms" + $ram + "G"
    $global:Process = Start-Process -FilePath  "C:Program Files (x86)common filesOracleJavajavapath_target_*java.exe" -ArgumentList "$xmx -server -jar $forge nogui" -Wait -NoNewWindow -PassThru
    
}
 
function Write-Log {
    Write-host "Algusaeg:" $global:Process.StartTime
 
    Write-host "Lahkumiskood:" $global:Process.ExitCode
    
    Write-host "LÔpetamise aeg:" $global:Process.ExitTime
 
    Write-host "=============== Jumalik mÀnguserver peatus ============="
}
 
function Get-MinecraftExitCode {
   
    do {
        
        if ($global:Process.ExitCode -ne 0) {
            Restart-Minecraft
            Write-Log
        }
        else {
            Write-Log
        }
 
    } until ($global:Process.ExitCode -eq 0)
    
}
 
Get-MinecraftExitCode

Register-Minecraft

Skript kordab praktiliselt Start-Minecraft'i, vĂ€lja arvatud see, et see registreerib ainult uue ĂŒlesande. See vĂ”tab samu argumendid. Kasutajanime puhul, kui see pole mĂ€rgitud, vĂ”etakse kasutaja jooksva nime.

function Register-Minecraft {
    [CmdletBinding()]
    param (
        [Parameter()]
        [ValidateNotNullOrEmpty()]
        [string]
        $LogFile,
 
        [Parameter(Mandatory)]  
        [ValidateSet('Vanilla', 'Forge')]
        [ValidateNotNullOrEmpty()]
        [string]$Type,
 
        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [string]$MinecraftPath,
 
        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [string]$User,
 
        [Parameter(Mandatory)]
        [string]$TaskName = $env:USERNAME
    )
 
    $Trigger = New-ScheduledTaskTrigger -AtLogOn
    $arguments = "Start-Minecraft -Type $Type -LogFile $LogFile -MinecraftPath $MinecraftPath"
    $PS = New-ScheduledTaskAction -Execute "PowerShell" -Argument "-noexit -command $arguments"
    Register-ScheduledTask -TaskName $TaskName -Trigger $Trigger -User $User -Action $PS -RunLevel Highest
    
}
 
Export-ModuleMember -Function Register-Minecraft

Register-Autologon

Skripti parameetrite plokis vÔtab skript argumendi Username ja Password. Kui Username ei ole mÀÀratud, kasutatakse jooksva kasutaja nime.

function Set-Autologon {
 
    param (
        [Parameter(
        HelpMessage="Autologoni jaoks kasutatava kasutajanimi")]
        $Username = $env:USERNAME,
 
        [Parameter(Mandatory=$true,
        HelpMessage="Kasutaja parool")]
        [ValidateNotNullOrEmpty()]
        $Password
    )
 
    $i = Get-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon"
 
    if ($null -eq $i) {
        New-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon" -Name DefaultUserName -Value $Username
        New-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon" -Name DefaultPassword -Value $Password 
        New-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon" -Name AutoAdminLogon -Value 1
        Write-Verbose "Set-Autologon aktiveerib kÀyttÀjÀn automaatloggen." 
 
    }
    else {
        Set-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon" -Name DefaultUserName -Value $Username
        Set-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon" -Name DefaultPassword -Value $Password
        Set-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon" -Name AutoAdminLogon -Value 1
    }
 
    
    Write-Verbose "Autologon on edukalt seadistatud."
 
}

Selle skripti kÀivitamine nÀeb vÀlja jÀrgmine:

Set-Autologon -Password "PlaintextPassword"

Kuidas kasutada

NĂŒĂŒd vaatame, kuidas autor kogu seda kasutab. Kuidas korralikult ĂŒles seada Minecrafti avalik server Windowsis. Alustame algusest.

1. Loome kasutaja

$pass = Get-Credential
New-LocalUser -Name "MinecraftServer" -Password $pass.Password -AccountNeverExpires -PasswordNeverExpires -UserMayNotChangePassword

2. Registreerime skripti kĂ€ivitamise ĂŒlesande

Saate registreerida moduli abil nii:

Register-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft" -User "MinecraftServer" -TaskName "MinecraftStarter"

VÔi kasutada tavalisi vahendeid:

$Trigger = New-ScheduledTaskTrigger -AtLogOn
$User = "ServerAdmin"
$PS = New-ScheduledTaskAction -Execute 'PowerShell.exe" -Argument "Start-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft"'
Register-ScheduledTask -TaskName "StartSSMS" -Trigger $Trigger -User $User -Action $PS -RunLevel Highest

3. LĂŒlitame sisse automaatse sisselogimise ja taaskĂ€ivitame masina

Set-Autologon -Username "MinecraftServer" -Password "Qw3"

KokkuvÔte

Autor on skripti loonud ka iseendale, seetÔttu on ta avatud teie ettepanekutele skripti tÀiustamiseks. Autor loodab, et kogu see kood on teile vÀhemalt minimaalselt kasulik olnud ja artikkel on huvitav.

Ideaalne Minecrafti serveri kÀivituskript

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster