Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Powershell: Получить IPv4 адрес и использовать его..

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

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

Всего записей: 4 | Зарегистр. 11-01-2014 | Отправлено: 22:23 29-08-2015
opencl26

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
в шеле не шарю, могу посоветовать провайдера ipv6 со своим софтом, там установил и забыл, только регистрация на мыло нужна была для скачки клиента...в линуксе в официальных репах клиент лежит, установил и есть туннель всегда...если такое надо погуглите "gogoc"
update:
извините, думал он халявный, а он скурвился, просит 10$ доната, так что совет плохой, а жаль, раньше было классно с ним

Всего записей: 319 | Зарегистр. 17-09-2014 | Отправлено: 08:37 30-08-2015 | Исправлено: opencl26, 09:20 30-08-2015
idiMAN

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
EAGauss
Если у тебя интерфейс называется "Satel", то получить его ip-адрес можно так:
Код:
 
netsh interface ipv4 show address "Satel" | findstr /c:"IP" | %{$_ -match "(?<IP>\d+\.\d+\.\d+\.\d+)"} | %{$matches["IP"]}
 

Всего записей: 466 | Зарегистр. 05-05-2003 | Отправлено: 10:19 30-08-2015
EAGauss

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибо, но проблема всё та же - отдельно команда работает и выводит адрес, а когда вставляю эту строчку в код, то снова получаю ошибку -ERROR: Invalid IPv4 address supplied  
 
Получается как, вот отрывок кода, где появляется ошибка:  
 
    $interface_ip=netsh interface ipv4 show address "Satel" | findstr /c:"IP" | %{$_ -match "(?<IP>\d+\.\d+\.\d+\.\d+)"} | %{$matches["IP"]}  
    netsh interface teredo set state disabled
    netsh interface ipv6 delete interface IP6Tunnel
    netsh interface ipv6 add v6v4tunnel IP6Tunnel $interface_ip 216.66.80.30  
 
Присваиваю переменной $interface_ip адрес интерфейса и подсовываю его как параметр для функции netsh, но почему-то возникает ошибка. Гугл не помог.

Всего записей: 4 | Зарегистр. 11-01-2014 | Отправлено: 16:15 30-08-2015
idiMAN

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
EAGauss
А если в ручном режиме, выполнив всю предварительную последовательность действий, Вы выполняете команду  
 
netsh interface ipv6 add v6v4tunnel IP6Tunnel Нужный_IP 216.66.80.30  
 
то ошибка возникает или нет?
 
P.S. Ещё тут посмотрите

Всего записей: 466 | Зарегистр. 05-05-2003 | Отправлено: 21:54 30-08-2015 | Исправлено: idiMAN, 21:58 30-08-2015
EAGauss

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
При ручном вводе:  
netsh interface ipv6 add v6v4tunnel IP6Tunnel 87.244.171.97 216.66.80.30  
никаких ошибок не возникает и создаётся туннель.
А при:
Код:
$ipAddress = Test-Connection -ComputerName EAGauss -Count 1  | Select -ExpandProperty IPV4Address
$interface_ip = $ipAddress.IPAddressToString  

$interface_ip.gettype() выводит:

Код:
IsPublic IsSerial Name                                     BaseType                                                                                                                                                      
-------- -------- ----                                     --------                                                                                                                                                      
True     True     String                                   System.Object      

$interface_ip[0].gettype() выводит:

Код:
IsPublic IsSerial Name                                     BaseType                                                                                                                                                      
-------- -------- ----                                     --------                                                                                                                                                      
True     True     Char                                     System.ValueType    

$interface_ip выводит:

Код:
87.244.171.97

$interface_ip[0] выводит:

Код:
8

 
И, наконец, при попытках:  
netsh interface ipv6 add v6v4tunnel IP6Tunnel $interface_ip 127.0.0.1
или
netsh interface ipv6 add v6v4tunnel IP6Tunnel $interface_ip[0] 127.0.0.1
выводит:

Код:
-ERROR: Invalid IPv4 address supplied
 
На самом деле, я у меня были мысли по поводу того, что проблема может быть в несоответствии типов данных, но я не силён в PowerShell, поэтому решил обратиться к профессионалам.

Всего записей: 4 | Зарегистр. 11-01-2014 | Отправлено: 15:02 31-08-2015
idiMAN

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
EAGauss
Попробовал у себя:

Код:
 
$interface_ip=netsh interface ipv4 show address "Satel" | findstr /c:"IP" | %{$_ -match "(?<IP>\d+\.\d+\.\d+\.\d+)"} | %{$matches["IP"]}
netsh interface ipv6 add v6v4tunnel IP6Tunnel $interface_ip 216.66.80.30
 

Этот вариант работает без ошибок.
 
Если у Вас возникают ошибки, то напишите какой код, какие ошибки вызывает. И какие значения в этот момент имеют переменные.

Всего записей: 466 | Зарегистр. 05-05-2003 | Отправлено: 19:43 31-08-2015 | Исправлено: idiMAN, 19:44 31-08-2015
EAGauss

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Всё, наконец, решил проблему - поделюсь решением.  
Ошибку -ERROR: Invalid IPv4 address supplied выдавал не netsh, а сайт tunnelbroker при авторизации.  
Решил как:  
Перечитал Tunnelbroker.net API https://forums.he.net/index.php?topic=3153.0  
И подправил:

Код:
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)  
    { $ipAddress = Test-Connection -ComputerName hostname -Count 1  | Select -ExpandProperty IPV4Address
    $interface_ip = $ipAddress.IPAddressToString  
    $wc = New-Object net.webclient;
    $url= "https://ipv4.tunnelbroker.net/ipv4_end.php?ip={0}&pass={1}&user_id={2}&tid={3}";
    $values = $interface_ip, "MD5PASS", "USERID", TUNNELID;
    $wc.DownloadString(($url -f $values));
    netsh interface ipv6 add address IP6Tunnel ClientIPv6Address
    netsh interface ipv6 add route ::/0 IP6Tunnel ServerIPv6Address
    netsh interface ipv6 delete interface IP6Tunnel
    netsh interface ipv6 add v6v4tunnel IP6Tunnel $interface_ip ServerIPv4Address
    }

Где hostname - имя локального хоста;
MD5PASS - Update Key (Личный кабинет tunnelbroker, страница туннеля, вкладка Advanced)
USERID - User ID (Личный кабинет tunnelbroker)
TUNNELID - Tunnel ID (Личный кабинет tunnelbroker, страница туннеля)  
ClientIPv6Address, ServerIPv6Address, ServerIPv4Address - соответственно (Личный кабинет tunnelbroker, страница туннеля).
 
Теперь выдаёт ошибку: -ERROR: This tunnel is already associated with this IP address. Please try to limit your updates to IP changes.
Но это нормально, потому что мой IPv4 адрес ещё не успел поменяться и ещё не прошло 5 минут после предыдущего запроса.
 
Благодарю за помощь всех, кто не остались равнодушными.

Всего записей: 4 | Зарегистр. 11-01-2014 | Отправлено: 21:08 31-08-2015
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Powershell: Получить IPv4 адрес и использовать его..


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru