اسکریپت کامل راه اندازی سرور Minecraft

اسکریپت کامل راه اندازی سرور Minecraft

نویسنده بازی را بسیار دوست دارد و خودش مدیر یک سرور کوچک "صرفاً برای دوستان" است. طبق معمول در بین آماتورها، همه چیز روی سرور مود شده است و این مستلزم بی ثباتی کار و در نتیجه سقوط است. از آنجایی که نویسنده پاورشل را بهتر از محل فروشگاه‌های خیابان خود می‌شناسد، تصمیم گرفت این کار را انجام دهد.بهترین اسکریپت برای راه اندازی Minecraft 2020". همان اسکریپت به عنوان پایه ای برای الگو در خدمت بود بازار روودس. اما همه منابع از قبل در مقاله موجود است. حالا، به ترتیب، چگونه همه چیز انجام شد.

دستوراتی که ما نیاز داریم

قطع درختان جایگزین

هنگامی که چند مود دیگر را نصب کردم، متوجه شدم که سرور، ظاهراً بدون اعلام جنگ در حال خراب شدن است. سرور در last.log یا دیباگ خطا نمی نویسد و کنسولی که در تئوری قرار بود این ارور را بنویسد و متوقف شود بسته شد.

اگر نمی خواهی بنویسی، ننویس. ما Powershell با cmdlet داریم سه راهی، که یک شی را می گیرد و همزمان به یک فایل و کنسول خروجی می دهد.

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

بنابراین Powershell استاندارد Output را برمی دارد و آن را در یک فایل می نویسد. سعی نکنید استفاده کنید شروع-فرآیند، زیرا یک System.ComponentModel.Component را برمی گرداند، نه یک StandardOutput، و -RedirectStandardOutput تایپ در کنسول را غیرممکن می کند، چیزی که می خواهیم از آن اجتناب کنیم.

Arguments را راه اندازی کنید

با نصب همان جفت حالت، نویسنده متوجه شد که سرور نیز رم کافی ندارد. و لازم است آرگومان های راه اندازی را تغییر دهید. به جای تغییر هر بار در start.bat که همه از آن استفاده می کنند، فقط از این اسکریپت استفاده کنید.

از آنجایی که Tee-Object StandardOutput را فقط زمانی می خواند که فایل اجرایی "Just like that" نامیده شود، یک اسکریپت دیگر باید انجام شود. این اسکریپت خود ماین کرافت را اجرا خواهد کرد. بیایید با استدلال ها شروع کنیم.

به منظور افراط در تنبلی نهایی در آینده، فیلمنامه باید آرگومان های راه اندازی را در پرواز جمع آوری کند. برای انجام این کار، بیایید با جستجوی آخرین نسخه شروع کنیم جعل.

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

با sort-object، ما همیشه شیء با بیشترین تعداد را می گیریم، مهم نیست که چند عدد را در آنجا قرار دهید. نهایت تنبلی

حالا باید حافظه را به سرور اختصاص دهیم. برای این کار مقدار حافظه سیستم را گرفته و مقدار آن را در رشته می نویسیم.

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

راه اندازی مجدد خودکار مناسب

نویسنده فایل‌های bat را از افراد دیگر دیده است، اما دلیل توقف سرور را در نظر نگرفته‌اند. این ناخوشایند است، اگر فقط نیاز به تغییر فایل مود یا حذف چیزی داشته باشید، چه؟
حالا بیایید یک راه اندازی مجدد درست انجام دهیم. نویسنده قبلاً با اسکریپت‌های عجیبی روبرو شده بود که بدون توجه به دلیل خروج سرور، سرور را دوباره راه‌اندازی می‌کرد. ما از exitcode استفاده خواهیم کرد. جاوا از 0 به عنوان موفقیت استفاده می کند، پس بیایید از آنجا برقصیم.

ابتدا اجازه دهید یک تابع ایجاد کنیم که در صورت خرابی سرور، مجددا راه اندازی شود.

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

اسکریپت تا زمانی که سرور به طور معمول از کنسول خود با استفاده از دستور /stop خارج شود، در حلقه باقی می ماند.

اگر تصمیم گرفتیم همه چیز را خودکار کنیم، بهتر است تاریخ راه اندازی، پایان و همچنین دلیل پایان را جمع آوری کنیم.

برای این کار نتیجه Start-Process را روی یک متغیر می نویسیم. در یک اسکریپت به این صورت است:

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

و سپس نتایج را در یک فایل بنویسید. در اینجا چیزی است که در یک متغیر به ما برگردانده می شود:

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

همه اینها را می توان با استفاده از Add-Content به فایل اضافه کرد. با کمی براش زدن، چنین اسکریپتی دریافت می کنیم، اما ما آن را 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

حالا بیایید اسکریپت را با راه اندازی هندلر طراحی کنیم.

بارگذاری خودکار مناسب

نویسنده می خواهد minecraft نسخه های مختلف را از هر مسیری با یک ماژول اجرا کند و همچنین بتواند لاگ ها را در یک پوشه خاص قرار دهد.

مشکل این است که فرآیند باید توسط کاربری که وارد شده است شروع شود. این کار را می توان از طریق دسکتاپ یا WinRm انجام داد. اگر سرور را به عنوان یک سیستم یا حتی یک مدیر اجرا می کنید، اما وارد سیستم نمی شوید، Server.jar حتی نمی تواند eula.txt را بخواند و شروع به کار کند.

ما می‌توانیم autologon را با افزودن سه ورودی به رجیستری فعال کنیم.

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

این امن نیست. ورود و رمز عبور در اینجا با متن ساده نشان داده شده است، بنابراین، برای راه اندازی سرور، باید یک کاربر جداگانه ایجاد کنید که در سطح کاربر یا در یک گروه حتی محدودتر دسترسی داشته باشد. استفاده از مدیر استاندارد برای این کار به شدت ممنوع است.

ما خودکار ورود را فهمیدیم. اکنون باید یک وظیفه جدید برای سرور ثبت کنید. ما دستور را از Powershell اجرا می کنیم، بنابراین به شکل زیر خواهد بود:

$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

مونتاژ ماژول

حالا بیایید همه چیز را در ماژول هایی که بعدا می توان از آنها استفاده کرد مرتب کنیم. همه کدهای اسکریپت های آماده اینجا هستند، وارد و استفاده کنید.

اگر نمی‌خواهید ماژول‌ها را به زحمت بیاندازید، می‌توانید از همه چیزهایی که در بالا توضیح داده شد، جداگانه استفاده کنید.

ماین کرافت را شروع کنید

ابتدا، اجازه دهید ماژولی بسازیم که کاری جز اجرای اسکریپتی که به خروجی استاندارد گوش می دهد و می نویسد، انجام نمی دهد.

در بلوک پارامتر، او می پرسد که از کدام پوشه ماین کرافت را راه اندازی کند و لاگ را کجا قرار دهد.

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

و شما باید ماین کرافت را به این صورت اجرا کنید:

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

حال به سراغ Handler.ps1 آماده برای استفاده می رویم

برای اینکه اسکریپت ما هنگام فراخوانی پارامترها را بپذیرد، باید یک بلوک پارامتر نیز مشخص کنیم. لطفا توجه داشته باشید که اوراکل جاوا را اجرا می کند، اگر از توزیع دیگری استفاده می کنید، باید مسیر فایل اجرایی را تغییر دهید.

param (
    [Parameter()]
    [ValidateNotNullOrEmpty()]
    [string]$type,
 
    [Parameter()]
    [ValidateNotNullOrEmpty()]
    [string]$MinecraftPath,
 
    [Parameter()]
    [ValidateNotNullOrEmpty()]
    [string]$StandardOutput
)
 
Set-Location $MinecraftPath
 
function Restart-Minecraft {
 
    Write-host "=============== Starting godlike game server ============"
 
    $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 "Start time:" $global:Process.StartTime
 
    Write-host "Exit code:" $global:Process.ExitCode
    
    Write-host "Exit time:" $global:Process.ExitTime
 
    Write-host "=============== Stopped godlike game server ============="
}
 
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

ماین کرافت را ثبت کنید

اسکریپت عملاً مانند Start-Minecraft است، با این تفاوت که فقط یک کار جدید را ثبت می کند. همان استدلال ها را می پذیرد. نام کاربری، اگر مشخص نشده باشد، نام فعلی را می گیرد.

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

در بلوک پارامتر، اسکریپت پارامترهای نام کاربری و رمز عبور را می پذیرد. اگر نام کاربری مشخص نشده باشد، از نام کاربر فعلی استفاده می شود.

function Set-Autologon {
 
    param (
        [Parameter(
        HelpMessage="Username for autologon")]
        $Username = $env:USERNAME,
 
        [Parameter(Mandatory=$true,
        HelpMessage="User password")]
        [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 will enable user auto logon."
 
    }
    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 was set successfully."
 
}

اجرای این اسکریپت به شکل زیر است:

Set-Autologon -Password "PlaintextPassword"

نحوه استفاده

حال در نظر بگیرید که خود نویسنده چگونه از این همه استفاده می کند. نحوه استقرار صحیح سرور عمومی Minecraft در ویندوز. بیایید از همان ابتدا شروع کنیم.

1. یک کاربر ایجاد کنید

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

2. وظیفه را برای اجرای اسکریپت ثبت کنید

می توانید با ماژولی مانند این ثبت نام کنید:

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

یا از ابزارهای استاندارد استفاده کنید:

$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. Autologin را روشن کرده و دستگاه را راه اندازی مجدد کنید

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

اتمام

نویسنده فیلمنامه را از جمله برای خود ساخته است، بنابراین خوشحال می شود به پیشنهادات شما برای بهبود فیلمنامه گوش دهد. نویسنده امیدوار است که همه این کد حداقل برای شما مفید بوده باشد و مقاله جالب باشد.

اسکریپت کامل راه اندازی سرور Minecraft

منبع: www.habr.com

اضافه کردن نظر