Войти

Показать полную графическую версию : Автоматическая подмена HOSTS


Skylear
29-03-2016, 19:01
Всем привет, помогите написать батник.
Задача:

На ПК есть подключение к RDWEB по динамическому DNS типа https://mydns.server/rdweb, где mydns.server - динднс имя забитое в роутере на стороне сервера.
Сервер называется srv.
Так как ip-адрес от провайдера выдается временный, то собственно нужно сопоставить адрес сервера и его имя на стороне ПК. (82.209.69.64 srv)

Нужен батник, который пользователь будет запускать перед началом сессии. Батник должен пинговать mydns.server, на пинг отвечает выданный провайдером адрес 82.209.69.64, далее батник записывает в файл hosts сопоставление 82.209.69.64 srv. И пользователь подключается к сессии. Потом после изменения ip-адреса процедура повторяется и hosts переписывается.

mwz
29-03-2016, 23:26
Skylear, а без этих ухищрений, просто по доменному имени, нельзя? Ведь это сопоставление и так уже сделано, с помощью Dyndns.

Skylear
30-03-2016, 20:49
нет, к сожалению нельзя, потому что внутри сессии RDWEB доступ к удаленным приложениям НЕ осуществляется по доменному имени, а по NET-bios имени самого сервера. Не буду объяснять подробно как работает все это, ибо это не в тему))) Но нужно сопоставить динамический адрес с именем сервера в файле hosts, путем узнавания его из пинга dyndns-имени

mwz
31-03-2016, 02:06
потому что внутри сессии »

У меня было такое смутное предположение — и на всякий случай уточнил.

Пока только алгоритм cmd-файла, приближенный к боевому:

1. IP вычленяется достаточно легко: для любой языковой версии операционки команда
ping yandex.ru | find "[" > %TEMP%\IP_line.txt
создаёт во временном каталоге пользователя файл IP_line.txt с единственной строкой, где нужный IP (в примере — Яндекса) заключён в квадратные скобки.

2. Вычленяем из скобок этот IP и создаём файл (например, %TEMP%\srv_IP.txt) со строкой
<Вычлененный адрес> srv

Файл %TEMP%\IP_line.txt оставлем для последующих проверок на тему "не изменился ли IP".

3. Проверяем файл hosts на наличие строки с окончанием "<пробел> srv" и при её наличии удаляем эту строку. Проверяем, что последняя строка файла hosts пустая (как это должно быть; она может быть непустой в случае если, например, файл правили руками и не нажали Enter после ввода последней строки); если нет — создаём в конце пустую строку (нужно для следующего шага). Сохраняем файл (при этом нужны права Администратора).

4. Дописываем (опять же с правами администратора) файл srv_IP.txt к файлу hosts:
copy /b %windir%\System32\drivers\etc\hosts+%TEMP%\srv_IP.txt %windir%\System32\drivers\etc\hosts
4.1 По правилам хорошего тона (операция необязательная) стандартно удаляем файл %TEMP%\srv_IP.txt.

5. На всякий случай очищаем кэш DNS:
ipconfig /flushdns

и начинаем работать.

Итого — шаги 1, 4 и 5 уже готовы в кодах практически полностью, осталось детализировать шаги 2 и 3.
Но тут надо покумекать (хотя для тех, кто часто работает с батниками, это труда не составило бы).

Опиум
01-04-2016, 11:23
доступ к удаленным приложениям НЕ осуществляется по доменному имени, а по NET-bios имени самого сервера »
может тогда речь о lmhosts ?

mwz
02-04-2016, 00:39
может тогда речь о lmhosts ? »

Похоже что так...

Skylear, Вариант батника без проверки на наличие уже имеющейся строки сопоставления IP и имени сервера.
@echo off
Setlocal EnableDelayedExpansion

REM Задаём имя сервера (впишите своё) и его Netbios имя:
Set Server_name=yandex.ru
Set Netbios_name=srv

REM Определяем промежуточные файлы
Set Src=%TEMP%\IP_line.txt
Set Dest=%TEMP%\srv_IP.txt
if exist "%Dest%" del /f "%Dest%"

REM Пингуем сервер по имени и записываем строку с [IP] в %Src%
ping %Server_name% | find "[" > %Src%
REM Если сервер не найден (пинг не проходит) — разбирайтесь, что делать; здесь стоит заглушка:
if errorlevel 1 echo Server not found! & Pause & Goto :eof

REM Извлечение IP
REM Разбираем только часть строки, не включающую символы начиная с закрывающей квадратной скобки после IP:

for /f "UseBackQ Delims=]" %%A in ("%Src%") do (
Set /A n=-1
Set /A Lenght=-1
Call :TrimBeg "%%~A"
)

REM Удаление строки с srv из lmhosts при её наличии — не написано:
REM Если записей должна быть не одна, а остальные фиксированы, то проще иметь в той же папке шаблон файла без этой строки, с именем, например, lmhosts.0.
REM Если запись должна быть единственная — можно в качестве шаблона использовать имеющийся в папке шаблон lmhosts.sam

REM Дописываем lmhosts.0 и сохраняем как lmhosts
copy /b %windir%\System32\drivers\etc\lmhosts.0+%Dest% %windir%\System32\drivers\etc\lmhosts

REM удаляем второй промежуточный файд
if exist "%Dest%" del /f "%Dest%"
REM Чистим кэш DNS
ipconfig /flushdns

REM Завершаем работу файла
Goto :eof

REM Поиск IP в промежуточном файле

:TrimBeg %1-String.Line
Set /A n+=1
Set /A Lenght+=1
Set "L=%~1"
Set "L=!L:~%n%,1!"
REM Когда добрались до открывающей квадратной скобки - начинаем считать оставшуюся длину, т.е. длину записи IP
if "%L%"=="[" (set /A Lenght=-1)
REM Если очередного символа уже нет, записываем извлечённый IP, т.е. последние %Lenght% символов разбиравшейся части
if not defined L (Call :WriteIP %1& Exit /B)
Goto :TrimBeg "%~1"

:WriteIP
REM Создание файла %Dest% для последующего дописывания в lmosts
Set "IP=%~1"
Set "IP=!IP:~-%Lenght%!"
echo %IP% %Netbios_name%>%Dest%
Exit /B

Напомню, что для возможности записи в каталог %windir% и его подкаталоги командный файл надо запускать с правами администратора.

Skylear
03-04-2016, 22:49
попробую данный скрипт, я так понял он не стирает имеющиеся записи сопоставления в файле...? и в принципе так даже не плохо, так как динамический адрес выдается провайдером из пула (хз может 100 адресов), и со временем уже можно будет не запускать батник.

попробую, отпишусь.

mwz
04-04-2016, 00:01
я так понял он не стирает имеющиеся записи сопоставления в файле...? »

Не стирает (не разобрался, как проанализировать файл и удалить строку, оканчивающуюся на "[пробел] srv" средствами командного процессора). Почему и предложил использовать шаблон, содержащий при необходимости неизменяемую часть, и в котором запись об srv при этом отсутствует изначально.

Опиум
04-04-2016, 10:50
Похоже что так... »
в lmhost есть возможность оформления деректив импорта.
ну и не забываем
nbtstat -R

Skylear
06-04-2016, 19:36
по данному скрипту, нормально пингует, узнает адрес и записывает в файл в папке темп, но в нем отображаются кракозябры, за исключением латиницы и цифр.... и hosts не записывается? пробовал разные кодировки батника

mwz
06-04-2016, 21:13
но в нем отображаются кракозябры »

Смотреть надо в кодировке 866, а не 1251: результат именно в ней. Да и сохранять командный файл в той же кодировке — особенно при наличии кириллицы в именах (ведь то, что при выполнении файла в кракозябрах будут комментарии — это несущественно, просто неудобно; а вот с именами это принципиально). Тяжкое наследие MS DOS...

и hosts не записывается? »

Записываться должен lmhosts, как уже сказали (и как я и ввёл в вариант командного файла). Поскольку вы сами сказали, что доступ должен быть по NetBIOS-имени, а не по URL (в hosts же прописывается соответствие URL и IP — а это соответствие уже подставлено сервером вашего динамического DNS без участия hosts; чем и был вызван мой самый первый вопрос).

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

PS
В Блокноте нет возможности сохранения файла в кодировке 866 (она же — русская OEM-кодировка). Я использую более продвинутый бесплатный Akelpad, в котором возможность выбора кодировки при сохранении есть.

Skylear
07-04-2016, 11:56
про кодировку понял 866 akelpadom смотрится. в lmgosts тоже нет ничего. и про права тоже понял, все делал с правами админа и без UAC

если я руками прописываю в файле hosts сопоставление
srv 82.209.22.23
а 82.209.22.23 привязан к доменному имени типа srvsrv.noip.com

то все работает, пингуя srv отвечает внешний ip, как раз это мне и нужно.

mwz
07-04-2016, 14:54
и без UAC »
http://www.outsidethebox.ms/10034/

в lmgosts тоже нет ничего »

Сделайте отладку скрипта: поставьте перед своим аналогом моей строки REM Дописываем lmhosts.0 и сохраняем как lmhosts
команду echo on и далее после каждой команды (после строк с REM не надо) команду pause
И посмотрите по сообщениям в окне, нажимая каждый раз Enter для перехода к следующей команде, где происходит затык и в чём он заключается.
Можете привести скриншот окна с этой частью.

Опиум
07-04-2016, 15:09
Почему бы в lmhost не прописать директивы импорта файла, который может быть от редактирован под юзером?
курить дерективу #INCLUDE

#INCLUDE \\this_comp\share\newlmhosts #adds LMHOSTS from this server




© OSzone.net 2001-2012