EAGauss
Newbie | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Приветствую! Начну издалека. Недавно захотел настроить себе подключение по IPv6 через tunnelbroker, но вот незадача - мой интернет провайдер выдаёт белые динамические IPv4 адреса, поэтому нужно автоматизировать процесс обновления адреса туннеля. Сам tunnelbroker предлагает решение, но оно работает только на его стороне, а на моей нет, поэтому каждый раз при смене IPv4 адреса приходится удалять старый туннель и создавать новый. Усердно погуглив, нашёл решение, но у меня возникли проблемы с получением IPv4 адреса и передаче его в качестве аргумента для функции netsh. Связался с автором кода, но тот пару раз ответил и затих, а проблема так и не осталась решённой. Вот, собственно, ссылка на первоисточник: http://josherickson.org/132/hurricane-electric-6in4-windows-startup-script/ Код: function fastpingtest { $ping = New-Object System.Net.NetworkInformation.Ping; $ping.Send("8.8.8.8", 1000).status -eq "success"; } $endtime = [datetime]::Now.AddMinutes(1); $mapipv6 = $false; while([datetime]::Now -lt $endtime) { if(fastpingtest) { $mapipv6 = $true; break; } } if($mapipv6) { $wc = New-Object net.webclient; $url= "https://ipv4.tunnelbroker.net/ipv4_end.php?ip=AUTO&pass={1}&apikey={0}&tid={2}"; $values = "USERID", "PASSWORDMD5HASH", TUNNELID; $wc.DownloadString(($url -f $values)); #get connected interface $interface = netsh interface ipv4 show interface | findstr /c:" connected" | ?{!$_.contains("Loopback");} | %{[regex]::Split($_, "( )+") | ?{$_.trim().length -gt 0} | %{$_.trim()}; } $interface_ip = (netsh interface ipv4 show address $interface[0] | findstr /c:"IP Address" | select -First 1).split(":")[1].trim() netsh interface teredo set state disabled netsh interface ipv6 add v6v4tunnel IP6Tunnel $interface_ip HEIPv4ENDPOINT netsh interface ipv6 add address IP6Tunnel YOURIPv6ADDRESS netsh interface ipv6 add route ::/0 IP6Tunnel HEIPv6ADDRESS | Проблемы начинаются после комментария #get connected interface Автор посоветовал поменять !$_.contains("Loopback"); на $_.contains("Satel"); (потому что моё подключение к интернету так называется), также я посчитал логичным поменять findstr /c:"IP Address" на findstr /c:"IP-Адрес", так как оригинальный код писался под англоязычную систему, а у меня - русский язык. Но всё равно проблема та же - в переменную $interface_ip записывается некорректный адрес (или не записывается вообще), соответственно команде netsh передаются неправильные параметры, и ничего не работает. Прогуглив тему извлечения IPv4 адреса, нашёл другой вариант. Код: #get connected interface $ipAddress = Test-Connection -ComputerName EAGauss -Count 1 | Select -ExpandProperty IPV4Address $interface_ip = $ipAddress.IPAddressToString | Где EAGauss - имя хоста (моего компьютера), я было обрадовался, потому что выполняя эти пару команд, всё работает и выводится мой IPv4 адрес, но когда я заменяю старый кусок кода, на этот, всё равно получаю ошибку: -ERROR: Invalid IPv4 address supplied Что значит что функции netsh передан неверный параметр. Прошу помощи. С Уважением, EAGauss |