Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   определить основной шлюз для выбраннго адаптера (http://forum.oszone.net/showthread.php?t=325139)

neth1 22-03-2017 22:45 2722241

определить основной шлюз для выбраннго адаптера
 
Несколько сетевых адаптеров, настройки получают по dhcp.
Нужно брать текущий шлюз для одного из адаптеров, и использовать его дальше в скрипте.
Примерно так:
Код:

Получить шлюз для "ethernet адаптер1"
route add 0.0.0.0 mask 0.0.0.0 'шлюз для "ethernet адаптер1"'


glukin 22-03-2017 23:21 2722259

neth1, парсить вывод вот этой команды?
netsh interface ip show route
Готового батника не предложу, извините.

neth1 22-03-2017 23:36 2722263

'interface' в данном случае имя интерфейса?
Как его узнать?
Код:

netsh 'Подключение по локальной сети - Ethernet адаптер' ip show route
не сработало.
Код:

Команда 'Подключение по локальной сети - Ethernet адаптер' ip show route не найдена.
Где посмотреть рабочие примеры парсинга?

glukin 22-03-2017 23:49 2722270

neth1, извиняюсь, не то написал.
Вот:
netsh interface ip show addresses
Выведет конфиг для всех интерфейсов.
netsh interface ip show addresses name="Имя_интерфейса"
Выведет конфиг для нужного.

Впрочем, то же самое выведет и ipconfig.

neth1 23-03-2017 06:00 2722299

Код:

netsh interface ip show addresses
Команда interface ip show addresses не найдена.

А что на счет парсинга?
Не представляю, как это реализуется средствами cmd.

Iska 23-03-2017 09:00 2722319

Цитата:

Цитата neth1
Команда interface ip show addresses не найдена. »

Вы бы тогда озвучили среду исполнения.

neth1 23-03-2017 12:19 2722374

win xp.
Помогите пожалуйста спарсить шлюз из ipconfig, кто может.
Я буду очень долго разбираться.

neth1 06-04-2017 14:58 2726741

Странно, но не работает:
Код:

@echo off
for /f "tokens=7 delims=:" %%a in ('ipconfig /all ^| findstr "шлюз.*"') do (
  if not defined gateway set gateway=%%a
)
echo gateway - %gateway%


NickM 06-04-2017 20:31 2726862

а так?
Код:

@echo off
setlocal enabledelayedexpansion
for /f "usebackq tokens=1-2 delims=:" %%i in (`ipconfig ^| find "Основной шлюз"`) do echo.%%j


neth1 06-04-2017 22:24 2726911

Работает.
У меня несколько адаптеров, шлюз нужен только для одного.
Как из %%j выбрать нужную строку?

Iska 07-04-2017 01:55 2726947

Откуда ж нам знать, по каким критериям Вы выбираете потребный. Озвучьте.

neth1 07-04-2017 06:28 2726965

Можно по названию сетевого подключения или просто первый, второй или третий шлюз. Они всегда выдаются в одном порядке.
Конечно лучше по названию сетевого подключения.

alpap 07-04-2017 15:49 2727152

Цитата:

Цитата neth1
по названию сетевого подключения или просто первый »

Код:

@echo off
set "na1="
for /f "tokens=2 delims==" %%a in ('wmic path Win32_networkadapter where ^(NetConnectionStatus^="2"^) get NetConnectionID /value^|find "="') do (
 set "na=%%a"
 if not defined na1 set "na1=%%a"
)
echo Первое имя сетевого подключения    - %na1%
echo Последнее имя сетевого подключения - %na%
pause>nul

надеюсь разберетесь как подставить в поиск парсера

И да, это если все всегда включено и подключено каждый раз идентично, если нет, понятно что имя первого займет другое, если сегодня первый отдыхает.

neth1 07-04-2017 22:42 2727316

Проблема не в том, чтобы спарсить сетевые подключения, а в том чтобы поставить нужное в поиск парсера.
У меня слишком низкий скилл, знаю что хочу сделать, но не вижу реализацию:(

alpap 08-04-2017 01:18 2727373

Если поизвращаться с парсингом ipconfig /all, то вывести нужный шлюз, например первого подключенного адаптера можно так:
Код:

@echo off
set "na="& set "shl="
for /f "tokens=2 delims==" %%a in ('wmic path Win32_networkadapter where ^(NetConnectionStatus^="2"^) get NetConnectionID /value^|find "="') do if not defined na set "na=%%a"
for /f "delims=[]" %%a in ('ipconfig /all^|find /n "%na%"') do set "ns=%%a"
for /f "tokens=2 delims=:" %%a in ('ipconfig /all^|more +%ns%^|find "Основной шлюз"') do if not defined shl set "shl=%%a"
echo %shl: =%
pause


alpap 08-04-2017 01:33 2727375

Конечно так было бы повеселее, но видимо на вашей системе netsh не работает
Код:

@echo off
for /f "tokens=2 delims=:" %%a in ('netsh interface ip show addresses name^="Имя подключения"^|find "Основной шлюз"') do set "shl=%%a"
echo %shl: =%
pause


neth1 08-04-2017 07:17 2727389

На моей системе первый вариант также не работает:
Код:

Не удается получить доступ к файлу C:\Documents and Settings\comp_name\+
Почему может не работать netsh?
Он есть.
Код:

netsh>help

Применимы следующие команды:

Команды в этом контексте:
..            - Переход на один контекстный уровень вверх.
?              - Отображение списка команд.
abort          - Отмена изменений, сделанных в автономном режиме.
add            - Добавление элемента конфигурации в список элементов.
alias          - Добавление псевдонима.
bridge        - Изменения в контексте 'netsh bridge'.
bye            - Выход из программы.
commit        - Применение изменений, сделанных в автономном режиме.
delete        - Удаление элемента конфигурации из списка элементов.
diag          - Изменения в контексте 'netsh diag'.
dump          - Отображение сценария конфигурации.
exec          - Запуск файла сценария.
exit          - Выход из программы.
firewall      - Изменения в контексте 'netsh firewall'.
help          - Отображение списка команд.
interface      - Изменения в контексте 'netsh interface'.
lan            - Изменения в контексте 'netsh lan'.
nap            - Изменения в контексте 'netsh nap'.
offline        - Переход в автономный режим.
online        - Переход в оперативный режим.
popd          - Получение контекста из стека.
pushd          - Помещение текущего контекста в стек.
quit          - Выход из программы.
ras            - Изменения в контексте 'netsh ras'.
routing        - Изменения в контексте 'netsh routing'.
set            - Обновление параметров конфигурации.
show          - Отображение информации.
unalias        - Удаление псевдонима.
winsock        - Изменения в контексте 'netsh winsock'.

Доступны следующие дочерние контексты:
 bridge diag firewall interface lan nap ras routing winsock

Цитата:

Цитата alpap
Конечно так было бы повеселее, но видимо на вашей системе netsh не работает
Код: Выделить весь код
@echo off
for /f "tokens=2 delims=:" %%a in ('netsh interface ip show addresses name^="Имя подключения"^|find "Основной шлюз"') do set "shl=%%a"
echo %shl: =%
pause »

Это отрабатывает, но "shl" пустая.

alpap 08-04-2017 17:56 2727495

Цитата:

Цитата neth1
Имя подключения »

Во-первых сюда написать имя, например: "Подключение по локальной сети", или какое там у вас
Во-вторых, значения шлюза может и не быть на определенном адаптере

наберите в командной строке: ipconfig /all>"C:\file.txt" и посмотрите какие имена сетевых подключений, у кого есть Основной шлюз и какой у кого нет, скопируйте имя подключения для которого надо выводить значение шлюза, если оно есть как таковое, конечно

код сохраняйте в кодировке 866!

neth1 08-04-2017 19:48 2727513

Цитата:

Цитата alpap
Во-первых сюда написать имя, например: "Подключение по локальной сети", или какое там у вас
Во-вторых, значения шлюза может и не быть на определенном адаптере
наберите в командной строке: ipconfig /all>"C:\file.txt" и посмотрите какие имена сетевых подключений, у кого есть Основной шлюз и какой у кого нет, скопируйте имя подключения для которого надо выводить значение шлюза, если оно есть как таковое, конечно
код сохраняйте в кодировке 866! »

Именно так все и делал.
Код:

C:\test.bat
 =
Для продолжения нажмите любую клавишу . . .


alpap 09-04-2017 01:12 2727548

Цитата:

Цитата neth1
Именно так все и делал »

Давайте чтобы я не ругался, показывать то что вы делали

1. Вывод этого: ipconfig /all>"C:\file.txt" (можете затереть цифры значений или изменить)
2. этот код
Код:

@echo on
for /f "tokens=2 delims=:" %%a in ('netsh interface ip show addresses name^="Имя подключения"^|find "Основной шлюз"') do set "shl=%%a"
echo %shl: =%
pause

где вместо Имя подключения стоит именно то что у вас, вернее именно тот код как есть который вы запускаете
3. скриншот окна cmd после запуска

neth1 09-04-2017 19:31 2727771

Код:

for /F "tokens=2 delims=:" %a in ('netsh inte
rface ip show addresses name="Подключение по локальной сети"|find "Основной шлюз
"') do set "shl=%a"

C:\Documents and Settings\COMP_NAME>echo  =
 =

C:\Documents and Settings\COMP_NAME>pause
Для продолжения нажмите любую клавишу . . .

Код:

Настройка протокола IP для Windows



        Имя компьютера  . . . . . . . . . : name

        Основной DNS-суффикс  . . . . . . :

        Тип узла. . . . . . . . . . . . . : неизвестный

        IP-маршрутизация включена . . . . : нет

        WINS-прокси включен . . . . . . . : нет



Подключение по локальной сети - Ethernet адаптер:



        DNS-суффикс этого подключения . . :

        Описание  . . . . . . . . . . . . : TAP-Win32 Adapter V9

        Физический адрес. . . . . . . . . : здесь_мак

        Dhcp включен. . . . . . . . . . . : да

        Автонастройка включена  . . . . . : да

        IP-адрес  . . . . . . . . . . . . : здесь_ип

        Маска подсети . . . . . . . . . . : здесь_маска_подсети

        Основной шлюз . . . . . . . . . . : здесь_основной_шлюз

        DHCP-сервер . . . . . . . . . . . : здесь_DHCP-сервер

        DNS-серверы . . . . . . . . . . . : здесь_DNS-серверы

        NetBIOS через TCP/IP. . . . . . . : отключен

        Аренда получена . . . . . . . . . : 9 апреля 2017 г. 16:11:48

        Аренда истекает . . . . . . . . . : 9 апреля 2018 г. 16:11:48



Подключение по локальной сети 7 - Ethernet адаптер:



        DNS-суффикс этого подключения . . :

        Описание  . . . . . . . . . . . . : LAN

        Физический адрес. . . . . . . . . : здесь_мак

        Dhcp включен. . . . . . . . . . . : да

        Автонастройка включена  . . . . . : да

        IP-адрес  . . . . . . . . . . . . : здесь_ип

        Маска подсети . . . . . . . . . . : здесь_маска_подсети

        Основной шлюз . . . . . . . . . . : здесь_основной_шлюз

        DHCP-сервер . . . . . . . . . . . : здесь_DHCP-сервер

        DNS-серверы . . . . . . . . . . . : здесь_DNS-серверы

        NetBIOS через TCP/IP. . . . . . . : отключен

        Аренда получена . . . . . . . . . : 9 апреля 2017 г. 16:11:48

        Аренда истекает . . . . . . . . . : 10 апреля 2017 г. 16:11:48


NickM 09-04-2017 20:55 2727798

так ведь у ТС WinXp, а там с netsh не все так хорошо...

alpap 10-04-2017 01:28 2727863

neth1, код точно сохранен в кодировке 866? Также код из п15 должен работать в кодировке 866.
а каков вывод команды: netsh interface ip show addresses name="Подключение по локальной сети"

neth1 10-04-2017 11:51 2727927

Кодировка 866.
Команда interface ip show addresses "name=Подключение по локальной сети" не найд
ена.
Странно, что это не работает. "show addresses" присутствует в help'е к netsh. Другие show отрабатывают нормально.

alpap 10-04-2017 15:56 2728020

ну, а это? Там без netsh, wmic идет в поставке XP, если не почикано
Цитата:

Цитата alpap
Также код из п15 должен работать в кодировке 866 »

Цитата:

Цитата neth1
Команда interface »

кстати так здесь, записано или именно так и запускалась, если да, пропущено netsh вначале строки

neth1 10-04-2017 22:10 2728124

Запускалось именно
Код:

netsh interface ip show addresses name="Подключение по локальной сети"
Ошибка
Код:

Команда interface ip show addresses "name=Подключение по локальной сети" не найд
ена.

Запускал в консоли netsh и делал пошагово:
Код:

netsh>interface>ip>show addresses name="Подключение по локальной сети"
Результат не изменился.
Код:

netsh interface ip>show config name="Подключение по локальной сети"
работает.
Код:

@echo off
set "na="& set "shl="
for /f "tokens=2 delims==" %%a in ('wmic path Win32_networkadapter where ^(NetConnectionStatus^="2"^) get NetConnectionID /value^|find "="') do if not defined na set "na=%%a"
for /f "delims=[]" %%a in ('ipconfig /all^|find /n "%na%"') do set "ns=%%a"
for /f "tokens=2 delims=:" %%a in ('ipconfig /all^|more +%ns%^|find "Основной шлюз"') do if not defined shl set "shl=%%a"
echo %shl: =%
pause

Не работает
Код:

Не удается получить доступ к файлу C:\Documents and Settings\comp_name\+

alpap 11-04-2017 01:53 2728189

эта команда выдает список адаптеров?
Код:

wmic path Win32_networkadapter get name

alpap 11-04-2017 11:08 2728271

иначе в вашем случае только так, без выбора, сугубо по имени и разбирая ipconfig:
Код:

@echo off
set "na=Подключение по локальной сети"
set "shl="
for /f "delims=[]" %%a in ('ipconfig /all^|find /n "%na%"') do set "ns=%%a"
for /f "tokens=2 delims=:" %%a in ('ipconfig /all^|more +%ns%^|find "Основной шлюз"') do if not defined shl set "shl=%%a"
echo %shl: =%
pause

не забываем - кодировка 866!

neth1 11-04-2017 11:34 2728281

Цитата:

Цитата alpap
Код:

wmic path Win32_networkadapter get name
»

Выдает. Все адаптеры, включая отключенные.
Цитата:

Цитата alpap
Код:

@echo off set "na=Подключение по локальной сети" set "shl=" for /f "delims=[]" %%a in ('ipconfig /all^|find /n "%na%"') do set "ns=%%a" for /f "tokens=2 delims=:" %%a in ('ipconfig /all^|more +%ns%^|find "Основной шлюз"') do if not defined shl set "shl=%%a" echo %shl: =% pause
»

Код:

Не удается получить доступ к файлу C:\Documents and Settings\comp_name\+
 =
Для продолжения нажмите любую клавишу . . .


alpap 11-04-2017 12:03 2728295

neth1,
покажите скриншот окна после выполнения кода:
Код:

@echo on
set "na=Подключение по локальной сети"
set "shl="
for /f "delims=[]" %%a in ('ipconfig /all^|find /n "%na%"') do set "ns=%%a"
for /f "tokens=2 delims=:" %%a in ('ipconfig /all^|more +%ns%^|find "Основной шлюз"') do if not defined shl set "shl=%%a"
echo %shl: =%
pause

и скриншот этого же кода, записанного в bat файл в открытом виде файла, естественно

neth1 11-04-2017 20:00 2728402

Все, я понял. Не стоило использовать notepad++.
Не знаю, что с ним не так. Если редактировать в блокноте, работает.

alpap 12-04-2017 00:10 2728472

neth1,
чего, notepad++ неплохой редактор, но я лично пользуюсь AkelPad и кстати не только для удобства в настройках надо выставить перенос по строкам, возможно и к notepad++ это относится, ну и нужных плагинов включить для удобства, например подсветка кода в AkelPad мне очень нравиться, причем можно самому допилить что я успешно и сделал.

mwz 12-04-2017 00:41 2728476

Цитата:

Цитата alpap
не только для удобства в настройках »

В нём и сохранять в разных кодировках можно (например, в 866, как нужно здесь).

neth1 12-04-2017 00:59 2728478

Я не знаю в чем проблема с notepad++. Сохранял в 866.
Теперь проблема с использованием полученного адреса шлюза.
Как записать %shl: =% в "route add"?
Безрезультатно погуглил и поэксперементировал с кавычками, все время выдает "неверный адрес шлюза".

alpap 12-04-2017 03:46 2728485

Цитата:

Цитата neth1
Как записать %shl: =% в "route add" »

в "route add" это куда, вы хоть поясняйте прозрачно, вставить в какой-то код?
Цитата:

Цитата neth1
"неверный адрес шлюза" »

а в каком случае верный? Если ручками прописывать - не ругается?

neth1 12-04-2017 06:52 2728496

Вот так вырисовывается:
Код:

@echo off
set "na=openvpn"
set "shl="
for /f "delims=[]" %%a in ('ipconfig /all^|find /n "%na%"') do set "ns=%%a"
for /f "tokens=2 delims=:" %%a in ('ipconfig /all^|more +%ns%^|find "Основной шлюз"') do if not defined shl set "shl=%%a"
echo %shl: =%
set "na=ethernet"
set "shl="
for /f "delims=[]" %%b in ('ipconfig /all^|find /n "%nb%"') do set "ns=%%b"
for /f "tokens=2 delims=:" %%b in ('ipconfig /all^|more +%ns%^|find "Основной шлюз"') do if not defined shl set "shb=%%b"
echo %shb: =%
route delete 0.0.0.0 mask 0.0.0.0
route add -p %shb: =% mask 255.255.255.255 %shl: =%
route add 0.0.0.0 mask 0.0.0.0 %shl: =%
pause

Если адреса шлюзов вводить ручками, все работает.

mwz 12-04-2017 10:18 2728543

Цитата:

Цитата neth1
set "na=openvpn"
set "shl=" »

Код:

REM Присвоить переменной na значение openvpn
set na=openvpn
REM Сбросить (удалить) переменную shl
set shl=

(без кавычек; после знака равенства — ничего).

Цитата:

Цитата neth1
echo %shb: =%
..
route add -p %shb: =% mask 255.255.255.255 %shl: =%»

Код:

REM Вывести переменную shb с её значением
REM (после имени переменной — ничего)
set shb
REM Но можно и в форме
REM echo %shb%
REM — т.е. только её значение
REM
REM Добавить постоянный маршрут с использованием значений двух переменных
route add -p %shb% mask 255.255.255.255 %shl%

Ну и ещё есть минимум одна строка с неправильной (тот же принцип) работой с переменными.

Iska 12-04-2017 10:33 2728552

mwz, а что не так с кавычками в set?

mwz 12-04-2017 10:53 2728559

Цитата:

Цитата Iska
а что не так с кавычками в set? »

Да вроде не по феншую... И при команде "Help set" в Win-7 не показывает возможности использования кавычек — т.е. не документировано.
Но может и отстал от жизни.

PS
А, увидел:

При использовании любых логических или двоичных операторов необходимо
заключить строку выражения в кавычки. Любые нечисловые строки в выражении
рассматриваются как имена переменных среды, значения которых преобразуются
в числовой вид перед использованием. Если переменная с указанным именем
не определена в системе, вместо нее подставляется нулевое значение
.

neth1 12-04-2017 13:07 2728600

Рабочий вариант скрипта:
Код:

set na=openvpn
set shl=
for /f "delims=[]" %%a in ('ipconfig /all^|find /n "%na%"') do set "ns=%%a"
for /f "tokens=2 delims=:" %%a in ('ipconfig /all^|more +%ns%^|find "Основной шлюз"') do if not defined shl set "shl=%%a"
echo %shl: =%
set na=ethernet
set vhb=
for /f "delims=[]" %%b in ('ipconfig /all^|find /n "%nb%"') do set "nv=%%b"
for /f "tokens=2 delims=:" %%b in ('ipconfig /all^|more +%nv%^|find "Основной шлюз"') do if not defined shl set "vhb=%%b"
echo %vhb: =%
route delete 0.0.0.0 mask 0.0.0.0
route add -p %vhb% mask 255.255.255.255 %shl%
route add 0.0.0.0 mask 0.0.0.0 %shl%
pause

Траффик не будет идти напрямую в случае дисконнекта openvpn.
Спасибо всем за помощь.

alpap 12-04-2017 14:01 2728616

Цитата:

Цитата neth1
вариант скрипта: »

можно тогда и покороче:
Код:

@echo off
setlocal enabledelayedexpansion
set "s=Основной шлюз"
set "na1=openvpn"& set "na2=ethernet"
for %%A in ("%na1%" "%na2%") do (
 set /a n+=1& set "shl!n!="
 for /f "delims=[]" %%a in ('ipconfig /all^|find /n "%%~A"') do set "ns=%%a"
 for /f "tokens=2 delims=:" %%a in ('ipconfig /all^|more +!ns!^|find "%s%"') do if not defined shl!n! set "shl!n!=%%a"
)
echo %shl1: =% %shl2: =%
pause>nul



Время: 12:51.

Время: 12:51.
© OSzone.net 2001-