Форум программистов, компьютерный форум, киберфорум
PowerShell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 29.08.2015
Сообщений: 5

Получить IPv4-адрес и использовать его в качестве аргумента для команды NETSH

29.08.2015, 22:31. Показов 3004. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую!

Начну издалека. Недавно захотел настроить себе подключение по IPv6 через tunnelbroker, но вот незадача - мой интернет провайдер выдаёт белые динамические IPv4 адреса, поэтому нужно автоматизировать процесс обновления адреса туннеля. Сам tunnelbroker предлагает решение, но оно работает только на его стороне, а на моей нет, поэтому каждый раз при смене IPv4 адреса приходится удалять старый туннель и создавать новый.
Усердно погуглив, нашёл решение, но у меня возникли проблемы с получением IPv4 адреса и передаче его в качестве аргумента для функции netsh. Связался с автором кода, но тот пару раз ответил и затих, а проблема так и не осталась решённой.
Вот, собственно, ссылка на первоисточник:
http://josherickson.org/132/hu... up-script/

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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 адреса, нашёл другой вариант.
PowerShell
1
2
3
    #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
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.08.2015, 22:31
Ответы с готовыми решениями:

Напишите программу, которая считывает IPv4 адрес и проверяет ее валидность. Форма записи IPv4 адреса – x.x.x.x
Напишите код для программы Пример: Напишите программу, которая считывает IPv4 адрес и проверяет ее валидность. Форма записи IPv4 адреса...

Поиск команды для вытягивания ipv4
Доброго времени суток, мне снова нужна помощь знатоков ) Пытался вытащить ipv4 через PS как переменную для дальнейших манипуляций, но вот...

6. Написать командный файл, который обеспечивает выполнение команды, имя которой задано в качестве первого аргумента
Написать командный файл, который обеспечивает выполнение команды, имя которой задано в качестве первого аргумента, для всех слов,...

8
 Аватар для v_svitere
774 / 423 / 137
Регистрация: 03.06.2009
Сообщений: 1,223
Записей в блоге: 4
31.08.2015, 11:13
EAGauss, Проверьте тип переменной $interface_ip через $interface_ip.gettype()
Что-то мне подсказывает, что тип у Вас string[] - то есть строковый массив
Если это так, то просто измените $interface на $interface_ip[0]

Также существует WMI-модель, на мой взгляд из нее идеологически правильнее получать ip-адресс
0
0 / 0 / 0
Регистрация: 29.08.2015
Сообщений: 5
31.08.2015, 15:03  [ТС]
При
PowerShell
1
2
$ipAddress = Test-Connection -ComputerName EAGauss -Count 1  | Select -ExpandProperty IPV4Address
$interface_ip = $ipAddress.IPAddressToString
$interface_ip.gettype() выводит:
Code
1
2
3
IsPublic IsSerial Name                                     BaseType                                                                                                                                                      
-------- -------- ----                                     --------                                                                                                                                                      
True     True     String                                   System.Object
$interface_ip[0].gettype() выводит:
Code
1
2
3
IsPublic IsSerial Name                                     BaseType                                                                                                                                                      
-------- -------- ----                                     --------                                                                                                                                                      
True     True     Char                                     System.ValueType
$interface_ip выводит:
Code
1
87.244.171.97
$interface_ip[0] выводит:
Code
1
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
выводит:
Code
1
-ERROR: Invalid IPv4 address supplied
На самом деле, я у меня были мысли по поводу того, что проблема может быть в несоответствии типов данных, но я не силён в PowerShell, поэтому решил обратиться к профессионалам.

Добавлено через 7 минут
upd. При ручном вводе:
netsh interface ipv6 add v6v4tunnel IP6Tunnel 87.244.171.97 216.66.80.30
никаких ошибок не возникает и создаётся туннель.
0
 Аватар для v_svitere
774 / 423 / 137
Регистрация: 03.06.2009
Сообщений: 1,223
Записей в блоге: 4
31.08.2015, 15:23
EAGauss, Нет с типом у Вас все в порядке,как раз требуемый string.
$interface_ip[0]-это получение первого индекса массива, в том случае если бы у Вас был массив строкого типа.

попробуйте заэкранировать

PowerShell
1
netsh interface ipv6 add v6v4tunnel IP6Tunnel "$interface_ip" 127.0.0.1
0
0 / 0 / 0
Регистрация: 29.08.2015
Сообщений: 5
31.08.2015, 15:39  [ТС]
Я это понял, но всё-таки решил написать, чтобы прояснить картину.
Миниатюры
Получить IPv4-адрес и использовать его в качестве аргумента для команды NETSH  
0
 Аватар для v_svitere
774 / 423 / 137
Регистрация: 03.06.2009
Сообщений: 1,223
Записей в блоге: 4
31.08.2015, 18:38
EAGauss, скорее всего утилита netsh не воспринимает powershell-ные переменные. Можно ли netsh передать значение переменной не подскажу. Предлагаю посмотреть в сторону командлета

New-NetIPAddress

Добавлено через 22 минуты
Только он, к сожалению, предустановлен для Windows Server 2012 R2 and Windows 8.1

Добавлено через 1 час 47 минут
Можно попробовать еще текстовую переменную с командой передать по конвееру на netsh
Что-то вроде этого:

PowerShell
1
2
$command="interface ipv6 add v6v4tunnel IP6Tunnel $interface_ip 127.0.0.1"
$command|netsh
Будет ли работать? утверждать не берусь
0
0 / 0 / 0
Регистрация: 29.08.2015
Сообщений: 5
31.08.2015, 18:50  [ТС]
v_svitere, пробовал через $command - к сожалению, не работает.
Гуглил, как реализовать через cmd / bat - не нашёл.
0
 Аватар для v_svitere
774 / 423 / 137
Регистрация: 03.06.2009
Сообщений: 1,223
Записей в блоге: 4
31.08.2015, 19:05
EAGauss, По конвееру переменная передается netsh, только что проверил сам.
Я не силен в синтаксисе netsh, но синтаксической ошибки powershell здесь точно нет.

При таком вводе какая ошибка?

PowerShell
1
2
3
$ip_2="216.66.80.30"
$command="interface ipv6 add v6v4tunnel IP6Tunnel $interface_ip $ip_2"
$command|netsh
0
0 / 0 / 0
Регистрация: 29.08.2015
Сообщений: 5
31.08.2015, 21:00  [ТС]
Всё, наконец, решил проблему - поделюсь решением.
Ошибку -ERROR: Invalid IPv4 address supplied выдавал не netsh, а сайт tunnelbroker при авторизации.
Решил как:
Перечитал Tunnelbroker.net API https://forums.he.net/index.php?topic=3153.0
И подправил:
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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 минут после предыдущего запроса.

Благодарю за помощь всех, кто не остались равнодушными.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.08.2015, 21:00
Помогаю со студенческими работами здесь

Вычислить адрес верхушки стека, адрес следующей команды, адрес переменной, адрес которой содержится в BX
Помогите решить следующие задачи: 1.Вычислить адрес верхушки стэка. 2.Вычислить адрес следующей выполняемой программы. 3. Вычислить...

Как получить массив в качестве аргумента
Всем привет. Новичок в программировании Пожалуйста, помогите в решении задачи Дан массив целых чисел. Напишите функцию, которая...

Получить путь до папки в качестве аргумента
Всем доброго, с помощью нижеследующего кода на vbs я получаю путь до папки, как реализовать это на AutoIt? Скрипт будет прописан в меню...

Получить в качестве аргумента аббревиатуру и найти определение по словарю
Помогите пожалуйста с задачей по Си. Нужно чтобы программа получала в качестве аргумента аббревиатуру и ищет определение по словарю....

Как получить в драйвере для XP IP адрес хоста по его имени
Нужно получить в драйвере для XP адрес хоста по имени. WSK в XP не работает, как сделать это используя TDI не очень понятно.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru