ubuntu ps1 设置网卡参数
cat /opt/bin/NetworkParamUpdater.ps1 
# NetworkParamUpdater.ps1' -Auto 将当前连接设置为自动分配 ip 
# NetworkParamUpdater.ps1' -Ip '192.168.1.1' 将当前连接设置为指定 ip

[CmdletBinding()]
param (

    #  是否设置为自动获取 IP 
    [Parameter(Mandatory = $false)]
    [switch]$Auto ,

    [string]$Ip = '' # 使用的 ip 地址 
)

$ErrorActionPreference = 'Stop'

class IpConfig {
    [string] $cidrIp
    [string] $gateway
    [string] $dns
}

class DevicItem {
    [string] $device
    [string] $type
    [string] $state
    [string] $conntion

    [bool] isActive() {
        return $this.state -eq '已连接'
    }
}

class NmcliManager {

    [DevicItem[]]getDevices() {

        $lines = (nmcli device status) | Select-Object -Skip 1
        $this.throwIfError()

        $items = @()

        foreach ($line in $lines) {

            # 使用正则拆分字段,保留中文等多字节字符
            $columns = ($line -replace '\s{2,}', '|').Split('|')

            $item = [DevicItem]::new()
            $item.device = $columns[0].Trim()
            $item.type = $columns[1].Trim() 
            $item.state = $columns[2].Trim()
            $item.conntion = $columns[3].Trim()

            $items += $item
        }

        return $items

    }

    [DevicItem] getActiveDevice() {

        $item = $this.getDevices() | Where-Object { $_.isActive() } | Select-Object -First 1

        return $item
    }

    setAuto([string]$conntion) { 

        nmcli connection modify $conntion ipv4.dns '' ipv4.method auto
        $this.throwIfError()

    }

    setManual([string]$conntion, [IpConfig]$ipConfig) {

        if (-not $ipConfig.cidrIp) {
            throw "ip 地址未设置"
        }

        nmcli connection modify $conntion  ipv4.addresses $ipConfig.cidrIp ipv4.gateway $ipConfig.gateway ipv4.dns $ipConfig.dns ipv4.method manual
        $this.throwIfError()
    } 

    reset([string]$conntion) {

        nmcli connection down $conntion     
        $this.throwIfError()   

        nmcli connection up $conntion
        $this.throwIfError()

    }

    throwIfError() {
        $errorCode = $LASTEXITCODE
        if ($errorCode -ne 0) {
            throw "错误码: $errorCode"
        }
    }

    [IpConfig] getDefaultIpConfig([string]$conntion, [string]$ip) {

        if ([string]::IsNullOrWhiteSpace($ip )) {

            switch ($conntion.ToLower()) {
                "xxx1" { $ip = "192.168.0.98" }
                "xxx2" { $ip = "192.168.0.97" }
                "xxx3" { $ip = "192.168.0.96" }
                Default { $ip = "192.168.0.99" }
            }
        }

        [IpConfig]$ipConfig = [IpConfig]::new()
        $ipConfig.cidrIp = "$($ip)/24"
        $ipConfig.gateway = "192.168.0.60"
        $ipConfig.dns = "192.168.0.60"

        return $ipConfig

    }

}

$manager = [NmcliManager]::new()

$device = $manager.getActiveDevice()
Write-Output "活动链接: $($device | ConvertTo-Json)"

if (-not $device) {
    Write-Output "没有活动链接"
    return 
}

Write-Output "设置自动模式 $Auto"

if ($Auto) {
    $manager.setAuto($device.conntion)
}
else {

    [IpConfig]$ipConfig = $manager.getDefaultIpConfig($device.conntion, $Ip)
    Write-Output "IP 配置: $($ipConfig | ConvertTo-Json)"

    $manager.setManual($device.conntion, $ipConfig)
}

$manager.reset($device.conntion)

Write-Output "完成设置"
上一篇
下一篇