如何使用 Windows Powershell 或在 Linux 环境中编码在 2 个以太网卡之间切换?

如何使用 Windows Powershell 或在 Linux 环境中编码在 2 个以太网卡之间切换?

这些是我迄今为止使用过的 Linux 路由命令。

#!/bin/sh

# time checks in second
SLEEPTIME=58

#IP Address or domain to test ping.
TESTIP1=198.168.1.0
TESTIP2=198.168.1.1

#Ping timeout
TIMEOUT=15

# External interfaces
EXTIF1=eth0
EXTIF2=eth2

# IP external interfaces.
IP1=`/sbin/ifconfig $EXTIF1 | grep -i "117.239.106.82" | cut -f2 -d: | cut -f1 -d " "`
IP2=`/sbin/ifconfig $EXTIF2 | grep -i "14.139.183.178" | cut -f2 -d: | cut -f1 -d " "`

# Gateway
GW1=117.239.106.81  # provider 1
GW2=14.139.183.177     # provider 2

# Relative weights
W1=1
W2=1

# Broadband providers
NAME1=www.yahoo.com  
NAME2=www.gmail.com 

#success or failure before gateway change
SUCCESSREPEATCOUNT=4
FAILUREREPEATCOUNT=1

####### Do not change anything below this line #######

# Last link status indicates the macro status of the link we determined.
LLS1=1
LLS2=1

# Last ping status.
LPS1=1
LPS2=1

# Current ping status.
CPS1=1
CPS2=1

# Change link status indicates that the link needs to be changed.
CLS1=1
CLS2=1

# Count of repeated up status or down status.
COUNT1=0
COUNT2=0

while : ; do
 ping -W $TIMEOUT -I $IP1 -c 5 $TESTIP1 > /dev/null  2>&1
 RETVAL=$?

 if [ $RETVAL -ne 0 ]; then
 echo $NAME1 Down
 CPS1=1
 else
 CPS1=0
 fi

 if [ $LPS1 -ne $CPS1 ]; then
    echo Ping status changed for $NAME1 from $LPS1 to $CPS1
    COUNT1=1
 else
    if [ $LPS1 -ne $LLS1 ]; then
       COUNT1=`expr $COUNT1 + 1`
    fi
 fi

 if [[ $COUNT1 -ge $SUCCESSREPEATCOUNT || ($LLS1 -eq 0 && $COUNT1 -ge $FAILUREREPEATCOUNT) ]]; then

  echo Uptime status will be changed for $NAME1 from $LLS1
    CLS1=0
    COUNT1=0
        if [ $LLS1 -eq 1 ]; then
        LLS1=0
        else
        LLS1=1
        fi
 else
    CLS1=1
 fi

 LPS1=$CPS1

 ping -W $TIMEOUT -I $IP2 -c 5 $TESTIP2 > /dev/null  2>&1
 RETVAL=$?

 if [ $RETVAL -ne 0 ]; then
    echo $NAME2 Down
    CPS2=1
    else
    CPS2=0
 fi

 if [ $LPS2 -ne $CPS2 ]; then
    echo Ping status changed for $NAME2 from $LPS2 to $CPS2
    COUNT2=1
 else
 if [ $LPS2 -ne $LLS2 ]; then
    COUNT2=`expr $COUNT2 + 1`
 fi
 fi

 if [[ $COUNT2 -ge $SUCCESSREPEATCOUNT || ($LLS2 -eq 0 && $COUNT2 -ge $FAILUREREPEATCOUNT) ]]; then
    echo Uptime status will be changed for $NAME2 from $LLS2
    CLS2=0
    COUNT2=0
 if [ $LLS2 -eq 1 ]; then
    LLS2=0
 else
    LLS2=1
 fi
 else
    CLS2=1
 fi

 LPS2=$CPS2

 if [[ $CLS1 -eq 0 || $CLS2 -eq 0 ]]; then
    if [[ $LLS1 -eq 1 && $LLS2 -eq 0 ]]; then
    echo Switching to $NAME2
    ip route replace default via $GW2
    elif [[ $LLS1 -eq 0 && $LLS2 -eq 1 ]]; then
    echo Switching to $NAME1
    ip route replace default via $GW1
    elif [[ $LLS1 -eq 0 && $LLS2 -eq 0 ]]; then
    echo Restoring default load balancing
    ip route replace default scope global nexthop via $GW1 dev $EXTIF1 weight 1 \
    nexthop via $GW2 dev $EXTIF2 weight 1
    fi
 fi
 sleep $SLEEPTIME
don

如何在 Windows 中使用 Powershell 或在 Linux 环境中编码在两个以太网卡之间切换?

答案1

您想要使用 Win32_NetworkAdapter WMI 类来禁用一个适配器并启用另一个适配器:

PS C:\Users\mmoor> $A=gwmi win32_networkadapter
PS C:\Users\mmoor> $A[0] | Get-Member


   TypeName: System.Management.ManagementObject#root\cimv2\Win32_NetworkAdapter

Name                        MemberType   Definition
----                        ----------   ----------
Disable                     Method       System.Management.ManagementBaseObject Disable()
Enable                      Method       System.Management.ManagementBaseObject Enable()
Reset                       Method       System.Management.ManagementBaseObject Reset()
SetPowerState               Method       System.Management.ManagementBaseObject SetPowerState(System.UInt16 PowerState, System.String Time)
AdapterType                 Property     System.String AdapterType {get;set;}
AdapterTypeId               Property     System.UInt16 AdapterTypeId {get;set;}
AutoSense                   Property     System.Boolean AutoSense {get;set;}
Availability                Property     System.UInt16 Availability {get;set;}
Caption                     Property     System.String Caption {get;set;}
ConfigManagerErrorCode      Property     System.UInt32 ConfigManagerErrorCode {get;set;}
ConfigManagerUserConfig     Property     System.Boolean ConfigManagerUserConfig {get;set;}
CreationClassName           Property     System.String CreationClassName {get;set;}
Description                 Property     System.String Description {get;set;}
DeviceID                    Property     System.String DeviceID {get;set;}
ErrorCleared                Property     System.Boolean ErrorCleared {get;set;}
ErrorDescription            Property     System.String ErrorDescription {get;set;}
GUID                        Property     System.String GUID {get;set;}
Index                       Property     System.UInt32 Index {get;set;}
InstallDate                 Property     System.String InstallDate {get;set;}
Installed                   Property     System.Boolean Installed {get;set;}
InterfaceIndex              Property     System.UInt32 InterfaceIndex {get;set;}
LastErrorCode               Property     System.UInt32 LastErrorCode {get;set;}
MACAddress                  Property     System.String MACAddress {get;set;}
Manufacturer                Property     System.String Manufacturer {get;set;}
MaxNumberControlled         Property     System.UInt32 MaxNumberControlled {get;set;}
MaxSpeed                    Property     System.UInt64 MaxSpeed {get;set;}
Name                        Property     System.String Name {get;set;}
NetConnectionID             Property     System.String NetConnectionID {get;set;}
NetConnectionStatus         Property     System.UInt16 NetConnectionStatus {get;set;}
NetEnabled                  Property     System.Boolean NetEnabled {get;set;}
NetworkAddresses            Property     System.String[] NetworkAddresses {get;set;}
PermanentAddress            Property     System.String PermanentAddress {get;set;}
PhysicalAdapter             Property     System.Boolean PhysicalAdapter {get;set;}
PNPDeviceID                 Property     System.String PNPDeviceID {get;set;}
PowerManagementCapabilities Property     System.UInt16[] PowerManagementCapabilities {get;set;}
PowerManagementSupported    Property     System.Boolean PowerManagementSupported {get;set;}
ProductName                 Property     System.String ProductName {get;set;}
ServiceName                 Property     System.String ServiceName {get;set;}
Speed                       Property     System.UInt64 Speed {get;set;}
Status                      Property     System.String Status {get;set;}
StatusInfo                  Property     System.UInt16 StatusInfo {get;set;}
SystemCreationClassName     Property     System.String SystemCreationClassName {get;set;}
SystemName                  Property     System.String SystemName {get;set;}
TimeOfLastReset             Property     System.String TimeOfLastReset {get;set;}
__CLASS                     Property     System.String __CLASS {get;set;}
__DERIVATION                Property     System.String[] __DERIVATION {get;set;}
__DYNASTY                   Property     System.String __DYNASTY {get;set;}
__GENUS                     Property     System.Int32 __GENUS {get;set;}
__NAMESPACE                 Property     System.String __NAMESPACE {get;set;}
__PATH                      Property     System.String __PATH {get;set;}
__PROPERTY_COUNT            Property     System.Int32 __PROPERTY_COUNT {get;set;}
__RELPATH                   Property     System.String __RELPATH {get;set;}
__SERVER                    Property     System.String __SERVER {get;set;}
__SUPERCLASS                Property     System.String __SUPERCLASS {get;set;}
PSStatus                    PropertySet  PSStatus {Availability, Name, Status, StatusInfo, DeviceID}
ConvertFromDateTime         ScriptMethod System.Object ConvertFromDateTime();
ConvertToDateTime           ScriptMethod System.Object ConvertToDateTime();


PS C:\Users\mmoor>

这将返回系统上所有网络适配器的数组。然后您可以根据需要调用数组相关成员上的第一个方法,例如:

PS C:\Users\mmoor>$A[0].disable()
PS C:\Users\mmoor>$A[1].enable()

当然,这取决于您拥有的网络适配器的数量,或者要找到您想要使用的特定适配器,您可能必须实施一些迭代来找到您正在寻找的属性,但这可能与 Powershell 一样好。

相关内容