本文主要介绍.NET Core(C#)中,在Windows和Linux系统上实现通过重新连接宽带拨号,来更换机器访问外网的IP,对一些爬虫程序经常被封IP可能是一种解决方案。

1、Windows上使用rasdial.exe实现

连接或断开拨号或虚拟专用网络(VPN)连接。当运行不带参数的命令时,将显示当前网络连接的状态。

rasdial entryname [username [password|*]] [/domain:<domain>] [/phone:<phonenumber>] [/callback:<callbacknumber>] [/phonebook:<phonebookfile>] [/PrefixSuffix]

1)连接到电话簿(.pbk)条目时必需。指定当前.pbk文件中位于systemroot\System32\Ras文件夹中的条目。如果ConnectionName包含空格或特殊字符,请在文本周围使用引号(即“Connection Name”)。

除非选择了“个人电话簿”选项,否则将使用Rasphone.pbk文件。如果选择了“个人电话簿”选项,则使用文件UserName .pbk。选择个人电话簿/p时,该名称显示在Rasphone标题栏上。如果发生名称冲突,则会附加数字。

2)用户名 [{ 密码 | * }]

指定用于连接的用户名和密码。如果使用星号,则会提示用户输入密码,但不会显示键入的字符。

3) /domain: 域

指定用户帐户所在的域。如果未指定,则使用“连接到”对话框中“域”字段的最后一个值。

4) /phone: PhoneNumber

用指定的电话号码替换Rasphone.pbk中条目的电话号码。

5) /callback: CallbackNumber

用指定的回叫号码代替Rasphone.pbk中条目的回叫号码。

6) /phonebook:PhonebookPath

指定电话簿文件的路径。默认值为systemroot \ System32 \ Ras \ UserName .pbk。您可以指定文件的完整路径。

7) /prefixsuffix

将当前的TAPI位置拨号设置应用于电话号码。这些设置在“控制面板”中的“电话”中配置。默认情况下,此选项是关闭的。

8) /disconnect断开连接时

需要断开指定的条目。您还可以通过键入/d断开连接。

相关文档https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-r2-and-2012/ff...

2、Linux上使用ifdown和ifup实现

实时地手动修改一些网络接口参数,可以利用 ifconfig 来实现,如果是要直接以配置文件,亦即是在 /etc/sysconfig/network-scripts 里面的 ifcfg-ethx等文件的设置参数来启动的话,那就得要通过 ifdownifup来实现了。此命令的适用范围:RedHat、RHEL、Ubuntu、CentOS、SUSE、openSUSE、Fedora

命令格式如下:

ifup {interface}
ifdown {interface}

例如:

ifup eth0        #激活网卡eth0
ifdown eth0      #关闭eth0

注意ifup 与 ifdown 两个程序其实是 script而已,它会直接到 /etc/ sysconfig/network-scripts 目录下搜索对应的配置文件,例如, ifup eth0,它会找出ifcfg-eth0这个文件的内容,然后加以设置。

  不过,由于这两个程序主要是搜索设置文件(ifcfg-ethx)来进行启动与关闭的,所以在使用前请确定 ifcfg-ethx 是否真的存在于正确的目录内,否则会启动失败。另外,如果以 ifconfig eth0 来设置或者是修改了网络接口后,就无法再以 ifdown eth0 的方式来关闭。因为 ifdown 会分析比较目前的网络参数与 ifcfg-eth0 是否相符,不符的话,就会放弃这次操作。因此,使用 ifconfig 修改完毕后,应该要以ifconfig eth0 down 才能够关闭该接口。

3、.NET Core(C#)中调用rasdial、ifdown和ifup实现代码

  //实现Windows和Linux重新连接宽带(PPPoE)
private void Redial()
{
    if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
    {
        KillPPPoEProcesses();
        var process = Process.Start("/sbin/ifdown", "ppp0");
        if (process == null)
        {
            return;
        }
        process.WaitForExit();
        process = Process.Start("/sbin/ifup", "ppp0");
        if (process == null)
        {
            return;
        }
        process.WaitForExit();
    }
    else if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
    {
        RedialOnWindows("adsl帐号","adsl密码");
        return;
    }
    throw new PlatformNotSupportedException($"{Environment.OSVersion.Platform}");
}
private void RedialOnWindows(string ADSLAccount,string ADSLPassword,string ADSLInterface="")
{
    var process = new Process
    {
        StartInfo =
        {
            FileName = "rasdial.exe",
            UseShellExecute = false,
            CreateNoWindow = false,
            WorkingDirectory = @"C:\Windows\System32",
            Arguments = ADSLInterface + @" /DISCONNECT"
        }
    };
    process.Start();
    process.WaitForExit(10000);
    process = new Process
    {
        StartInfo =
        {
            FileName = "rasdial.exe",
            UseShellExecute = false,
            CreateNoWindow = false,
            WorkingDirectory = @"C:\Windows\System32",
            Arguments = ADSLInterface + " " + ADSLAccount + " " + ADSLPassword
        }
    };
    process.Start();
    process.WaitForExit(10000);
}
private void KillPPPoEProcesses()
{
    if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
    {
        var processes = Process.GetProcessesByName("pppd").ToList();
        processes.AddRange(Process.GetProcessesByName("pppoe"));
        foreach (var process in processes)
        {
            try
            {
                process.Kill();
            }
            catch
            {
                // ignore
            }
        }
    }
}



推荐文档