Показать полную графическую версию : Автоматическая подмена HOSTS
Всем привет, помогите написать батник.
Задача:
На ПК есть подключение к 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 переписывается.
Skylear, а без этих ухищрений, просто по доменному имени, нельзя? Ведь это сопоставление и так уже сделано, с помощью Dyndns.
нет, к сожалению нельзя, потому что внутри сессии RDWEB доступ к удаленным приложениям НЕ осуществляется по доменному имени, а по NET-bios имени самого сервера. Не буду объяснять подробно как работает все это, ибо это не в тему))) Но нужно сопоставить динамический адрес с именем сервера в файле hosts, путем узнавания его из пинга dyndns-имени
потому что внутри сессии »
У меня было такое смутное предположение — и на всякий случай уточнил.
Пока только алгоритм 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.
Но тут надо покумекать (хотя для тех, кто часто работает с батниками, это труда не составило бы).
доступ к удаленным приложениям НЕ осуществляется по доменному имени, а по NET-bios имени самого сервера »
может тогда речь о lmhosts ?
может тогда речь о 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% и его подкаталоги командный файл надо запускать с правами администратора.
попробую данный скрипт, я так понял он не стирает имеющиеся записи сопоставления в файле...? и в принципе так даже не плохо, так как динамический адрес выдается провайдером из пула (хз может 100 адресов), и со временем уже можно будет не запускать батник.
попробую, отпишусь.
я так понял он не стирает имеющиеся записи сопоставления в файле...? »
Не стирает (не разобрался, как проанализировать файл и удалить строку, оканчивающуюся на "[пробел] srv" средствами командного процессора). Почему и предложил использовать шаблон, содержащий при необходимости неизменяемую часть, и в котором запись об srv при этом отсутствует изначально.
Похоже что так... »
в lmhost есть возможность оформления деректив импорта.
ну и не забываем
nbtstat -R
по данному скрипту, нормально пингует, узнает адрес и записывает в файл в папке темп, но в нем отображаются кракозябры, за исключением латиницы и цифр.... и hosts не записывается? пробовал разные кодировки батника
но в нем отображаются кракозябры »
Смотреть надо в кодировке 866, а не 1251: результат именно в ней. Да и сохранять командный файл в той же кодировке — особенно при наличии кириллицы в именах (ведь то, что при выполнении файла в кракозябрах будут комментарии — это несущественно, просто неудобно; а вот с именами это принципиально). Тяжкое наследие MS DOS...
и hosts не записывается? »
Записываться должен lmhosts, как уже сказали (и как я и ввёл в вариант командного файла). Поскольку вы сами сказали, что доступ должен быть по NetBIOS-имени, а не по URL (в hosts же прописывается соответствие URL и IP — а это соответствие уже подставлено сервером вашего динамического DNS без участия hosts; чем и был вызван мой самый первый вопрос).
И в третий раз повторю, что запись в каталог Windows и его подкаталоги получится производить только при условии, что программа, которая это делает, запущена от имени Администратора, т.е. с административными правами.
PS
В Блокноте нет возможности сохранения файла в кодировке 866 (она же — русская OEM-кодировка). Я использую более продвинутый бесплатный Akelpad, в котором возможность выбора кодировки при сохранении есть.
про кодировку понял 866 akelpadom смотрится. в lmgosts тоже нет ничего. и про права тоже понял, все делал с правами админа и без UAC
если я руками прописываю в файле hosts сопоставление
srv 82.209.22.23
а 82.209.22.23 привязан к доменному имени типа srvsrv.noip.com
то все работает, пингуя srv отвечает внешний ip, как раз это мне и нужно.
и без UAC »
http://www.outsidethebox.ms/10034/
в lmgosts тоже нет ничего »
Сделайте отладку скрипта: поставьте перед своим аналогом моей строки REM Дописываем lmhosts.0 и сохраняем как lmhosts
команду echo on и далее после каждой команды (после строк с REM не надо) команду pause
И посмотрите по сообщениям в окне, нажимая каждый раз Enter для перехода к следующей команде, где происходит затык и в чём он заключается.
Можете привести скриншот окна с этой частью.
Почему бы в lmhost не прописать директивы импорта файла, который может быть от редактирован под юзером?
курить дерективу #INCLUDE
#INCLUDE \\this_comp\share\newlmhosts #adds LMHOSTS from this server
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.