Показать полную графическую версию : Проверка строки на соответствие правил именования DNS
Может, есть у кого готовый скрипт?
Есть строка вида 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!"
}
Точный критерий и несколько примеров правильных имён приведите. »
^([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)
Точный критерий и несколько примеров правильных имён приведите. »
Допустимы англ. буквы, точка, тире, цифры.
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!"
}
Тогда так: »
А на vbs можно? Ибо будет работать на win server 2003.
DJ Mogarych
29-11-2019, 11:04
Я не умею на VBS, тем более, что на Win2003 Powershell имеется.
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?
там уже есть гигантский скрипт на vbs, надо мне будет этот кусок туда внедрить.
Iska, Вы не поможете переделать сабж в vbs? »
Покажите полный код Вашего скрипта (или файл скрипта, упаковав его в архив). Укажите в нём место, куда Вы планируете внедрять «этот кусок».
Покажите полный код Вашего скрипта »
А в личку или куда еще можно? Я бы не хотел его тут светить.
И, кстати,зачем?
И, кстати,зачем? »
Затем:
готовый скрипт? »
Не должно быть более 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
Спасибо.
И всё-таки: точка-дефис или дефис-точка или подобные сочетания недопустимы.
Да,я хочу отсечь национальные домены, ибо DNS внутренний, а не интернетный.
И всё-таки: точка-дефис или дефис-точка или подобные сочетания недопустимы. »
Первое и второе недопустимы. Разве я сказал что-то другое?!
ибо DNS внутренний, а не интернетный. »
А какая разница? Пространство имён одинаково для всех. Реализации локальных серверов могут отличаться в ту или иную степень упоротости, хотите упарываться вослед — делайте, кто ж запретит.
Первое и второе недопустимы. »
Вроде бы, не совсем так:
<#
[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("$_"))}
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
Как можно увидеть, дефис ни в начале октета, ни в конце октета наличествовать не может. В начале октета может быть только буква, в конце октета — только буква или цифра.
Iska, октет тут наверное не при чём
glukin, сделайте простую проверку, какую сможете
а более строго проверит уже то ПО, которое будет эти данные использовать
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, октет тут наверное не при чём »
Да, попутал термины.
что "--" тоже недопустимо. »
Я же писал, с точки зрения 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
я исходил из RFC 1034 - Domain names - concepts and facilities: »
Да, возможно, спорить не буду.
Просто, есть подозрение, что RFC датированный 1987 годом, наверное несколько устарел, к тому же, не думаю, что микрософт выпускает софт противоречащий неким стандартам доменных имен. Искать стандарты просто лень, но есть ссылка (https://docs.microsoft.com/ru-ru/dotnet/api/system.uri.checkhostname?view=netframework-4.8) на документацию от микрософт.
Iska, Ну, дабы не усложнять регулярку, сделайте две проверки »
Спасибо, вроде все как мне нужно работает! Тему можно закрывать.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.