PDA

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


Страниц : [1] 2

glukin
28-11-2019, 14:40
Может, есть у кого готовый скрипт?
Есть строка вида device.domain.zone.
Необходимо её проверить на соответствие правилам именования DNS, то есть: англ. буквы, точка, тире, цифры, если что-то не так - выдать error. Как проверить - я примерно понимаю с помощью RegExp, но как проверить, чтобы в строке не было, допустим, 2-3-много точки подряд? 2-3 тире?

DJ Mogarych
28-11-2019, 16:44
соответствие правилам именования DNS, то есть: англ. буквы, точка, тире, цифры »
Точный критерий и несколько примеров правильных имён приведите.

Пока примерно так (powershell):

$dnsname = 'device.domain.zone.'

if ($dnsname -notmatch "^([A-Za-z0-9-]+\.){3}$" -or $dnsname -match "--") {
write-host -fore red "error!"
}

Iska
28-11-2019, 17:46
Точный критерий и несколько примеров правильных имён приведите. »
^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*$
Это без учёта максимальной длины в 255 символов и возможности указания корневой зоны в конце абсолютного доменного имени (в виде точки).

RFC 1034 - Domain names - concepts and facilities (https://tools.ietf.org/html/rfc1034)
RFC 1035 - Domain names - implementation and specification (https://tools.ietf.org/html/rfc1035)

glukin
28-11-2019, 20:04
Точный критерий и несколько примеров правильных имён приведите. »
Допустимы англ. буквы, точка, тире, цифры.

Device1.domain1.ru
device-2.domain.1.ru3
45-deVice.3.domain-4.5ru

Не должно быть более 1 точки или 1 тире подряд. Точка-тире или тире-точка или подобные сочетания недопустимы. На конце или в начале не может быть точек или тире.

DJ Mogarych
29-11-2019, 08:53
Тогда так:

if ($dnsname -notmatch "^([A-Za-z0-9-]+\.){2}[A-Za-z0-9-]+$" -or $dnsname -match "--|\.-|-\.|^[\.-]|[\.-]$") {
write-host -fore red "error!"
}

glukin
29-11-2019, 10:40
Тогда так: »
А на vbs можно? Ибо будет работать на win server 2003.

DJ Mogarych
29-11-2019, 11:04
Я не умею на VBS, тем более, что на Win2003 Powershell имеется.

glukin
29-11-2019, 12:26
Win2003 Powershell имеется. »
Да не в этом дело, там уже есть гигантский скрипт на vbs, надо мне будет этот кусок туда внедрить.
Iska, Вы не поможете переделать сабж в vbs?

А если я сделаю так:
objShell.Run("powershell.exe -noexit -Command ""if ($dnsname -notmatch "^([A-Za-z0-9-]+\.){2}[A-Za-z0-9-]+$" -or $dnsname -match "--|\.-|-\.|^[\.-]|[\.-]$") {
write-host -fore red "error!"
}""")

то как сделать, чтобы вернуть в vbs-скрипт "error", если в результате команды powershell будет "error"? И как передать в powershell переменную dnsname?

Iska
29-11-2019, 22:16
там уже есть гигантский скрипт на vbs, надо мне будет этот кусок туда внедрить.
Iska, Вы не поможете переделать сабж в vbs? »
Покажите полный код Вашего скрипта (или файл скрипта, упаковав его в архив). Укажите в нём место, куда Вы планируете внедрять «этот кусок».

glukin
29-11-2019, 22:56
Покажите полный код Вашего скрипта »

А в личку или куда еще можно? Я бы не хотел его тут светить.
И, кстати,зачем?

Iska
30-11-2019, 09:52
И, кстати,зачем? »
Затем:
готовый скрипт? »


Не должно быть более 1 точки или 1 тире подряд. Точка-тире или тире-точка или подобные сочетания недопустимы. »
Точек подряд быть не может — это разделитель. Тире Дефис — может. Вы же не хотите отсечь национальные домены, в том числе такой домен, как, например, президент.рф :lol:?

Пример с шаблоном, найденным мною, и шаблоном коллеги DJ Mogarych:
Option Explicit

Dim arrDNSName
Dim objRegExp

Dim elem


arrDNSName = Array( _
"device.domain.zone", _
"Device1.domain1.ru", _
"device-2.domain.1.ru3", _
"45-deVice.3.domain-4.5ru", _
"45-deVice..domain-4.5ru", _
"45-deVice.3.domain--4.5ru", _
"45-deVice.3.domain-.5ru", _
"45-deVice.3.-domain.5ru", _
"45-deVice.3.domain-4.5ru." _
)

Set objRegExp = WScript.CreateObject("VBScript.RegExp")

objRegExp.IgnoreCase = False
objRegExp.Pattern = "^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*$"

For Each elem In arrDNSName
If objRegExp.Test(elem) Then
WScript.Echo "Match : " & elem
Else
WScript.Echo "Not match: " & elem
End If
Next

WScript.Echo "==============================================="

objRegExp.Pattern = "^([A-Za-z0-9-]+\.){2}[A-Za-z0-9-]+$"

For Each elem In arrDNSName
If objRegExp.Test(elem) Then
WScript.Echo "Match : " & elem
Else
WScript.Echo "Not match: " & elem
End If
Next

Set objRegExp = Nothing

WScript.Quit 0

glukin
30-11-2019, 10:36
Спасибо.
И всё-таки: точка-дефис или дефис-точка или подобные сочетания недопустимы.
Да,я хочу отсечь национальные домены, ибо DNS внутренний, а не интернетный.

Iska
30-11-2019, 20:14
И всё-таки: точка-дефис или дефис-точка или подобные сочетания недопустимы. »
Первое и второе недопустимы. Разве я сказал что-то другое?!

ибо DNS внутренний, а не интернетный. »
А какая разница? Пространство имён одинаково для всех. Реализации локальных серверов могут отличаться в ту или иную степень упоротости, хотите упарываться вослед — делайте, кто ж запретит.

YuS_2
30-11-2019, 21:04
Первое и второе недопустимы. »
Вроде бы, не совсем так:
<#
[enum]::GetNames("UriHostNameType")
Basic 1 узел установлен, однако не удается определить тип.
Dns 2 Имя узла представлено в виде DNS-имени.
IPv4 3 Имя узла представлено в формате IPv4.
IPv6 4 Имя узла представлено в формате IPv6.
Unknown 0 Тип имени узла не поддерживается.
#>

$arr = @(
"device.domain.zone"
"device.domain.zone."
".device.domain.zone"
"Device1.domain1.ru"
"device-2.domain.1.ru3"
"45-deVice.3.domain-4.5ru"
"45-deVice..domain-4.5ru"
"45-deVice.3.domain--4.5ru"
"45-deVice.3.domain-.5ru"
"45-deVice.3.-domain.5ru"
"45-deVice.3.domain-4.5ru."
)
$arr|%{ $_ + ' - ' + ([uri]::CheckHostName("$_"))}

Iska
30-11-2019, 21:52
YuS_2, я исходил из RFC 1034 - Domain names - concepts and facilities (https://tools.ietf.org/html/rfc1034):
<domain> ::= <subdomain> | " "

<subdomain> ::= <label> | <subdomain> "." <label>

<label> ::= <letter> [ [ <ldh-str> ] <let-dig> ]

<ldh-str> ::= <let-dig-hyp> | <let-dig-hyp> <ldh-str>

<let-dig-hyp> ::= <let-dig> | "-"

<let-dig> ::= <letter> | <digit>

<letter> ::= any one of the 52 alphabetic characters A through Z in
upper case and a through z in lower case

<digit> ::= any one of the ten digits 0 through 9
Как можно увидеть, дефис ни в начале октета, ни в конце октета наличествовать не может. В начале октета может быть только буква, в конце октета — только буква или цифра.

Busla
01-12-2019, 00:06
Iska, октет тут наверное не при чём

glukin, сделайте простую проверку, какую сможете
а более строго проверит уже то ПО, которое будет эти данные использовать

glukin
01-12-2019, 00:15
Busla, не, тут смысл сделать проверку именно до ПО, так как оно не стартует с ошибочными dns-записями.

Iska, извините, забыл добавить, что "--" тоже недопустимо.
Вот это вроде работает, но пропускает "--"
^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*$

Iska
01-12-2019, 02:08
Iska, октет тут наверное не при чём »
Да, попутал термины.

что "--" тоже недопустимо. »
Я же писал, с точки зрения RFC — допустимо.

Вот это вроде работает, но пропускает "--" »
Ну, дабы не усложнять регулярку, сделайте две проверки:
Option Explicit

Dim arrDNSName
Dim elem


arrDNSName = Array( _
"device.domain.zone", _
"Device1.domain1.ru", _
"device--2.domain.1.ru3", _
"45-deVice.3.domain-4.5ru", _
"45-deVice..domain-4.5ru", _
"45-deVice.3.domain--4.5ru", _
"45-deVice.3.domain-.5ru", _
"45-deVice.3.-domain.5ru", _
"45-deVice.3.domain-4.5ru." _
)

With WScript.CreateObject("VBScript.RegExp")
.IgnoreCase = False

For Each elem In arrDNSName
.Pattern = "^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*$"

If .Test(elem) Then
.Pattern = "-{2,}"

If Not .Test(elem) Then
WScript.Echo "Match : " & elem
Else
WScript.Echo "Not match: " & elem
End If
Else
WScript.Echo "Not match: " & elem
End If
Next
End With

WScript.Quit 0

YuS_2
01-12-2019, 08:54
я исходил из RFC 1034 - Domain names - concepts and facilities: »
Да, возможно, спорить не буду.
Просто, есть подозрение, что RFC датированный 1987 годом, наверное несколько устарел, к тому же, не думаю, что микрософт выпускает софт противоречащий неким стандартам доменных имен. Искать стандарты просто лень, но есть ссылка (https://docs.microsoft.com/ru-ru/dotnet/api/system.uri.checkhostname?view=netframework-4.8) на документацию от микрософт.

glukin
01-12-2019, 10:50
Iska, Ну, дабы не усложнять регулярку, сделайте две проверки »
Спасибо, вроде все как мне нужно работает! Тему можно закрывать.




© OSzone.net 2001-2012